gas/
[deliverable/binutils-gdb.git] / gas / config / tc-tic6x.c
1 /* TI C6X assembler.
2 Copyright 2010
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
21
22 #include "as.h"
23 #include "dwarf2dbg.h"
24 #include "safe-ctype.h"
25 #include "subsegs.h"
26 #include "opcode/tic6x.h"
27 #include "elf/tic6x.h"
28 #include "elf32-tic6x.h"
29
30 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit
31 host gives identical results to a 32-bit host. */
32 #define TRUNC(X) ((valueT) (X) & 0xffffffffU)
33 #define SEXT(X) ((TRUNC (X) ^ 0x80000000U) - 0x80000000U)
34
35 const char comment_chars[] = ";";
36 const char line_comment_chars[] = "#*;";
37 const char line_separator_chars[] = "@";
38
39 const char EXP_CHARS[] = "eE";
40 const char FLT_CHARS[] = "dDfF";
41
42 const char *md_shortopts = "";
43
44 enum
45 {
46 OPTION_MARCH = OPTION_MD_BASE,
47 OPTION_MATOMIC,
48 OPTION_MNO_ATOMIC,
49 OPTION_MBIG_ENDIAN,
50 OPTION_MLITTLE_ENDIAN,
51 OPTION_MGENERATE_REL
52 };
53
54 struct option md_longopts[] =
55 {
56 { "march", required_argument, NULL, OPTION_MARCH },
57 { "matomic", no_argument, NULL, OPTION_MATOMIC },
58 { "mno-atomic", no_argument, NULL, OPTION_MNO_ATOMIC },
59 { "mbig-endian", no_argument, NULL, OPTION_MBIG_ENDIAN },
60 { "mlittle-endian", no_argument, NULL, OPTION_MLITTLE_ENDIAN },
61 { "mgenerate-rel", no_argument, NULL, OPTION_MGENERATE_REL },
62 { NULL, no_argument, NULL, 0 }
63 };
64 size_t md_longopts_size = sizeof (md_longopts);
65
66 /* Whether to enable atomic instructions. 1 to enable them, 0 to
67 disable, -1 to default from architecture. */
68 static int tic6x_atomic = -1;
69
70 /* The instructions enabled based only on the selected architecture
71 (all instructions, if no architecture specified). Atomic
72 instructions may be enabled or disabled separately. */
73 static unsigned short tic6x_arch_enable = (TIC6X_INSN_C62X
74 | TIC6X_INSN_C64X
75 | TIC6X_INSN_C64XP
76 | TIC6X_INSN_C67X
77 | TIC6X_INSN_C67XP
78 | TIC6X_INSN_C674X
79 | TIC6X_INSN_ATOMIC);
80
81 /* The instructions enabled based on the current set of features
82 (architecture, as modified by other options). */
83 static unsigned short tic6x_features;
84
85 /* The architecture attribute value, or C6XABI_Tag_CPU_arch_none if
86 not yet set. */
87 static int tic6x_arch_attribute = C6XABI_Tag_CPU_arch_none;
88
89 /* Whether any instructions at all have been seen. Once any
90 instructions have been seen, architecture attributes merge into the
91 previous attribute value rather than replacing it. */
92 static bfd_boolean tic6x_seen_insns = FALSE;
93
94 /* The number of registers in each register file supported by the
95 current architecture. */
96 static unsigned int tic6x_num_registers;
97
98 /* Whether predication on A0 is possible. */
99 static bfd_boolean tic6x_predicate_a0;
100
101 /* Whether execute packets can cross fetch packet boundaries. */
102 static bfd_boolean tic6x_can_cross_fp_boundary;
103
104 /* Whether there are constraints on simultaneous reads and writes of
105 40-bit data. */
106 static bfd_boolean tic6x_long_data_constraints;
107
108 /* Whether compact instructions are available. */
109 static bfd_boolean tic6x_compact_insns;
110
111 /* Whether to generate RELA relocations. */
112 static bfd_boolean tic6x_generate_rela = TRUE;
113
114 /* Table of supported architecture variants. */
115 typedef struct
116 {
117 const char *arch;
118 int attr;
119 unsigned short features;
120 } tic6x_arch_table;
121 static const tic6x_arch_table tic6x_arches[] =
122 {
123 { "c62x", C6XABI_Tag_CPU_arch_C62X, TIC6X_INSN_C62X },
124 { "c64x", C6XABI_Tag_CPU_arch_C64X, TIC6X_INSN_C62X | TIC6X_INSN_C64X },
125 { "c64x+", C6XABI_Tag_CPU_arch_C64XP, (TIC6X_INSN_C62X
126 | TIC6X_INSN_C64X
127 | TIC6X_INSN_C64XP) },
128 { "c67x", C6XABI_Tag_CPU_arch_C67X, TIC6X_INSN_C62X | TIC6X_INSN_C67X },
129 { "c67x+", C6XABI_Tag_CPU_arch_C67XP, (TIC6X_INSN_C62X
130 | TIC6X_INSN_C67X
131 | TIC6X_INSN_C67XP) },
132 { "c674x", C6XABI_Tag_CPU_arch_C674X, (TIC6X_INSN_C62X
133 | TIC6X_INSN_C64X
134 | TIC6X_INSN_C64XP
135 | TIC6X_INSN_C67X
136 | TIC6X_INSN_C67XP
137 | TIC6X_INSN_C674X) }
138 };
139
140 /* Update the selected architecture based on ARCH, giving an error if
141 ARCH is an invalid value. Does not call tic6x_update_features; the
142 caller must do that if necessary. */
143
144 static void
145 tic6x_use_arch (const char *arch)
146 {
147 unsigned int i;
148
149 for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
150 if (strcmp (arch, tic6x_arches[i].arch) == 0)
151 {
152 tic6x_arch_enable = tic6x_arches[i].features;
153 if (tic6x_seen_insns)
154 tic6x_arch_attribute
155 = elf32_tic6x_merge_arch_attributes (tic6x_arch_attribute,
156 tic6x_arches[i].attr);
157 else
158 tic6x_arch_attribute = tic6x_arches[i].attr;
159 return;
160 }
161
162 as_bad (_("unknown architecture '%s'"), arch);
163 }
164
165 /* Parse a target-specific option. */
166
167 int
168 md_parse_option (int c, char *arg)
169 {
170 switch (c)
171 {
172 case OPTION_MARCH:
173 tic6x_use_arch (arg);
174 break;
175
176 case OPTION_MATOMIC:
177 tic6x_atomic = 1;
178 break;
179
180 case OPTION_MNO_ATOMIC:
181 tic6x_atomic = 0;
182 break;
183
184 case OPTION_MBIG_ENDIAN:
185 target_big_endian = 1;
186 break;
187
188 case OPTION_MLITTLE_ENDIAN:
189 target_big_endian = 0;
190 break;
191
192 case OPTION_MGENERATE_REL:
193 tic6x_generate_rela = FALSE;
194 break;
195
196 default:
197 return 0;
198 }
199 return 1;
200 }
201
202 void
203 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
204 {
205 unsigned int i;
206
207 fputc ('\n', stream);
208 fprintf (stream, _("TMS320C6000 options:\n"));
209 fprintf (stream, _(" -march=ARCH enable instructions from architecture ARCH\n"));
210 fprintf (stream, _(" -matomic enable atomic operation instructions\n"));
211 fprintf (stream, _(" -mno-atomic disable atomic operation instructions\n"));
212 fprintf (stream, _(" -mbig-endian generate big-endian code\n"));
213 fprintf (stream, _(" -mlittle-endian generate little-endian code\n"));
214 /* -mgenerate-rel is only for testsuite use and is deliberately
215 undocumented. */
216
217 fputc ('\n', stream);
218 fprintf (stream, _("Supported ARCH values are:"));
219 for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
220 fprintf (stream, " %s", tic6x_arches[i].arch);
221 fputc ('\n', stream);
222 }
223
224 /* Update enabled features based on the current architecture and
225 related settings. */
226 static void
227 tic6x_update_features (void)
228 {
229 switch (tic6x_atomic)
230 {
231 case -1:
232 tic6x_features = tic6x_arch_enable;
233 break;
234
235 case 0:
236 tic6x_features = tic6x_arch_enable & ~TIC6X_INSN_ATOMIC;
237 break;
238
239 case 1:
240 tic6x_features = tic6x_arch_enable | TIC6X_INSN_ATOMIC;
241 break;
242
243 default:
244 abort ();
245 }
246
247 tic6x_num_registers
248 = (tic6x_arch_enable & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? 32 : 16;
249
250 tic6x_predicate_a0 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? TRUE : FALSE;
251
252 tic6x_can_cross_fp_boundary
253 = (tic6x_arch_enable
254 & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? TRUE : FALSE;
255
256 tic6x_long_data_constraints
257 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? FALSE : TRUE;
258
259 tic6x_compact_insns = (tic6x_arch_enable & TIC6X_INSN_C64XP) ? TRUE : FALSE;
260 }
261
262 /* Do configuration after all options have been parsed. */
263
264 void
265 tic6x_after_parse_args (void)
266 {
267 tic6x_update_features ();
268 }
269
270 /* Parse a .arch directive. */
271
272 static void
273 s_tic6x_arch (int ignored ATTRIBUTE_UNUSED)
274 {
275 char c;
276 char *arch;
277
278 arch = input_line_pointer;
279 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
280 input_line_pointer++;
281 c = *input_line_pointer;
282 *input_line_pointer = 0;
283
284 tic6x_use_arch (arch);
285 tic6x_update_features ();
286 *input_line_pointer = c;
287 demand_empty_rest_of_line ();
288 }
289
290 /* Parse a .atomic directive. */
291
292 static void
293 s_tic6x_atomic (int ignored ATTRIBUTE_UNUSED)
294 {
295 tic6x_atomic = 1;
296 tic6x_update_features ();
297 demand_empty_rest_of_line ();
298 }
299
300 /* Parse a .noatomic directive. */
301
302 static void
303 s_tic6x_noatomic (int ignored ATTRIBUTE_UNUSED)
304 {
305 tic6x_atomic = 0;
306 tic6x_update_features ();
307 demand_empty_rest_of_line ();
308 }
309
310 /* Parse a .nocmp directive. */
311
312 static void
313 s_tic6x_nocmp (int ignored ATTRIBUTE_UNUSED)
314 {
315 seg_info (now_seg)->tc_segment_info_data.nocmp = TRUE;
316 demand_empty_rest_of_line ();
317 }
318
319 /* Track for each attribute whether it has been set explicitly (and so
320 should not have a default value set by the assembler). */
321 static bfd_boolean tic6x_attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
322
323 /* Parse a .c6xabi_attribute directive. */
324
325 static void
326 s_tic6x_c6xabi_attribute (int ignored ATTRIBUTE_UNUSED)
327 {
328 int tag = s_vendor_attribute (OBJ_ATTR_PROC);
329
330 if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
331 tic6x_attributes_set_explicitly[tag] = TRUE;
332 }
333
334 typedef struct
335 {
336 const char *name;
337 int tag;
338 } tic6x_attribute_table;
339
340 static const tic6x_attribute_table tic6x_attributes[] =
341 {
342 #define TAG(tag, value) { #tag, tag }
343 #include "elf/tic6x-attrs.h"
344 #undef TAG
345 };
346
347 /* Convert an attribute name to a number. */
348
349 int
350 tic6x_convert_symbolic_attribute (const char *name)
351 {
352 unsigned int i;
353
354 for (i = 0; i < ARRAY_SIZE (tic6x_attributes); i++)
355 if (strcmp (name, tic6x_attributes[i].name) == 0)
356 return tic6x_attributes[i].tag;
357
358 return -1;
359 }
360
361 const pseudo_typeS md_pseudo_table[] =
362 {
363 { "arch", s_tic6x_arch, 0 },
364 { "atomic", s_tic6x_atomic, 0 },
365 { "c6xabi_attribute", s_tic6x_c6xabi_attribute, 0 },
366 { "noatomic", s_tic6x_noatomic, 0 },
367 { "nocmp", s_tic6x_nocmp, 0 },
368 { "word", cons, 4 },
369 { 0, 0, 0 }
370 };
371
372 /* Hash table of opcodes. For each opcode name, this stores a pointer
373 to a tic6x_opcode_list listing (in an arbitrary order) all opcode
374 table entries with that name. */
375 static struct hash_control *opcode_hash;
376
377 /* Initialize the assembler (called once at assembler startup). */
378
379 void
380 md_begin (void)
381 {
382 tic6x_opcode_id id;
383
384 bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
385
386 /* Insert opcodes into the hash table. */
387 opcode_hash = hash_new ();
388 for (id = 0; id < tic6x_opcode_max; id++)
389 {
390 const char *errmsg;
391 tic6x_opcode_list *opc = xmalloc (sizeof (tic6x_opcode_list));
392
393 opc->id = id;
394 opc->next = hash_find (opcode_hash, tic6x_opcode_table[id].name);
395 if ((errmsg = hash_jam (opcode_hash, tic6x_opcode_table[id].name, opc))
396 != NULL)
397 as_fatal ("%s", _(errmsg));
398 }
399 }
400
401 /* Whether the current line being parsed had the "||" parallel bars. */
402 static bfd_boolean tic6x_line_parallel;
403
404 /* Whether the current line being parsed started "||^" to indicate an
405 SPMASKed parallel instruction. */
406 static bfd_boolean tic6x_line_spmask;
407
408 /* If the current line being parsed had an instruction predicate, the
409 creg value for that predicate (which must be nonzero); otherwise
410 0. */
411 static unsigned int tic6x_line_creg;
412
413 /* If the current line being parsed had an instruction predicate, the
414 z value for that predicate; otherwise 0. */
415 static unsigned int tic6x_line_z;
416
417 /* Return 1 (updating input_line_pointer as appropriate) if the line
418 starting with C (immediately before input_line_pointer) starts with
419 pre-opcode text appropriate for this target, 0 otherwise. */
420
421 int
422 tic6x_unrecognized_line (int c)
423 {
424 char *p, *endp;
425 unsigned int z;
426 bfd_boolean areg;
427 bfd_boolean bad_predicate;
428
429 switch (c)
430 {
431 case '|':
432 if (input_line_pointer[0] == '|')
433 {
434 if (input_line_pointer[1] == '^')
435 {
436 tic6x_line_spmask = TRUE;
437 input_line_pointer += 2;
438 }
439 else
440 input_line_pointer += 1;
441 if (tic6x_line_parallel)
442 as_bad (_("multiple '||' on same line"));
443 tic6x_line_parallel = TRUE;
444 if (tic6x_line_creg)
445 as_bad (_("'||' after predicate"));
446 return 1;
447 }
448 return 0;
449
450 case '[':
451 /* If it doesn't look like a predicate at all, just return 0.
452 If it looks like one but not a valid one, give a better
453 error. */
454 p = input_line_pointer;
455 while (*p != ']' && !is_end_of_line[(unsigned char) *p])
456 p++;
457 if (*p != ']')
458 return 0;
459 endp = p + 1;
460 p = input_line_pointer;
461 z = 0;
462 bad_predicate = FALSE;
463 if (*p == '!')
464 {
465 z = 1;
466 p++;
467 }
468 if (*p == 'A' || *p == 'a')
469 areg = TRUE;
470 else if (*p == 'B' || *p == 'b')
471 areg = FALSE;
472 else
473 {
474 areg = TRUE; /* Avoid uninitialized warning. */
475 bad_predicate = TRUE;
476 }
477 if (!bad_predicate)
478 {
479 p++;
480 if (*p != '0' && *p != '1' && *p != '2')
481 bad_predicate = TRUE;
482 else if (p[1] != ']')
483 bad_predicate = TRUE;
484 else
485 input_line_pointer = p + 2;
486 }
487
488 if (tic6x_line_creg)
489 as_bad (_("multiple predicates on same line"));
490
491 if (bad_predicate)
492 {
493 char ctmp = *endp;
494 *endp = 0;
495 as_bad (_("bad predicate '%s'"), input_line_pointer - 1);
496 *endp = ctmp;
497 input_line_pointer = endp;
498 return 1;
499 }
500
501 switch (*p)
502 {
503 case '0':
504 tic6x_line_creg = (areg ? 6 : 1);
505 if (areg && !tic6x_predicate_a0)
506 as_bad (_("predication on A0 not supported on this architecture"));
507 break;
508
509 case '1':
510 tic6x_line_creg = (areg ? 4 : 2);
511 break;
512
513 case '2':
514 tic6x_line_creg = (areg ? 5 : 3);
515 break;
516
517 default:
518 abort ();
519 }
520
521 tic6x_line_z = z;
522 return 1;
523
524 default:
525 return 0;
526 }
527 }
528
529 /* Do any target-specific handling of a label required. */
530
531 void
532 tic6x_frob_label (symbolS *sym)
533 {
534 segment_info_type *si;
535 tic6x_label_list *list;
536
537 if (tic6x_line_parallel)
538 {
539 as_bad (_("label after '||'"));
540 tic6x_line_parallel = FALSE;
541 tic6x_line_spmask = FALSE;
542 }
543 if (tic6x_line_creg)
544 {
545 as_bad (_("label after predicate"));
546 tic6x_line_creg = 0;
547 tic6x_line_z = 0;
548 }
549
550 si = seg_info (now_seg);
551 list = si->tc_segment_info_data.label_list;
552 si->tc_segment_info_data.label_list = xmalloc (sizeof (tic6x_label_list));
553 si->tc_segment_info_data.label_list->next = list;
554 si->tc_segment_info_data.label_list->label = sym;
555
556 /* Defining tc_frob_label overrides the ELF definition of
557 obj_frob_label, so we need to apply its effects here. */
558 dwarf2_emit_label (sym);
559 }
560
561 /* At end-of-line, give errors for start-of-line decorations that
562 needed an instruction but were not followed by one. */
563
564 static void
565 tic6x_end_of_line (void)
566 {
567 if (tic6x_line_parallel)
568 {
569 as_bad (_("'||' not followed by instruction"));
570 tic6x_line_parallel = FALSE;
571 tic6x_line_spmask = FALSE;
572 }
573 if (tic6x_line_creg)
574 {
575 as_bad (_("predicate not followed by instruction"));
576 tic6x_line_creg = 0;
577 tic6x_line_z = 0;
578 }
579 }
580
581 /* Do any target-specific handling of the start of a logical line. */
582
583 void
584 tic6x_start_line_hook (void)
585 {
586 tic6x_end_of_line ();
587 }
588
589 /* Do target-specific handling immediately after an input file from
590 the command line, and any other inputs it includes, have been
591 read. */
592
593 void
594 tic6x_cleanup (void)
595 {
596 tic6x_end_of_line ();
597 }
598
599 /* Do target-specific initialization after arguments have been
600 processed and the output file created. */
601
602 void
603 tic6x_init_after_args (void)
604 {
605 elf32_tic6x_set_use_rela_p (stdoutput, tic6x_generate_rela);
606 }
607
608 /* Free LIST of labels (possibly NULL). */
609
610 static void
611 tic6x_free_label_list (tic6x_label_list *list)
612 {
613 while (list)
614 {
615 tic6x_label_list *old = list;
616
617 list = list->next;
618 free (old);
619 }
620 }
621
622 /* Handle a data alignment of N bytes. */
623
624 void
625 tic6x_cons_align (int n ATTRIBUTE_UNUSED)
626 {
627 segment_info_type *seginfo = seg_info (now_seg);
628
629 /* Data means there is no current execute packet, and that any label
630 applies to that data rather than a subsequent instruction. */
631 tic6x_free_label_list (seginfo->tc_segment_info_data.label_list);
632 seginfo->tc_segment_info_data.label_list = NULL;
633 seginfo->tc_segment_info_data.execute_packet_frag = NULL;
634 seginfo->tc_segment_info_data.last_insn_lsb = NULL;
635 seginfo->tc_segment_info_data.spmask_addr = NULL;
636 seginfo->tc_segment_info_data.func_units_used = 0;
637 }
638
639 /* Handle an alignment directive. Return TRUE if the
640 machine-independent frag generation should be skipped. */
641
642 bfd_boolean
643 tic6x_do_align (int n, char *fill, int len ATTRIBUTE_UNUSED, int max)
644 {
645 /* Given code alignments of 4, 8, 16 or 32 bytes, we try to handle
646 them in the md_end pass by inserting NOPs in parallel with
647 previous instructions. We only do this in sections containing
648 nothing but instructions. Code alignments of 1 or 2 bytes have
649 no effect in such sections (but we record them with
650 machine-dependent frags anyway so they can be skipped or
651 converted to machine-independent), while those of more than 64
652 bytes cannot reliably be handled in this way. */
653 if (n > 0
654 && max >= 0
655 && max < (1 << n)
656 && !need_pass_2
657 && fill == NULL
658 && subseg_text_p (now_seg))
659 {
660 fragS *align_frag;
661 char *p;
662
663 if (n > 5)
664 return FALSE;
665
666 /* Machine-independent code would generate a frag here, but we
667 wish to handle it in a machine-dependent way. */
668 if (frag_now_fix () != 0)
669 {
670 if (frag_now->fr_type != rs_machine_dependent)
671 frag_wane (frag_now);
672
673 frag_new (0);
674 }
675 frag_grow (32);
676 align_frag = frag_now;
677 p = frag_var (rs_machine_dependent, 32, 32, max, NULL, n, NULL);
678 /* This must be the same as the frag to which a pointer was just
679 saved. */
680 if (p != align_frag->fr_literal)
681 abort ();
682 align_frag->tc_frag_data.is_insns = FALSE;
683 return TRUE;
684 }
685 else
686 return FALSE;
687 }
688
689 /* Types of operand for parsing purposes. These are used as bit-masks
690 to tell tic6x_parse_operand what forms of operand are
691 permitted. */
692 #define TIC6X_OP_EXP 0x0001u
693 #define TIC6X_OP_REG 0x0002u
694 #define TIC6X_OP_REGPAIR 0x0004u
695 #define TIC6X_OP_IRP 0x0008u
696 #define TIC6X_OP_NRP 0x0010u
697 /* With TIC6X_OP_MEM_NOUNREG, the contents of a () offset are always
698 interpreted as an expression, which may be a symbol with the same
699 name as a register that ends up being implicitly DP-relative. With
700 TIC6X_OP_MEM_UNREG, the contents of a () offset are interpreted as
701 a register if they match one, and failing that as an expression,
702 which must be constant. */
703 #define TIC6X_OP_MEM_NOUNREG 0x0020u
704 #define TIC6X_OP_MEM_UNREG 0x0040u
705 #define TIC6X_OP_CTRL 0x0080u
706 #define TIC6X_OP_FUNC_UNIT 0x0100u
707
708 /* A register or register pair read by the assembler. */
709 typedef struct
710 {
711 /* The side the register is on (1 or 2). */
712 unsigned int side;
713 /* The register number (0 to 31). */
714 unsigned int num;
715 } tic6x_register;
716
717 /* Types of modification of a base address. */
718 typedef enum
719 {
720 tic6x_mem_mod_none,
721 tic6x_mem_mod_plus,
722 tic6x_mem_mod_minus,
723 tic6x_mem_mod_preinc,
724 tic6x_mem_mod_predec,
725 tic6x_mem_mod_postinc,
726 tic6x_mem_mod_postdec
727 } tic6x_mem_mod;
728
729 /* Scaled [] or unscaled () nature of an offset. */
730 typedef enum
731 {
732 tic6x_offset_none,
733 tic6x_offset_scaled,
734 tic6x_offset_unscaled
735 } tic6x_mem_scaling;
736
737 /* A memory operand read by the assembler. */
738 typedef struct
739 {
740 /* The base register. */
741 tic6x_register base_reg;
742 /* How the base register is modified. */
743 tic6x_mem_mod mod;
744 /* Whether there is an offset (required with plain "+" and "-"), and
745 whether it is scaled or unscaled if so. */
746 tic6x_mem_scaling scaled;
747 /* Whether the offset is a register (TRUE) or an expression
748 (FALSE). */
749 bfd_boolean offset_is_reg;
750 /* The offset. */
751 union
752 {
753 expressionS exp;
754 tic6x_register reg;
755 } offset;
756 } tic6x_mem_ref;
757
758 /* A functional unit in SPMASK operands read by the assembler. */
759 typedef struct
760 {
761 /* The basic unit. */
762 tic6x_func_unit_base base;
763 /* The side (1 or 2). */
764 unsigned int side;
765 } tic6x_func_unit_operand;
766
767 /* An operand read by the assembler. */
768 typedef struct
769 {
770 /* The syntactic form of the operand, as one of the bit-masks
771 above. */
772 unsigned int form;
773 /* The operand value. */
774 union
775 {
776 /* An expression: TIC6X_OP_EXP. */
777 expressionS exp;
778 /* A register: TIC6X_OP_REG, TIC6X_OP_REGPAIR. */
779 tic6x_register reg;
780 /* A memory reference: TIC6X_OP_MEM_NOUNREG,
781 TIC6X_OP_MEM_UNREG. */
782 tic6x_mem_ref mem;
783 /* A control register: TIC6X_OP_CTRL. */
784 tic6x_ctrl_id ctrl;
785 /* A functional unit: TIC6X_OP_FUNC_UNIT. */
786 tic6x_func_unit_operand func_unit;
787 } value;
788 } tic6x_operand;
789
790 #define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
791
792 /* Parse a register operand, or part of an operand, starting at *P.
793 If syntactically OK (including that the number is in the range 0 to
794 31, but not necessarily in range for this architecture), return
795 TRUE, putting the register side and number in *REG and update *P to
796 point immediately after the register number; otherwise return FALSE
797 without changing *P (but possibly changing *REG). Do not print any
798 diagnostics. */
799
800 static bfd_boolean
801 tic6x_parse_register (char **p, tic6x_register *reg)
802 {
803 char *r = *p;
804
805 switch (*r)
806 {
807 case 'a':
808 case 'A':
809 reg->side = 1;
810 break;
811
812 case 'b':
813 case 'B':
814 reg->side = 2;
815 break;
816
817 default:
818 return FALSE;
819 }
820 r++;
821
822 if (*r >= '0' && *r <= '9')
823 {
824 reg->num = *r - '0';
825 r++;
826 }
827 else
828 return FALSE;
829
830 if (reg->num > 0 && *r >= '0' && *r <= '9')
831 {
832 reg->num = reg->num * 10 + (*r - '0');
833 r++;
834 }
835
836 if (*r >= '0' && *r <= '9')
837 return FALSE;
838
839 if (reg->num >= 32)
840 return FALSE;
841 *p = r;
842 return TRUE;
843 }
844
845 /* Parse the initial two characters of a functional unit name starting
846 at *P. If OK, set *BASE and *SIDE and return TRUE; otherwise,
847 return FALSE. */
848
849 static bfd_boolean
850 tic6x_parse_func_unit_base (char *p, tic6x_func_unit_base *base,
851 unsigned int *side)
852 {
853 bfd_boolean good_func_unit = TRUE;
854 tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
855 unsigned int maybe_side = 0;
856
857 switch (p[0])
858 {
859 case 'd':
860 case 'D':
861 maybe_base = tic6x_func_unit_d;
862 break;
863
864 case 'l':
865 case 'L':
866 maybe_base = tic6x_func_unit_l;
867 break;
868
869 case 'm':
870 case 'M':
871 maybe_base = tic6x_func_unit_m;
872 break;
873
874 case 's':
875 case 'S':
876 maybe_base = tic6x_func_unit_s;
877 break;
878
879 default:
880 good_func_unit = FALSE;
881 break;
882 }
883
884 if (good_func_unit)
885 switch (p[1])
886 {
887 case '1':
888 maybe_side = 1;
889 break;
890
891 case '2':
892 maybe_side = 2;
893 break;
894
895 default:
896 good_func_unit = FALSE;
897 break;
898 }
899
900 if (good_func_unit)
901 {
902 *base = maybe_base;
903 *side = maybe_side;
904 }
905
906 return good_func_unit;
907 }
908
909 /* Parse an operand starting at *P. If the operand parses OK, return
910 TRUE and store the value in *OP; otherwise return FALSE (possibly
911 changing *OP). In any case, update *P to point to the following
912 comma or end of line. The possible operand forms are given by
913 OP_FORMS. For diagnostics, this is operand OPNO of an opcode
914 starting at STR, length OPC_LEN. */
915
916 static bfd_boolean
917 tic6x_parse_operand (char **p, tic6x_operand *op, unsigned int op_forms,
918 char *str, int opc_len, unsigned int opno)
919 {
920 bfd_boolean operand_parsed = FALSE;
921 char *q = *p;
922
923 if ((op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
924 == (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
925 abort ();
926
927 /* Check for functional unit names for SPMASK and SPMASKR. */
928 if (!operand_parsed && (op_forms & TIC6X_OP_FUNC_UNIT))
929 {
930 tic6x_func_unit_base base = tic6x_func_unit_nfu;
931 unsigned int side = 0;
932
933 if (tic6x_parse_func_unit_base (q, &base, &side))
934 {
935 char *rq = q + 2;
936
937 skip_whitespace (rq);
938 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
939 {
940 op->form = TIC6X_OP_FUNC_UNIT;
941 op->value.func_unit.base = base;
942 op->value.func_unit.side = side;
943 operand_parsed = TRUE;
944 q = rq;
945 }
946 }
947 }
948
949 /* Check for literal "irp". */
950 if (!operand_parsed && (op_forms & TIC6X_OP_IRP))
951 {
952 if ((q[0] == 'i' || q[0] == 'I')
953 && (q[1] == 'r' || q[1] == 'R')
954 && (q[2] == 'p' || q[2] == 'P'))
955 {
956 char *rq = q + 3;
957
958 skip_whitespace (rq);
959 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
960 {
961 op->form = TIC6X_OP_IRP;
962 operand_parsed = TRUE;
963 q = rq;
964 }
965 }
966 }
967
968 /* Check for literal "nrp". */
969 if (!operand_parsed && (op_forms & TIC6X_OP_NRP))
970 {
971 if ((q[0] == 'n' || q[0] == 'N')
972 && (q[1] == 'r' || q[1] == 'R')
973 && (q[2] == 'p' || q[2] == 'P'))
974 {
975 char *rq = q + 3;
976
977 skip_whitespace (rq);
978 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
979 {
980 op->form = TIC6X_OP_NRP;
981 operand_parsed = TRUE;
982 q = rq;
983 }
984 }
985 }
986
987 /* Check for control register names. */
988 if (!operand_parsed && (op_forms & TIC6X_OP_CTRL))
989 {
990 tic6x_ctrl_id crid;
991
992 for (crid = 0; crid < tic6x_ctrl_max; crid++)
993 {
994 size_t len = strlen (tic6x_ctrl_table[crid].name);
995
996 if (strncasecmp (tic6x_ctrl_table[crid].name, q, len) == 0)
997 {
998 char *rq = q + len;
999
1000 skip_whitespace (rq);
1001 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1002 {
1003 op->form = TIC6X_OP_CTRL;
1004 op->value.ctrl = crid;
1005 operand_parsed = TRUE;
1006 q = rq;
1007 if (!(tic6x_ctrl_table[crid].isa_variants & tic6x_features))
1008 as_bad (_("control register '%s' not supported "
1009 "on this architecture"),
1010 tic6x_ctrl_table[crid].name);
1011 }
1012 }
1013 }
1014 }
1015
1016 /* See if this looks like a memory reference. */
1017 if (!operand_parsed
1018 && (op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG)))
1019 {
1020 bfd_boolean mem_ok = TRUE;
1021 char *mq = q;
1022 tic6x_mem_mod mem_mod = tic6x_mem_mod_none;
1023 tic6x_register base_reg;
1024 bfd_boolean require_offset, permit_offset;
1025 tic6x_mem_scaling scaled;
1026 bfd_boolean offset_is_reg;
1027 expressionS offset_exp;
1028 tic6x_register offset_reg;
1029
1030 if (*mq == '*')
1031 mq++;
1032 else
1033 mem_ok = FALSE;
1034
1035 if (mem_ok)
1036 {
1037 skip_whitespace (mq);
1038 switch (*mq)
1039 {
1040 case '+':
1041 if (mq[1] == '+')
1042 {
1043 mem_mod = tic6x_mem_mod_preinc;
1044 mq += 2;
1045 }
1046 else
1047 {
1048 mem_mod = tic6x_mem_mod_plus;
1049 mq++;
1050 }
1051 break;
1052
1053 case '-':
1054 if (mq[1] == '-')
1055 {
1056 mem_mod = tic6x_mem_mod_predec;
1057 mq += 2;
1058 }
1059 else
1060 {
1061 mem_mod = tic6x_mem_mod_minus;
1062 mq++;
1063 }
1064 break;
1065
1066 default:
1067 break;
1068 }
1069 }
1070
1071 if (mem_ok)
1072 {
1073 skip_whitespace (mq);
1074 mem_ok = tic6x_parse_register (&mq, &base_reg);
1075 }
1076
1077 if (mem_ok && mem_mod == tic6x_mem_mod_none)
1078 {
1079 skip_whitespace (mq);
1080 if (mq[0] == '+' && mq[1] == '+')
1081 {
1082 mem_mod = tic6x_mem_mod_postinc;
1083 mq += 2;
1084 }
1085 else if (mq[0] == '-' && mq[1] == '-')
1086 {
1087 mem_mod = tic6x_mem_mod_postdec;
1088 mq += 2;
1089 }
1090 }
1091
1092 if (mem_mod == tic6x_mem_mod_none)
1093 permit_offset = FALSE;
1094 else
1095 permit_offset = TRUE;
1096 if (mem_mod == tic6x_mem_mod_plus || mem_mod == tic6x_mem_mod_minus)
1097 require_offset = TRUE;
1098 else
1099 require_offset = FALSE;
1100 scaled = tic6x_offset_none;
1101 offset_is_reg = FALSE;
1102
1103 if (mem_ok && permit_offset)
1104 {
1105 char endc = 0;
1106
1107 skip_whitespace (mq);
1108 switch (*mq)
1109 {
1110 case '[':
1111 scaled = tic6x_offset_scaled;
1112 mq++;
1113 endc = ']';
1114 break;
1115
1116 case '(':
1117 scaled = tic6x_offset_unscaled;
1118 mq++;
1119 endc = ')';
1120 break;
1121
1122 default:
1123 break;
1124 }
1125 if (scaled != tic6x_offset_none)
1126 {
1127 skip_whitespace (mq);
1128 if (scaled == tic6x_offset_scaled
1129 || (op_forms & TIC6X_OP_MEM_UNREG))
1130 {
1131 bfd_boolean reg_ok;
1132 char *rq = mq;
1133
1134 reg_ok = tic6x_parse_register (&rq, &offset_reg);
1135 if (reg_ok)
1136 {
1137 skip_whitespace (rq);
1138 if (*rq == endc)
1139 {
1140 mq = rq;
1141 offset_is_reg = TRUE;
1142 }
1143 }
1144 }
1145 if (!offset_is_reg)
1146 {
1147 char *save_input_line_pointer;
1148
1149 save_input_line_pointer = input_line_pointer;
1150 input_line_pointer = mq;
1151 expression (&offset_exp);
1152 mq = input_line_pointer;
1153 input_line_pointer = save_input_line_pointer;
1154 }
1155 skip_whitespace (mq);
1156 if (*mq == endc)
1157 mq++;
1158 else
1159 mem_ok = FALSE;
1160 }
1161 }
1162
1163 if (mem_ok && require_offset && scaled == tic6x_offset_none)
1164 mem_ok = FALSE;
1165
1166 if (mem_ok)
1167 {
1168 skip_whitespace (mq);
1169 if (!is_end_of_line[(unsigned char) *mq] && *mq != ',')
1170 mem_ok = FALSE;
1171 }
1172
1173 if (mem_ok)
1174 {
1175 op->form = op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG);
1176 op->value.mem.base_reg = base_reg;
1177 op->value.mem.mod = mem_mod;
1178 op->value.mem.scaled = scaled;
1179 op->value.mem.offset_is_reg = offset_is_reg;
1180 if (offset_is_reg)
1181 op->value.mem.offset.reg = offset_reg;
1182 else
1183 op->value.mem.offset.exp = offset_exp;
1184 operand_parsed = TRUE;
1185 q = mq;
1186 if (base_reg.num >= tic6x_num_registers)
1187 as_bad (_("register number %u not supported on this architecture"),
1188 base_reg.num);
1189 if (offset_is_reg && offset_reg.num >= tic6x_num_registers)
1190 as_bad (_("register number %u not supported on this architecture"),
1191 offset_reg.num);
1192 }
1193 }
1194
1195 /* See if this looks like a register or register pair. */
1196 if (!operand_parsed && (op_forms & (TIC6X_OP_REG | TIC6X_OP_REGPAIR)))
1197 {
1198 tic6x_register first_reg, second_reg;
1199 bfd_boolean reg_ok;
1200 char *rq = q;
1201
1202 reg_ok = tic6x_parse_register (&rq, &first_reg);
1203
1204 if (reg_ok)
1205 {
1206 if (*rq == ':' && (op_forms & TIC6X_OP_REGPAIR))
1207 {
1208 rq++;
1209 reg_ok = tic6x_parse_register (&rq, &second_reg);
1210 if (reg_ok)
1211 {
1212 skip_whitespace (rq);
1213 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1214 {
1215 if ((second_reg.num & 1)
1216 || (first_reg.num != second_reg.num + 1)
1217 || (first_reg.side != second_reg.side))
1218 as_bad (_("register pair for operand %u of '%.*s'"
1219 " not a valid even/odd pair"), opno,
1220 opc_len, str);
1221 op->form = TIC6X_OP_REGPAIR;
1222 op->value.reg = second_reg;
1223 operand_parsed = TRUE;
1224 q = rq;
1225 }
1226 }
1227 }
1228 else if (op_forms & TIC6X_OP_REG)
1229 {
1230 skip_whitespace (rq);
1231 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1232 {
1233 op->form = TIC6X_OP_REG;
1234 op->value.reg = first_reg;
1235 operand_parsed = TRUE;
1236 q = rq;
1237 }
1238 }
1239 }
1240 if (operand_parsed)
1241 {
1242 if (first_reg.num >= tic6x_num_registers)
1243 as_bad (_("register number %u not supported on this architecture"),
1244 first_reg.num);
1245 if (op->form == TIC6X_OP_REGPAIR
1246 && second_reg.num >= tic6x_num_registers)
1247 as_bad (_("register number %u not supported on this architecture"),
1248 second_reg.num);
1249 }
1250 }
1251
1252 /* Otherwise, parse it as an expression. */
1253 if (!operand_parsed && (op_forms & TIC6X_OP_EXP))
1254 {
1255 char *save_input_line_pointer;
1256
1257 save_input_line_pointer = input_line_pointer;
1258 input_line_pointer = q;
1259 op->form = TIC6X_OP_EXP;
1260 expression (&op->value.exp);
1261 q = input_line_pointer;
1262 input_line_pointer = save_input_line_pointer;
1263 operand_parsed = TRUE;
1264 }
1265
1266 if (operand_parsed)
1267 {
1268 /* Now the operand has been parsed, there must be nothing more
1269 before the comma or end of line. */
1270 skip_whitespace (q);
1271 if (!is_end_of_line[(unsigned char) *q] && *q != ',')
1272 {
1273 operand_parsed = FALSE;
1274 as_bad (_("junk after operand %u of '%.*s'"), opno,
1275 opc_len, str);
1276 while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1277 q++;
1278 }
1279 }
1280 else
1281 {
1282 /* This could not be parsed as any acceptable form of
1283 operand. */
1284 switch (op_forms)
1285 {
1286 case TIC6X_OP_REG | TIC6X_OP_REGPAIR:
1287 as_bad (_("bad register or register pair for operand %u of '%.*s'"),
1288 opno, opc_len, str);
1289 break;
1290
1291 case TIC6X_OP_REG | TIC6X_OP_CTRL:
1292 case TIC6X_OP_REG:
1293 as_bad (_("bad register for operand %u of '%.*s'"),
1294 opno, opc_len, str);
1295 break;
1296
1297 case TIC6X_OP_REGPAIR:
1298 as_bad (_("bad register pair for operand %u of '%.*s'"),
1299 opno, opc_len, str);
1300 break;
1301
1302 case TIC6X_OP_FUNC_UNIT:
1303 as_bad (_("bad functional unit for operand %u of '%.*s'"),
1304 opno, opc_len, str);
1305 break;
1306
1307 default:
1308 as_bad (_("bad operand %u of '%.*s'"),
1309 opno, opc_len, str);
1310 break;
1311
1312 }
1313 while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1314 q++;
1315 }
1316 *p = q;
1317 return operand_parsed;
1318 }
1319
1320 /* Table of assembler operators and associated O_* values. */
1321 typedef struct
1322 {
1323 const char *name;
1324 operatorT op;
1325 } tic6x_operator_table;
1326 static const tic6x_operator_table tic6x_operators[] = {
1327 #define O_dsbt_index O_md1
1328 { "dsbt_index", O_dsbt_index },
1329 #define O_got O_md2
1330 { "got", O_got },
1331 #define O_dpr_got O_md3
1332 { "dpr_got", O_dpr_got },
1333 #define O_dpr_byte O_md4
1334 { "dpr_byte", O_dpr_byte },
1335 #define O_dpr_hword O_md5
1336 { "dpr_hword", O_dpr_hword },
1337 #define O_dpr_word O_md6
1338 { "dpr_word", O_dpr_word },
1339 };
1340
1341 /* Parse a name in some machine-specific way. Used on C6X to handle
1342 assembler operators. */
1343
1344 int
1345 tic6x_parse_name (const char *name, expressionS *exprP,
1346 enum expr_mode mode ATTRIBUTE_UNUSED, char *nextchar)
1347 {
1348 char *p = input_line_pointer;
1349 char c, *name_start, *name_end;
1350 const char *inner_name;
1351 unsigned int i;
1352 operatorT op = O_illegal;
1353 symbolS *sym;
1354
1355 if (*name != '$')
1356 return 0;
1357
1358 for (i = 0; i < ARRAY_SIZE (tic6x_operators); i++)
1359 if (strcasecmp (name + 1, tic6x_operators[i].name) == 0)
1360 {
1361 op = tic6x_operators[i].op;
1362 break;
1363 }
1364
1365 if (op == O_illegal)
1366 return 0;
1367
1368 *input_line_pointer = *nextchar;
1369 skip_whitespace (p);
1370
1371 if (*p != '(')
1372 {
1373 *input_line_pointer = 0;
1374 return 0;
1375 }
1376 p++;
1377 skip_whitespace (p);
1378
1379 if (!is_name_beginner (*p))
1380 {
1381 *input_line_pointer = 0;
1382 return 0;
1383 }
1384
1385 name_start = p;
1386 p++;
1387 while (is_part_of_name (*p))
1388 p++;
1389 name_end = p;
1390 skip_whitespace (p);
1391
1392 if (*p != ')')
1393 {
1394 *input_line_pointer = 0;
1395 return 0;
1396 }
1397
1398 input_line_pointer = p + 1;
1399 *nextchar = *input_line_pointer;
1400 *input_line_pointer = 0;
1401
1402 c = *name_end;
1403 *name_end = 0;
1404 inner_name = name_start;
1405 if (op == O_dsbt_index && strcmp (inner_name, "__c6xabi_DSBT_BASE") != 0)
1406 {
1407 as_bad (_("$DSBT_INDEX must be used with __c6xabi_DSBT_BASE"));
1408 inner_name = "__c6xabi_DSBT_BASE";
1409 }
1410 sym = symbol_find_or_make (inner_name);
1411 *name_end = c;
1412
1413 exprP->X_op = op;
1414 exprP->X_add_symbol = sym;
1415 exprP->X_add_number = 0;
1416 exprP->X_op_symbol = NULL;
1417 exprP->X_md = 0;
1418
1419 return 1;
1420 }
1421
1422 /* Create a fixup for an expression. Same arguments as fix_new_exp,
1423 plus FIX_ADDA which is TRUE for ADDA instructions (to indicate that
1424 fixes resolving to constants should have those constants implicitly
1425 shifted) and FALSE otherwise, but look for C6X-specific expression
1426 types and adjust the relocations or give errors accordingly. */
1427
1428 static void
1429 tic6x_fix_new_exp (fragS *frag, int where, int size, expressionS *exp,
1430 int pcrel, bfd_reloc_code_real_type r_type,
1431 bfd_boolean fix_adda)
1432 {
1433 bfd_reloc_code_real_type new_reloc = BFD_RELOC_UNUSED;
1434 fixS *fix;
1435
1436 switch (exp->X_op)
1437 {
1438 case O_dsbt_index:
1439 switch (r_type)
1440 {
1441 case BFD_RELOC_C6000_SBR_U15_W:
1442 new_reloc = BFD_RELOC_C6000_DSBT_INDEX;
1443 break;
1444
1445 default:
1446 as_bad (_("$DSBT_INDEX not supported in this context"));
1447 return;
1448 }
1449 break;
1450
1451 case O_got:
1452 switch (r_type)
1453 {
1454 case BFD_RELOC_C6000_SBR_U15_W:
1455 new_reloc = BFD_RELOC_C6000_SBR_GOT_U15_W;
1456 break;
1457
1458 default:
1459 as_bad (_("$GOT not supported in this context"));
1460 return;
1461 }
1462 break;
1463
1464 case O_dpr_got:
1465 switch (r_type)
1466 {
1467 case BFD_RELOC_C6000_ABS_L16:
1468 new_reloc = BFD_RELOC_C6000_SBR_GOT_L16_W;
1469 break;
1470
1471 case BFD_RELOC_C6000_ABS_H16:
1472 new_reloc = BFD_RELOC_C6000_SBR_GOT_H16_W;
1473 break;
1474
1475 default:
1476 as_bad (_("$DPR_GOT not supported in this context"));
1477 return;
1478 }
1479 break;
1480
1481 case O_dpr_byte:
1482 switch (r_type)
1483 {
1484 case BFD_RELOC_C6000_ABS_S16:
1485 new_reloc = BFD_RELOC_C6000_SBR_S16;
1486 break;
1487
1488 case BFD_RELOC_C6000_ABS_L16:
1489 new_reloc = BFD_RELOC_C6000_SBR_L16_B;
1490 break;
1491
1492 case BFD_RELOC_C6000_ABS_H16:
1493 new_reloc = BFD_RELOC_C6000_SBR_H16_B;
1494 break;
1495
1496 default:
1497 as_bad (_("$DPR_BYTE not supported in this context"));
1498 return;
1499 }
1500 break;
1501
1502 case O_dpr_hword:
1503 switch (r_type)
1504 {
1505 case BFD_RELOC_C6000_ABS_L16:
1506 new_reloc = BFD_RELOC_C6000_SBR_L16_H;
1507 break;
1508
1509 case BFD_RELOC_C6000_ABS_H16:
1510 new_reloc = BFD_RELOC_C6000_SBR_H16_H;
1511 break;
1512
1513 default:
1514 as_bad (_("$DPR_HWORD not supported in this context"));
1515 return;
1516 }
1517 break;
1518
1519 case O_dpr_word:
1520 switch (r_type)
1521 {
1522 case BFD_RELOC_C6000_ABS_L16:
1523 new_reloc = BFD_RELOC_C6000_SBR_L16_W;
1524 break;
1525
1526 case BFD_RELOC_C6000_ABS_H16:
1527 new_reloc = BFD_RELOC_C6000_SBR_H16_W;
1528 break;
1529
1530 default:
1531 as_bad (_("$DPR_WORD not supported in this context"));
1532 return;
1533 }
1534 break;
1535
1536 case O_symbol:
1537 break;
1538
1539 default:
1540 if (pcrel)
1541 {
1542 as_bad (_("invalid PC-relative operand"));
1543 return;
1544 }
1545 break;
1546 }
1547
1548 if (new_reloc == BFD_RELOC_UNUSED)
1549 fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
1550 else
1551 fix = fix_new (frag, where, size, exp->X_add_symbol, exp->X_add_number,
1552 pcrel, new_reloc);
1553 fix->tc_fix_data.fix_adda = fix_adda;
1554 }
1555
1556 /* Generate a fix for a constant (.word etc.). Needed to ensure these
1557 go through the error checking in tic6x_fix_new_exp. */
1558
1559 void
1560 tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp)
1561 {
1562 bfd_reloc_code_real_type r_type;
1563
1564 switch (size)
1565 {
1566 case 1:
1567 r_type = BFD_RELOC_8;
1568 break;
1569
1570 case 2:
1571 r_type = BFD_RELOC_16;
1572 break;
1573
1574 case 4:
1575 r_type = BFD_RELOC_32;
1576 break;
1577
1578 default:
1579 as_bad (_("no %d-byte relocations available"), size);
1580 return;
1581 }
1582
1583 tic6x_fix_new_exp (frag, where, size, exp, 0, r_type, FALSE);
1584 }
1585
1586 /* Initialize target-specific fix data. */
1587
1588 void
1589 tic6x_init_fix_data (fixS *fixP)
1590 {
1591 fixP->tc_fix_data.fix_adda = FALSE;
1592 }
1593
1594 /* Return true if the fix can be handled by GAS, false if it must
1595 be passed through to the linker. */
1596
1597 bfd_boolean
1598 tic6x_fix_adjustable (fixS *fixP)
1599 {
1600 switch (fixP->fx_r_type)
1601 {
1602 /* Adjust_reloc_syms doesn't know about the GOT. */
1603 case BFD_RELOC_C6000_SBR_GOT_U15_W:
1604 case BFD_RELOC_C6000_SBR_GOT_H16_W:
1605 case BFD_RELOC_C6000_SBR_GOT_L16_W:
1606 return 0;
1607
1608 default:
1609 return 1;
1610 }
1611 }
1612
1613 /* Given the fine-grained form of an operand, return the coarse
1614 (bit-mask) form. */
1615
1616 static unsigned int
1617 tic6x_coarse_operand_form (tic6x_operand_form form)
1618 {
1619 switch (form)
1620 {
1621 case tic6x_operand_asm_const:
1622 case tic6x_operand_link_const:
1623 return TIC6X_OP_EXP;
1624
1625 case tic6x_operand_reg:
1626 case tic6x_operand_xreg:
1627 case tic6x_operand_dreg:
1628 case tic6x_operand_areg:
1629 case tic6x_operand_retreg:
1630 return TIC6X_OP_REG;
1631
1632 case tic6x_operand_regpair:
1633 case tic6x_operand_xregpair:
1634 case tic6x_operand_dregpair:
1635 return TIC6X_OP_REGPAIR;
1636
1637 case tic6x_operand_irp:
1638 return TIC6X_OP_IRP;
1639
1640 case tic6x_operand_nrp:
1641 return TIC6X_OP_NRP;
1642
1643 case tic6x_operand_ctrl:
1644 return TIC6X_OP_CTRL;
1645
1646 case tic6x_operand_mem_short:
1647 case tic6x_operand_mem_long:
1648 case tic6x_operand_mem_deref:
1649 return TIC6X_OP_MEM_NOUNREG;
1650
1651 case tic6x_operand_mem_ndw:
1652 return TIC6X_OP_MEM_UNREG;
1653
1654 case tic6x_operand_func_unit:
1655 return TIC6X_OP_FUNC_UNIT;
1656
1657 default:
1658 abort ();
1659 }
1660 }
1661
1662 /* How an operand may match or not match a desired form. If different
1663 instruction alternatives fail in different ways, the first failure
1664 in this list determines the diagnostic. */
1665 typedef enum
1666 {
1667 /* Matches. */
1668 tic6x_match_matches,
1669 /* Bad coarse form. */
1670 tic6x_match_coarse,
1671 /* Not constant. */
1672 tic6x_match_non_const,
1673 /* Register on wrong side. */
1674 tic6x_match_wrong_side,
1675 /* Not a valid address register. */
1676 tic6x_match_bad_address,
1677 /* Not a valid return address register. */
1678 tic6x_match_bad_return,
1679 /* Control register not readable. */
1680 tic6x_match_ctrl_write_only,
1681 /* Control register not writable. */
1682 tic6x_match_ctrl_read_only,
1683 /* Not a valid memory reference for this instruction. */
1684 tic6x_match_bad_mem
1685 } tic6x_operand_match;
1686
1687 /* Return whether an operand matches the given fine-grained form and
1688 read/write usage, and, if it does not match, how it fails to match.
1689 The main functional unit side is SIDE; the cross-path side is CROSS
1690 (the same as SIDE if a cross path not used); the data side is
1691 DATA_SIDE. */
1692 static tic6x_operand_match
1693 tic6x_operand_matches_form (const tic6x_operand *op, tic6x_operand_form form,
1694 tic6x_rw rw, unsigned int side, unsigned int cross,
1695 unsigned int data_side)
1696 {
1697 unsigned int coarse = tic6x_coarse_operand_form (form);
1698
1699 if (coarse != op->form)
1700 return tic6x_match_coarse;
1701
1702 switch (form)
1703 {
1704 case tic6x_operand_asm_const:
1705 if (op->value.exp.X_op == O_constant)
1706 return tic6x_match_matches;
1707 else
1708 return tic6x_match_non_const;
1709
1710 case tic6x_operand_link_const:
1711 case tic6x_operand_irp:
1712 case tic6x_operand_nrp:
1713 case tic6x_operand_func_unit:
1714 /* All expressions are link-time constants, although there may
1715 not be relocations to express them in the output file. "irp"
1716 and "nrp" are unique operand values. All parsed functional
1717 unit names are valid. */
1718 return tic6x_match_matches;
1719
1720 case tic6x_operand_reg:
1721 case tic6x_operand_regpair:
1722 if (op->value.reg.side == side)
1723 return tic6x_match_matches;
1724 else
1725 return tic6x_match_wrong_side;
1726
1727 case tic6x_operand_xreg:
1728 case tic6x_operand_xregpair:
1729 if (op->value.reg.side == cross)
1730 return tic6x_match_matches;
1731 else
1732 return tic6x_match_wrong_side;
1733
1734 case tic6x_operand_dreg:
1735 case tic6x_operand_dregpair:
1736 if (op->value.reg.side == data_side)
1737 return tic6x_match_matches;
1738 else
1739 return tic6x_match_wrong_side;
1740
1741 case tic6x_operand_areg:
1742 if (op->value.reg.side != cross)
1743 return tic6x_match_wrong_side;
1744 else if (op->value.reg.side == 2
1745 && (op->value.reg.num == 14 || op->value.reg.num == 15))
1746 return tic6x_match_matches;
1747 else
1748 return tic6x_match_bad_address;
1749
1750 case tic6x_operand_retreg:
1751 if (op->value.reg.side != side)
1752 return tic6x_match_wrong_side;
1753 else if (op->value.reg.num != 3)
1754 return tic6x_match_bad_return;
1755 else
1756 return tic6x_match_matches;
1757
1758 case tic6x_operand_ctrl:
1759 switch (rw)
1760 {
1761 case tic6x_rw_read:
1762 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read
1763 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
1764 return tic6x_match_matches;
1765 else
1766 return tic6x_match_ctrl_write_only;
1767
1768 case tic6x_rw_write:
1769 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_write
1770 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
1771 return tic6x_match_matches;
1772 else
1773 return tic6x_match_ctrl_read_only;
1774
1775 default:
1776 abort ();
1777 }
1778
1779 case tic6x_operand_mem_deref:
1780 if (op->value.mem.mod != tic6x_mem_mod_none)
1781 return tic6x_match_bad_mem;
1782 else if (op->value.mem.scaled != tic6x_offset_none)
1783 abort ();
1784 else if (op->value.mem.base_reg.side != side)
1785 return tic6x_match_bad_mem;
1786 else
1787 return tic6x_match_matches;
1788
1789 case tic6x_operand_mem_short:
1790 case tic6x_operand_mem_ndw:
1791 if (op->value.mem.base_reg.side != side)
1792 return tic6x_match_bad_mem;
1793 if (op->value.mem.mod == tic6x_mem_mod_none)
1794 {
1795 if (op->value.mem.scaled != tic6x_offset_none)
1796 abort ();
1797 return tic6x_match_matches;
1798 }
1799 if (op->value.mem.scaled == tic6x_offset_none)
1800 {
1801 if (op->value.mem.mod == tic6x_mem_mod_plus
1802 || op->value.mem.mod == tic6x_mem_mod_minus)
1803 abort ();
1804 return tic6x_match_matches;
1805 }
1806 if (op->value.mem.offset_is_reg)
1807 {
1808 if (op->value.mem.scaled == tic6x_offset_unscaled
1809 && form != tic6x_operand_mem_ndw)
1810 abort ();
1811 if (op->value.mem.offset.reg.side == side)
1812 return tic6x_match_matches;
1813 else
1814 return tic6x_match_bad_mem;
1815 }
1816 else
1817 {
1818 if (op->value.mem.offset.exp.X_op == O_constant)
1819 return tic6x_match_matches;
1820 else
1821 return tic6x_match_bad_mem;
1822 }
1823
1824 case tic6x_operand_mem_long:
1825 if (op->value.mem.base_reg.side == 2
1826 && (op->value.mem.base_reg.num == 14
1827 || op->value.mem.base_reg.num == 15))
1828 {
1829 switch (op->value.mem.mod)
1830 {
1831 case tic6x_mem_mod_none:
1832 if (op->value.mem.scaled != tic6x_offset_none)
1833 abort ();
1834 return tic6x_match_matches;
1835
1836 case tic6x_mem_mod_plus:
1837 if (op->value.mem.scaled == tic6x_offset_none)
1838 abort ();
1839 if (op->value.mem.offset_is_reg)
1840 return tic6x_match_bad_mem;
1841 else if (op->value.mem.scaled == tic6x_offset_scaled
1842 && op->value.mem.offset.exp.X_op != O_constant)
1843 return tic6x_match_bad_mem;
1844 else
1845 return tic6x_match_matches;
1846
1847 case tic6x_mem_mod_minus:
1848 case tic6x_mem_mod_preinc:
1849 case tic6x_mem_mod_predec:
1850 case tic6x_mem_mod_postinc:
1851 case tic6x_mem_mod_postdec:
1852 return tic6x_match_bad_mem;
1853
1854 default:
1855 abort ();
1856 }
1857
1858 }
1859 else
1860 return tic6x_match_bad_mem;
1861
1862 default:
1863 abort ();
1864 }
1865 }
1866
1867 /* Return the number of bits shift used with DP-relative coding method
1868 CODING. */
1869
1870 static unsigned int
1871 tic6x_dpr_shift (tic6x_coding_method coding)
1872 {
1873 switch (coding)
1874 {
1875 case tic6x_coding_ulcst_dpr_byte:
1876 return 0;
1877
1878 case tic6x_coding_ulcst_dpr_half:
1879 return 1;
1880
1881 case tic6x_coding_ulcst_dpr_word:
1882 return 2;
1883
1884 default:
1885 abort ();
1886 }
1887 }
1888
1889 /* Return the relocation used with DP-relative coding method
1890 CODING. */
1891
1892 static bfd_reloc_code_real_type
1893 tic6x_dpr_reloc (tic6x_coding_method coding)
1894 {
1895 switch (coding)
1896 {
1897 case tic6x_coding_ulcst_dpr_byte:
1898 return BFD_RELOC_C6000_SBR_U15_B;
1899
1900 case tic6x_coding_ulcst_dpr_half:
1901 return BFD_RELOC_C6000_SBR_U15_H;
1902
1903 case tic6x_coding_ulcst_dpr_word:
1904 return BFD_RELOC_C6000_SBR_U15_W;
1905
1906 default:
1907 abort ();
1908 }
1909 }
1910
1911 /* Given a memory reference *MEM_REF as originally parsed, fill in
1912 defaults for missing offsets. */
1913
1914 static void
1915 tic6x_default_mem_ref (tic6x_mem_ref *mem_ref)
1916 {
1917 switch (mem_ref->mod)
1918 {
1919 case tic6x_mem_mod_none:
1920 if (mem_ref->scaled != tic6x_offset_none)
1921 abort ();
1922 mem_ref->mod = tic6x_mem_mod_plus;
1923 mem_ref->scaled = tic6x_offset_unscaled;
1924 mem_ref->offset_is_reg = FALSE;
1925 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
1926 mem_ref->offset.exp.X_op = O_constant;
1927 mem_ref->offset.exp.X_add_number = 0;
1928 mem_ref->offset.exp.X_unsigned = 0;
1929 break;
1930
1931 case tic6x_mem_mod_plus:
1932 case tic6x_mem_mod_minus:
1933 if (mem_ref->scaled == tic6x_offset_none)
1934 abort ();
1935 break;
1936
1937 case tic6x_mem_mod_preinc:
1938 case tic6x_mem_mod_predec:
1939 case tic6x_mem_mod_postinc:
1940 case tic6x_mem_mod_postdec:
1941 if (mem_ref->scaled != tic6x_offset_none)
1942 break;
1943 mem_ref->scaled = tic6x_offset_scaled;
1944 mem_ref->offset_is_reg = FALSE;
1945 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
1946 mem_ref->offset.exp.X_op = O_constant;
1947 mem_ref->offset.exp.X_add_number = 1;
1948 mem_ref->offset.exp.X_unsigned = 0;
1949 break;
1950
1951 default:
1952 abort ();
1953 }
1954 }
1955
1956 /* Return the encoding in the 8-bit field of an SPMASK or SPMASKR
1957 instruction of the specified UNIT, side SIDE. */
1958
1959 static unsigned int
1960 tic6x_encode_spmask (tic6x_func_unit_base unit, unsigned int side)
1961 {
1962 switch (unit)
1963 {
1964 case tic6x_func_unit_l:
1965 return 1 << (side - 1);
1966
1967 case tic6x_func_unit_s:
1968 return 1 << (side + 1);
1969
1970 case tic6x_func_unit_d:
1971 return 1 << (side + 3);
1972
1973 case tic6x_func_unit_m:
1974 return 1 << (side + 5);
1975
1976 default:
1977 abort ();
1978 }
1979 }
1980
1981 /* Try to encode the instruction with opcode number ID and operands
1982 OPERANDS (number NUM_OPERANDS), creg value THIS_LINE_CREG and z
1983 value THIS_LINE_Z; FUNC_UNIT_SIDE, FUNC_UNIT_CROSS and
1984 FUNC_UNIT_DATA_SIDE describe the functional unit specification;
1985 SPLOOP_II is the ii value from the previous SPLOOP-family
1986 instruction, or 0 if not in such a loop; the only possible problems
1987 are operands being out of range (they already match the
1988 fine-grained form), and inappropriate predication. If this
1989 succeeds, return the encoding and set *OK to TRUE; otherwise return
1990 0 and set *OK to FALSE. If a fix is needed, set *FIX_NEEDED to
1991 true and fill in *FIX_EXP, *FIX_PCREL, *FX_R_TYPE and *FIX_ADDA.
1992 Print error messages for failure if PRINT_ERRORS is TRUE; the
1993 opcode starts at STR and has length OPC_LEN. */
1994
1995 static unsigned int
1996 tic6x_try_encode (tic6x_opcode_id id, tic6x_operand *operands,
1997 unsigned int num_operands, unsigned int this_line_creg,
1998 unsigned int this_line_z, unsigned int func_unit_side,
1999 unsigned int func_unit_cross,
2000 unsigned int func_unit_data_side, int sploop_ii,
2001 expressionS **fix_exp, int *fix_pcrel,
2002 bfd_reloc_code_real_type *fx_r_type, bfd_boolean *fix_adda,
2003 bfd_boolean *fix_needed, bfd_boolean *ok,
2004 bfd_boolean print_errors, char *str, int opc_len)
2005 {
2006 const tic6x_opcode *opct;
2007 const tic6x_insn_format *fmt;
2008 unsigned int opcode_value;
2009 unsigned int fld;
2010
2011 opct = &tic6x_opcode_table[id];
2012 fmt = &tic6x_insn_format_table[opct->format];
2013 opcode_value = fmt->cst_bits;
2014
2015 for (fld = 0; fld < opct->num_fixed_fields; fld++)
2016 {
2017 if (opct->fixed_fields[fld].min_val == opct->fixed_fields[fld].max_val)
2018 {
2019 const tic6x_insn_field *fldd;
2020 fldd = tic6x_field_from_fmt (fmt, opct->fixed_fields[fld].field_id);
2021 if (fldd == NULL)
2022 abort ();
2023 opcode_value |= opct->fixed_fields[fld].min_val << fldd->low_pos;
2024 }
2025 }
2026
2027 for (fld = 0; fld < opct->num_variable_fields; fld++)
2028 {
2029 const tic6x_insn_field *fldd;
2030 unsigned int value;
2031 unsigned int opno;
2032 unsigned int ffld;
2033 offsetT sign_value;
2034 unsigned int bits;
2035 unsigned int fcyc_bits;
2036 expressionS *expp;
2037 expressionS ucexp;
2038 tic6x_mem_ref mem;
2039
2040 fldd = tic6x_field_from_fmt (fmt, opct->variable_fields[fld].field_id);
2041 if (fldd == NULL)
2042 abort ();
2043 opno = opct->variable_fields[fld].operand_num;
2044 switch (opct->variable_fields[fld].coding_method)
2045 {
2046 case tic6x_coding_ucst:
2047 if (operands[opno].form != TIC6X_OP_EXP)
2048 abort ();
2049 if (operands[opno].value.exp.X_op != O_constant)
2050 abort ();
2051 ucexp = operands[opno].value.exp;
2052 unsigned_constant:
2053 if (ucexp.X_add_number < 0
2054 || ucexp.X_add_number >= (1 << fldd->width))
2055 {
2056 if (print_errors)
2057 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2058 opc_len, str);
2059 *ok = FALSE;
2060 return 0;
2061 }
2062 value = ucexp.X_add_number;
2063 break;
2064
2065 case tic6x_coding_scst:
2066 if (operands[opno].form != TIC6X_OP_EXP)
2067 abort ();
2068 if (operands[opno].value.exp.X_op != O_constant)
2069 {
2070 value = 0;
2071 /* Opcode table should not permit non-constants without
2072 a known relocation for them. */
2073 if (fldd->low_pos != 7 || fldd->width != 16)
2074 abort ();
2075 *fix_needed = TRUE;
2076 *fix_exp = &operands[opno].value.exp;
2077 *fix_pcrel = 0;
2078 *fx_r_type = BFD_RELOC_C6000_ABS_S16;
2079 *fix_adda = FALSE;
2080 break;
2081 }
2082 sign_value = SEXT (operands[opno].value.exp.X_add_number);
2083 signed_constant:
2084 if (sign_value < -(1 << (fldd->width - 1))
2085 || (sign_value >= (1 << (fldd->width - 1))))
2086 {
2087 if (print_errors)
2088 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2089 opc_len, str);
2090 *ok = FALSE;
2091 return 0;
2092 }
2093 value = sign_value + (1 << (fldd->width - 1));
2094 value ^= (1 << (fldd->width - 1));
2095 break;
2096
2097 case tic6x_coding_ucst_minus_one:
2098 if (operands[opno].form != TIC6X_OP_EXP)
2099 abort ();
2100 if (operands[opno].value.exp.X_op != O_constant)
2101 abort ();
2102 if (operands[opno].value.exp.X_add_number <= 0
2103 || operands[opno].value.exp.X_add_number > (1 << fldd->width))
2104 {
2105 if (print_errors)
2106 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2107 opc_len, str);
2108 *ok = FALSE;
2109 return 0;
2110 }
2111 value = operands[opno].value.exp.X_add_number - 1;
2112 break;
2113
2114 case tic6x_coding_scst_negate:
2115 if (operands[opno].form != TIC6X_OP_EXP)
2116 abort ();
2117 if (operands[opno].value.exp.X_op != O_constant)
2118 abort ();
2119 sign_value = SEXT (-operands[opno].value.exp.X_add_number);
2120 goto signed_constant;
2121
2122 case tic6x_coding_ulcst_dpr_byte:
2123 case tic6x_coding_ulcst_dpr_half:
2124 case tic6x_coding_ulcst_dpr_word:
2125 bits = tic6x_dpr_shift (opct->variable_fields[fld].coding_method);
2126 switch (operands[opno].form)
2127 {
2128 case TIC6X_OP_EXP:
2129 if (operands[opno].value.exp.X_op == O_constant)
2130 {
2131 ucexp = operands[opno].value.exp;
2132 goto unsigned_constant;
2133 }
2134 expp = &operands[opno].value.exp;
2135 break;
2136
2137 case TIC6X_OP_MEM_NOUNREG:
2138 mem = operands[opno].value.mem;
2139 tic6x_default_mem_ref (&mem);
2140 if (mem.offset_is_reg)
2141 abort ();
2142 if (mem.offset.exp.X_op == O_constant)
2143 {
2144 ucexp = mem.offset.exp;
2145 if (mem.scaled == tic6x_offset_unscaled)
2146 {
2147 if (ucexp.X_add_number & ((1 << bits) - 1))
2148 {
2149 if (print_errors)
2150 as_bad (_("offset in operand %u of '%.*s' not "
2151 "divisible by %u"), opno + 1, opc_len,
2152 str, 1u << bits);
2153 *ok = FALSE;
2154 return 0;
2155 }
2156 ucexp.X_add_number >>= bits;
2157 }
2158 goto unsigned_constant;
2159 }
2160 if (mem.scaled != tic6x_offset_unscaled)
2161 abort ();
2162 if (operands[opno].value.mem.mod == tic6x_mem_mod_none
2163 || operands[opno].value.mem.scaled != tic6x_offset_unscaled
2164 || operands[opno].value.mem.offset_is_reg)
2165 abort ();
2166 expp = &operands[opno].value.mem.offset.exp;
2167 break;
2168
2169 default:
2170 abort ();
2171 }
2172 value = 0;
2173 /* Opcode table should not use this encoding without a known
2174 relocation. */
2175 if (fldd->low_pos != 8 || fldd->width != 15)
2176 abort ();
2177 /* We do not check for offset divisibility here; such a
2178 check is not needed at this point to encode the value,
2179 and if there is eventually a problem it will be detected
2180 either in md_apply_fix or at link time. */
2181 *fix_needed = TRUE;
2182 *fix_exp = expp;
2183 *fix_pcrel = 0;
2184 *fx_r_type
2185 = tic6x_dpr_reloc (opct->variable_fields[fld].coding_method);
2186 if (operands[opno].form == TIC6X_OP_EXP)
2187 *fix_adda = TRUE;
2188 else
2189 *fix_adda = FALSE;
2190 break;
2191
2192 case tic6x_coding_lcst_low16:
2193 if (operands[opno].form != TIC6X_OP_EXP)
2194 abort ();
2195 if (operands[opno].value.exp.X_op == O_constant)
2196 value = operands[opno].value.exp.X_add_number & 0xffff;
2197 else
2198 {
2199 value = 0;
2200 /* Opcode table should not use this encoding without a
2201 known relocation. */
2202 if (fldd->low_pos != 7 || fldd->width != 16)
2203 abort ();
2204 *fix_needed = TRUE;
2205 *fix_exp = &operands[opno].value.exp;
2206 *fix_pcrel = 0;
2207 *fx_r_type = BFD_RELOC_C6000_ABS_L16;
2208 *fix_adda = FALSE;
2209 }
2210 break;
2211
2212 case tic6x_coding_lcst_high16:
2213 if (operands[opno].form != TIC6X_OP_EXP)
2214 abort ();
2215 if (operands[opno].value.exp.X_op == O_constant)
2216 value = (operands[opno].value.exp.X_add_number >> 16) & 0xffff;
2217 else
2218 {
2219 value = 0;
2220 /* Opcode table should not use this encoding without a
2221 known relocation. */
2222 if (fldd->low_pos != 7 || fldd->width != 16)
2223 abort ();
2224 *fix_needed = TRUE;
2225 *fix_exp = &operands[opno].value.exp;
2226 *fix_pcrel = 0;
2227 *fx_r_type = BFD_RELOC_C6000_ABS_H16;
2228 *fix_adda = FALSE;
2229 }
2230 break;
2231
2232 case tic6x_coding_pcrel:
2233 case tic6x_coding_pcrel_half:
2234 if (operands[opno].form != TIC6X_OP_EXP)
2235 abort ();
2236 value = 0;
2237 *fix_needed = TRUE;
2238 *fix_exp = &operands[opno].value.exp;
2239 *fix_pcrel = 1;
2240 if (fldd->low_pos == 7 && fldd->width == 21)
2241 *fx_r_type = BFD_RELOC_C6000_PCR_S21;
2242 else if (fldd->low_pos == 16 && fldd->width == 12)
2243 *fx_r_type = BFD_RELOC_C6000_PCR_S12;
2244 else if (fldd->low_pos == 13 && fldd->width == 10)
2245 *fx_r_type = BFD_RELOC_C6000_PCR_S10;
2246 else if (fldd->low_pos == 16 && fldd->width == 7)
2247 *fx_r_type = BFD_RELOC_C6000_PCR_S7;
2248 else
2249 /* Opcode table should not use this encoding without a
2250 known relocation. */
2251 abort ();
2252 *fix_adda = FALSE;
2253 break;
2254
2255 case tic6x_coding_reg:
2256 switch (operands[opno].form)
2257 {
2258 case TIC6X_OP_REG:
2259 case TIC6X_OP_REGPAIR:
2260 value = operands[opno].value.reg.num;
2261 break;
2262
2263 case TIC6X_OP_MEM_NOUNREG:
2264 case TIC6X_OP_MEM_UNREG:
2265 value = operands[opno].value.mem.base_reg.num;
2266 break;
2267
2268 default:
2269 abort ();
2270 }
2271 break;
2272
2273 case tic6x_coding_areg:
2274 switch (operands[opno].form)
2275 {
2276 case TIC6X_OP_REG:
2277 value = (operands[opno].value.reg.num == 15 ? 1 : 0);
2278 break;
2279
2280 case TIC6X_OP_MEM_NOUNREG:
2281 value = (operands[opno].value.mem.base_reg.num == 15 ? 1 : 0);
2282 break;
2283
2284 default:
2285 abort ();
2286 }
2287 break;
2288
2289 case tic6x_coding_crlo:
2290 if (operands[opno].form != TIC6X_OP_CTRL)
2291 abort ();
2292 value = tic6x_ctrl_table[operands[opno].value.ctrl].crlo;
2293 break;
2294
2295 case tic6x_coding_crhi:
2296 if (operands[opno].form != TIC6X_OP_CTRL)
2297 abort ();
2298 value = 0;
2299 break;
2300
2301 case tic6x_coding_reg_shift:
2302 if (operands[opno].form != TIC6X_OP_REGPAIR)
2303 abort ();
2304 value = operands[opno].value.reg.num >> 1;
2305 break;
2306
2307 case tic6x_coding_mem_offset:
2308 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG)
2309 abort ();
2310 mem = operands[opno].value.mem;
2311 tic6x_default_mem_ref (&mem);
2312 if (mem.offset_is_reg)
2313 {
2314 if (mem.scaled != tic6x_offset_scaled)
2315 abort ();
2316 value = mem.offset.reg.num;
2317 }
2318 else
2319 {
2320 int scale;
2321
2322 if (mem.offset.exp.X_op != O_constant)
2323 abort ();
2324 switch (mem.scaled)
2325 {
2326 case tic6x_offset_scaled:
2327 scale = 1;
2328 break;
2329
2330 case tic6x_offset_unscaled:
2331 scale = opct->operand_info[opno].size;
2332 if (scale != 1 && scale != 2 && scale != 4 && scale != 8)
2333 abort ();
2334 break;
2335
2336 default:
2337 abort ();
2338 }
2339 if (mem.offset.exp.X_add_number < 0
2340 || mem.offset.exp.X_add_number >= (1 << fldd->width) * scale)
2341 {
2342 if (print_errors)
2343 as_bad (_("offset in operand %u of '%.*s' out of range"),
2344 opno + 1, opc_len, str);
2345 *ok = FALSE;
2346 return 0;
2347 }
2348 if (mem.offset.exp.X_add_number % scale)
2349 {
2350 if (print_errors)
2351 as_bad (_("offset in operand %u of '%.*s' not "
2352 "divisible by %u"),
2353 opno + 1, opc_len, str, scale);
2354 *ok = FALSE;
2355 return 0;
2356 }
2357 value = mem.offset.exp.X_add_number / scale;
2358 }
2359 break;
2360
2361 case tic6x_coding_mem_offset_noscale:
2362 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2363 abort ();
2364 mem = operands[opno].value.mem;
2365 tic6x_default_mem_ref (&mem);
2366 if (mem.offset_is_reg)
2367 value = mem.offset.reg.num;
2368 else
2369 {
2370 if (mem.offset.exp.X_op != O_constant)
2371 abort ();
2372 if (mem.offset.exp.X_add_number < 0
2373 || mem.offset.exp.X_add_number >= (1 << fldd->width))
2374 {
2375 if (print_errors)
2376 as_bad (_("offset in operand %u of '%.*s' out of range"),
2377 opno + 1, opc_len, str);
2378 *ok = FALSE;
2379 return 0;
2380 }
2381 value = mem.offset.exp.X_add_number;
2382 }
2383 break;
2384
2385 case tic6x_coding_mem_mode:
2386 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG
2387 && operands[opno].form != TIC6X_OP_MEM_UNREG)
2388 abort ();
2389 mem = operands[opno].value.mem;
2390 tic6x_default_mem_ref (&mem);
2391 switch (mem.mod)
2392 {
2393 case tic6x_mem_mod_plus:
2394 value = 1;
2395 break;
2396
2397 case tic6x_mem_mod_minus:
2398 value = 0;
2399 break;
2400
2401 case tic6x_mem_mod_preinc:
2402 value = 9;
2403 break;
2404
2405 case tic6x_mem_mod_predec:
2406 value = 8;
2407 break;
2408
2409 case tic6x_mem_mod_postinc:
2410 value = 11;
2411 break;
2412
2413 case tic6x_mem_mod_postdec:
2414 value = 10;
2415 break;
2416
2417 default:
2418 abort ();
2419 }
2420 value += (mem.offset_is_reg ? 4 : 0);
2421 break;
2422
2423 case tic6x_coding_scaled:
2424 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2425 abort ();
2426 mem = operands[opno].value.mem;
2427 tic6x_default_mem_ref (&mem);
2428 switch (mem.scaled)
2429 {
2430 case tic6x_offset_unscaled:
2431 value = 0;
2432 break;
2433
2434 case tic6x_offset_scaled:
2435 value = 1;
2436 break;
2437
2438 default:
2439 abort ();
2440 }
2441 break;
2442
2443 case tic6x_coding_spmask:
2444 /* The position of such a field is hardcoded in the handling
2445 of "||^". */
2446 if (fldd->low_pos != 18)
2447 abort ();
2448 value = 0;
2449 for (opno = 0; opno < num_operands; opno++)
2450 {
2451 unsigned int v;
2452
2453 v = tic6x_encode_spmask (operands[opno].value.func_unit.base,
2454 operands[opno].value.func_unit.side);
2455 if (value & v)
2456 {
2457 if (print_errors)
2458 as_bad (_("functional unit already masked for operand "
2459 "%u of '%.*s'"), opno + 1, opc_len, str);
2460 *ok = FALSE;
2461 return 0;
2462 }
2463 value |= v;
2464 }
2465 break;
2466
2467 case tic6x_coding_reg_unused:
2468 /* This is a placeholder; correct handling goes along with
2469 resource constraint checks. */
2470 value = 0;
2471 break;
2472
2473 case tic6x_coding_fstg:
2474 case tic6x_coding_fcyc:
2475 if (operands[opno].form != TIC6X_OP_EXP)
2476 abort ();
2477 if (operands[opno].value.exp.X_op != O_constant)
2478 abort ();
2479 if (!sploop_ii)
2480 {
2481 if (print_errors)
2482 as_bad (_("'%.*s' instruction not in a software "
2483 "pipelined loop"),
2484 opc_len, str);
2485 *ok = FALSE;
2486 return 0;
2487 }
2488
2489 if (sploop_ii <= 1)
2490 fcyc_bits = 0;
2491 else if (sploop_ii <= 2)
2492 fcyc_bits = 1;
2493 else if (sploop_ii <= 4)
2494 fcyc_bits = 2;
2495 else if (sploop_ii <= 8)
2496 fcyc_bits = 3;
2497 else if (sploop_ii <= 14)
2498 fcyc_bits = 4;
2499 else
2500 abort ();
2501 if (fcyc_bits > fldd->width)
2502 abort ();
2503
2504 if (opct->variable_fields[fld].coding_method == tic6x_coding_fstg)
2505 {
2506 if (operands[opno].value.exp.X_add_number < 0
2507 || (operands[opno].value.exp.X_add_number
2508 >= (1 << (fldd->width - fcyc_bits))))
2509 {
2510 if (print_errors)
2511 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2512 opc_len, str);
2513 *ok = FALSE;
2514 return 0;
2515 }
2516 value = operands[opno].value.exp.X_add_number << fcyc_bits;
2517 }
2518 else
2519 {
2520 if (operands[opno].value.exp.X_add_number < 0
2521 || (operands[opno].value.exp.X_add_number >= sploop_ii))
2522 {
2523 if (print_errors)
2524 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2525 opc_len, str);
2526 *ok = FALSE;
2527 return 0;
2528 }
2529 value = operands[opno].value.exp.X_add_number;
2530 }
2531 break;
2532
2533 case tic6x_coding_fu:
2534 value = func_unit_side == 2 ? 1 : 0;
2535 break;
2536
2537 case tic6x_coding_data_fu:
2538 value = func_unit_data_side == 2 ? 1 : 0;
2539 break;
2540
2541 case tic6x_coding_xpath:
2542 value = func_unit_cross;
2543 break;
2544
2545 default:
2546 abort ();
2547 }
2548
2549 for (ffld = 0; ffld < opct->num_fixed_fields; ffld++)
2550 if ((opct->fixed_fields[ffld].field_id
2551 == opct->variable_fields[fld].field_id)
2552 && (value < opct->fixed_fields[ffld].min_val
2553 || value > opct->fixed_fields[ffld].max_val))
2554 {
2555 if (print_errors)
2556 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2557 opc_len, str);
2558 *ok = FALSE;
2559 return 0;
2560 }
2561
2562 opcode_value |= value << fldd->low_pos;
2563 }
2564
2565 if (this_line_creg)
2566 {
2567 const tic6x_insn_field *creg;
2568 const tic6x_insn_field *z;
2569
2570 creg = tic6x_field_from_fmt (fmt, tic6x_field_creg);
2571 if (creg == NULL)
2572 {
2573 if (print_errors)
2574 as_bad (_("instruction '%.*s' cannot be predicated"),
2575 opc_len, str);
2576 *ok = FALSE;
2577 return 0;
2578 }
2579 z = tic6x_field_from_fmt (fmt, tic6x_field_z);
2580 /* If there is a creg field, there must be a z field; otherwise
2581 there is an error in the format table. */
2582 if (z == NULL)
2583 abort ();
2584
2585 opcode_value |= this_line_creg << creg->low_pos;
2586 opcode_value |= this_line_z << z->low_pos;
2587 }
2588
2589 *ok = TRUE;
2590 return opcode_value;
2591 }
2592
2593 /* Convert the target integer stored in N bytes in BUF to a host
2594 integer, returning that value. */
2595
2596 static valueT
2597 md_chars_to_number (char *buf, int n)
2598 {
2599 valueT result = 0;
2600 unsigned char *p = (unsigned char *) buf;
2601
2602 if (target_big_endian)
2603 {
2604 while (n--)
2605 {
2606 result <<= 8;
2607 result |= (*p++ & 0xff);
2608 }
2609 }
2610 else
2611 {
2612 while (n--)
2613 {
2614 result <<= 8;
2615 result |= (p[n] & 0xff);
2616 }
2617 }
2618
2619 return result;
2620 }
2621
2622 /* Assemble the instruction starting at STR (an opcode, with the
2623 opcode name all-lowercase). */
2624
2625 void
2626 md_assemble (char *str)
2627 {
2628 char *p;
2629 int opc_len;
2630 bfd_boolean this_line_parallel;
2631 bfd_boolean this_line_spmask;
2632 unsigned int this_line_creg;
2633 unsigned int this_line_z;
2634 tic6x_label_list *this_insn_label_list;
2635 segment_info_type *seginfo;
2636 tic6x_opcode_list *opc_list, *opc;
2637 tic6x_func_unit_base func_unit_base = tic6x_func_unit_nfu;
2638 unsigned int func_unit_side = 0;
2639 unsigned int func_unit_cross = 0;
2640 unsigned int cross_side = 0;
2641 unsigned int func_unit_data_side = 0;
2642 unsigned int max_matching_opcodes, num_matching_opcodes;
2643 tic6x_opcode_id *opcm = NULL;
2644 unsigned int opc_rank[TIC6X_NUM_PREFER];
2645 const tic6x_opcode *opct = NULL;
2646 int min_rank, try_rank, max_rank;
2647 bfd_boolean num_operands_permitted[TIC6X_MAX_SOURCE_OPERANDS + 1]
2648 = { FALSE };
2649 unsigned int operand_forms[TIC6X_MAX_SOURCE_OPERANDS] = { 0 };
2650 tic6x_operand operands[TIC6X_MAX_SOURCE_OPERANDS];
2651 unsigned int max_num_operands;
2652 unsigned int num_operands_read;
2653 bfd_boolean ok_this_arch, ok_this_fu, ok_this_arch_fu;
2654 bfd_boolean bad_operands = FALSE;
2655 unsigned int opcode_value;
2656 bfd_boolean encoded_ok;
2657 bfd_boolean fix_needed = FALSE;
2658 expressionS *fix_exp = NULL;
2659 int fix_pcrel = 0;
2660 bfd_reloc_code_real_type fx_r_type = BFD_RELOC_UNUSED;
2661 bfd_boolean fix_adda = FALSE;
2662 fragS *insn_frag;
2663 char *output;
2664
2665 p = str;
2666 while (*p && !is_end_of_line[(unsigned char) *p] && *p != ' ')
2667 p++;
2668
2669 /* This function should only have been called when there is actually
2670 an instruction to assemble. */
2671 if (p == str)
2672 abort ();
2673
2674 /* Now an instruction has been seen, architecture attributes from
2675 .arch directives merge with rather than overriding the previous
2676 value. */
2677 tic6x_seen_insns = TRUE;
2678 /* If no .arch directives or -march options have been seen, we are
2679 assessing instruction validity based on the C674X default, so set
2680 the attribute accordingly. */
2681 if (tic6x_arch_attribute == C6XABI_Tag_CPU_arch_none)
2682 tic6x_arch_attribute = C6XABI_Tag_CPU_arch_C674X;
2683
2684 /* Reset global settings for parallel bars and predicates now to
2685 avoid extra errors if there are problems with this opcode. */
2686 this_line_parallel = tic6x_line_parallel;
2687 this_line_spmask = tic6x_line_spmask;
2688 this_line_creg = tic6x_line_creg;
2689 this_line_z = tic6x_line_z;
2690 tic6x_line_parallel = FALSE;
2691 tic6x_line_spmask = FALSE;
2692 tic6x_line_creg = 0;
2693 tic6x_line_z = 0;
2694 seginfo = seg_info (now_seg);
2695 this_insn_label_list = seginfo->tc_segment_info_data.label_list;
2696 seginfo->tc_segment_info_data.label_list = NULL;
2697
2698 opc_list = hash_find_n (opcode_hash, str, p - str);
2699 if (opc_list == NULL)
2700 {
2701 char c = *p;
2702 *p = 0;
2703 as_bad (_("unknown opcode '%s'"), str);
2704 *p = c;
2705 return;
2706 }
2707
2708 opc_len = p - str;
2709 skip_whitespace (p);
2710
2711 /* See if there is something that looks like a functional unit
2712 specifier. */
2713 if (*p == '.')
2714 {
2715 bfd_boolean good_func_unit;
2716 tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
2717 unsigned int maybe_side = 0;
2718 unsigned int maybe_cross = 0;
2719 unsigned int maybe_data_side = 0;
2720
2721 good_func_unit = tic6x_parse_func_unit_base (p + 1, &maybe_base,
2722 &maybe_side);
2723
2724 if (good_func_unit)
2725 {
2726 if (p[3] == ' ' || is_end_of_line[(unsigned char) p[3]])
2727 p += 3;
2728 else if ((p[3] == 'x' || p[3] == 'X')
2729 && (p[4] == ' ' || is_end_of_line[(unsigned char) p[4]]))
2730 {
2731 maybe_cross = 1;
2732 p += 4;
2733 }
2734 else if (maybe_base == tic6x_func_unit_d
2735 && (p[3] == 't' || p[3] == 'T')
2736 && (p[4] == '1' || p[4] == '2')
2737 && (p[5] == ' ' || is_end_of_line[(unsigned char) p[5]]))
2738 {
2739 maybe_data_side = p[4] - '0';
2740 p += 5;
2741 }
2742 else
2743 good_func_unit = FALSE;
2744 }
2745
2746 if (good_func_unit)
2747 {
2748 func_unit_base = maybe_base;
2749 func_unit_side = maybe_side;
2750 func_unit_cross = maybe_cross;
2751 cross_side = (func_unit_cross ? 3 - func_unit_side : func_unit_side);
2752 func_unit_data_side = maybe_data_side;
2753 }
2754
2755 skip_whitespace (p);
2756 }
2757
2758 /* Determine which entries in the opcode table match, and the
2759 associated permitted forms of operands. */
2760 max_matching_opcodes = 0;
2761 for (opc = opc_list; opc; opc = opc->next)
2762 max_matching_opcodes++;
2763 num_matching_opcodes = 0;
2764 opcm = xmalloc (max_matching_opcodes * sizeof (*opcm));
2765 max_num_operands = 0;
2766 ok_this_arch = FALSE;
2767 ok_this_fu = FALSE;
2768 ok_this_arch_fu = FALSE;
2769 for (opc = opc_list; opc; opc = opc->next)
2770 {
2771 unsigned int num_operands;
2772 unsigned int i;
2773 bfd_boolean this_opc_arch_ok = TRUE;
2774 bfd_boolean this_opc_fu_ok = TRUE;
2775
2776 if (tic6x_insn_format_table[tic6x_opcode_table[opc->id].format].num_bits
2777 != 32)
2778 continue;
2779 if (!(tic6x_opcode_table[opc->id].isa_variants & tic6x_features))
2780 this_opc_arch_ok = FALSE;
2781 if (tic6x_opcode_table[opc->id].func_unit != func_unit_base)
2782 this_opc_fu_ok = FALSE;
2783 if (func_unit_side == 1
2784 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_B_ONLY))
2785 this_opc_fu_ok = FALSE;
2786 if (func_unit_cross
2787 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_NO_CROSS))
2788 this_opc_fu_ok = FALSE;
2789 if (!func_unit_data_side
2790 && (tic6x_opcode_table[opc->id].flags
2791 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
2792 this_opc_fu_ok = FALSE;
2793 if (func_unit_data_side
2794 && !(tic6x_opcode_table[opc->id].flags
2795 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
2796 this_opc_fu_ok = FALSE;
2797 if (func_unit_data_side == 1
2798 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_T2_ONLY))
2799 this_opc_fu_ok = FALSE;
2800 if (this_opc_arch_ok)
2801 ok_this_arch = TRUE;
2802 if (this_opc_fu_ok)
2803 ok_this_fu = TRUE;
2804 if (!this_opc_arch_ok || !this_opc_fu_ok)
2805 continue;
2806 ok_this_arch_fu = TRUE;
2807 opcm[num_matching_opcodes] = opc->id;
2808 num_matching_opcodes++;
2809 num_operands = tic6x_opcode_table[opc->id].num_operands;
2810
2811 if (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SPMASK)
2812 {
2813 if (num_operands != 1
2814 || (tic6x_opcode_table[opc->id].operand_info[0].form
2815 != tic6x_operand_func_unit))
2816 abort ();
2817 num_operands = 8;
2818 for (i = 0; i < num_operands; i++)
2819 {
2820 operand_forms[i]
2821 |= tic6x_coarse_operand_form (tic6x_operand_func_unit);
2822 num_operands_permitted[i] = TRUE;
2823 }
2824 }
2825 else
2826 {
2827 for (i = 0; i < num_operands; i++)
2828 {
2829 tic6x_operand_form f
2830 = tic6x_opcode_table[opc->id].operand_info[i].form;
2831
2832 operand_forms[i] |= tic6x_coarse_operand_form (f);
2833 }
2834 }
2835 num_operands_permitted[num_operands] = TRUE;
2836 if (num_operands > max_num_operands)
2837 max_num_operands = num_operands;
2838 }
2839
2840 if (!ok_this_arch)
2841 {
2842 as_bad (_("'%.*s' instruction not supported on this architecture"),
2843 opc_len, str);
2844 free (opcm);
2845 return;
2846 }
2847
2848 if (!ok_this_fu)
2849 {
2850 as_bad (_("'%.*s' instruction not supported on this functional unit"),
2851 opc_len, str);
2852 free (opcm);
2853 return;
2854 }
2855
2856 if (!ok_this_arch_fu)
2857 {
2858 as_bad (_("'%.*s' instruction not supported on this functional unit"
2859 " for this architecture"),
2860 opc_len, str);
2861 free (opcm);
2862 return;
2863 }
2864
2865 /* If there were no instructions matching the above availability
2866 checks, we should now have given an error and returned. */
2867 if (num_matching_opcodes == 0)
2868 abort ();
2869
2870 num_operands_read = 0;
2871 while (TRUE)
2872 {
2873 skip_whitespace (p);
2874 if (is_end_of_line[(unsigned char) *p])
2875 {
2876 if (num_operands_read > 0)
2877 {
2878 as_bad (_("missing operand after comma"));
2879 bad_operands = TRUE;
2880 }
2881 break;
2882 }
2883
2884 if (max_num_operands == 0)
2885 {
2886 as_bad (_("too many operands to '%.*s'"), opc_len, str);
2887 bad_operands = TRUE;
2888 break;
2889 }
2890
2891 if (!tic6x_parse_operand (&p, &operands[num_operands_read],
2892 operand_forms[num_operands_read], str, opc_len,
2893 num_operands_read + 1))
2894 bad_operands = TRUE;
2895 num_operands_read++;
2896
2897 if (is_end_of_line[(unsigned char) *p])
2898 break;
2899 else if (*p == ',')
2900 {
2901 p++;
2902 if (num_operands_read == max_num_operands)
2903 {
2904 as_bad (_("too many operands to '%.*s'"), opc_len, str);
2905 bad_operands = TRUE;
2906 break;
2907 }
2908 continue;
2909 }
2910 else
2911 /* Operand parsing should consume whole operands. */
2912 abort ();
2913 }
2914
2915 if (!bad_operands && !num_operands_permitted[num_operands_read])
2916 {
2917 as_bad (_("bad number of operands to '%.*s'"), opc_len, str);
2918 bad_operands = TRUE;
2919 }
2920
2921 if (!bad_operands)
2922 {
2923 /* Each operand is of the right syntactic form for some opcode
2924 choice, and the number of operands is valid. Check that each
2925 operand is OK in detail for some opcode choice with the right
2926 number of operands. */
2927 unsigned int i;
2928
2929 for (i = 0; i < num_operands_read; i++)
2930 {
2931 bfd_boolean coarse_ok = FALSE;
2932 bfd_boolean fine_ok = FALSE;
2933 tic6x_operand_match fine_failure = tic6x_match_matches;
2934 unsigned int j;
2935
2936 for (j = 0; j < num_matching_opcodes; j++)
2937 {
2938 tic6x_operand_form f;
2939 tic6x_rw rw;
2940 unsigned int cf;
2941 tic6x_operand_match this_fine_failure;
2942
2943 if (tic6x_opcode_table[opcm[j]].flags & TIC6X_FLAG_SPMASK)
2944 {
2945 f = tic6x_operand_func_unit;
2946 rw = tic6x_rw_none;
2947 }
2948 else
2949 {
2950 if (tic6x_opcode_table[opcm[j]].num_operands
2951 != num_operands_read)
2952 continue;
2953
2954 f = tic6x_opcode_table[opcm[j]].operand_info[i].form;
2955 rw = tic6x_opcode_table[opcm[j]].operand_info[i].rw;
2956 }
2957 cf = tic6x_coarse_operand_form (f);
2958
2959 if (operands[i].form != cf)
2960 continue;
2961
2962 coarse_ok = TRUE;
2963 this_fine_failure
2964 = tic6x_operand_matches_form (&operands[i], f, rw,
2965 func_unit_side,
2966 cross_side,
2967 func_unit_data_side);
2968 if (this_fine_failure == tic6x_match_matches)
2969 {
2970 fine_ok = TRUE;
2971 break;
2972 }
2973 if (fine_failure == tic6x_match_matches
2974 || fine_failure > this_fine_failure)
2975 fine_failure = this_fine_failure;
2976 }
2977
2978 /* No instructions should have operand syntactic forms only
2979 acceptable with certain numbers of operands, so no
2980 diagnostic for this case. */
2981 if (!coarse_ok)
2982 abort ();
2983
2984 if (!fine_ok)
2985 {
2986 switch (fine_failure)
2987 {
2988 case tic6x_match_non_const:
2989 as_bad (_("operand %u of '%.*s' not constant"),
2990 i + 1, opc_len, str);
2991 break;
2992
2993 case tic6x_match_wrong_side:
2994 as_bad (_("operand %u of '%.*s' on wrong side"),
2995 i + 1, opc_len, str);
2996 break;
2997
2998 case tic6x_match_bad_return:
2999 as_bad (_("operand %u of '%.*s' not a valid return "
3000 "address register"),
3001 i + 1, opc_len, str);
3002 break;
3003
3004 case tic6x_match_ctrl_write_only:
3005 as_bad (_("operand %u of '%.*s' is write-only"),
3006 i + 1, opc_len, str);
3007 break;
3008
3009 case tic6x_match_ctrl_read_only:
3010 as_bad (_("operand %u of '%.*s' is read-only"),
3011 i + 1, opc_len, str);
3012 break;
3013
3014 case tic6x_match_bad_mem:
3015 as_bad (_("operand %u of '%.*s' not a valid memory "
3016 "reference"),
3017 i + 1, opc_len, str);
3018 break;
3019
3020 case tic6x_match_bad_address:
3021 as_bad (_("operand %u of '%.*s' not a valid base "
3022 "address register"),
3023 i + 1, opc_len, str);
3024 break;
3025
3026 default:
3027 abort ();
3028 }
3029 bad_operands = TRUE;
3030 break;
3031 }
3032 }
3033 }
3034
3035 if (!bad_operands)
3036 {
3037 /* Each operand is OK for some opcode choice, and the number of
3038 operands is valid. Check whether there is an opcode choice
3039 for which all operands are simultaneously valid. */
3040 unsigned int i;
3041 bfd_boolean found_match = FALSE;
3042
3043 for (i = 0; i < TIC6X_NUM_PREFER; i++)
3044 opc_rank[i] = (unsigned int) -1;
3045
3046 min_rank = TIC6X_NUM_PREFER - 1;
3047 max_rank = 0;
3048
3049 for (i = 0; i < num_matching_opcodes; i++)
3050 {
3051 unsigned int j;
3052 bfd_boolean this_matches = TRUE;
3053
3054 if (!(tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3055 && tic6x_opcode_table[opcm[i]].num_operands != num_operands_read)
3056 continue;
3057
3058 for (j = 0; j < num_operands_read; j++)
3059 {
3060 tic6x_operand_form f;
3061 tic6x_rw rw;
3062
3063 if (tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3064 {
3065 f = tic6x_operand_func_unit;
3066 rw = tic6x_rw_none;
3067 }
3068 else
3069 {
3070 f = tic6x_opcode_table[opcm[i]].operand_info[j].form;
3071 rw = tic6x_opcode_table[opcm[i]].operand_info[j].rw;
3072 }
3073 if (tic6x_operand_matches_form (&operands[j], f, rw,
3074 func_unit_side,
3075 cross_side,
3076 func_unit_data_side)
3077 != tic6x_match_matches)
3078 {
3079 this_matches = FALSE;
3080 break;
3081 }
3082 }
3083
3084 if (this_matches)
3085 {
3086 int rank = TIC6X_PREFER_VAL (tic6x_opcode_table[opcm[i]].flags);
3087
3088 if (rank < min_rank)
3089 min_rank = rank;
3090 if (rank > max_rank)
3091 max_rank = rank;
3092
3093 if (opc_rank[rank] == (unsigned int) -1)
3094 opc_rank[rank] = i;
3095 else
3096 /* The opcode table should provide a total ordering
3097 for all cases where multiple matches may get
3098 here. */
3099 abort ();
3100
3101 found_match = TRUE;
3102 }
3103 }
3104
3105 if (!found_match)
3106 {
3107 as_bad (_("bad operand combination for '%.*s'"), opc_len, str);
3108 bad_operands = TRUE;
3109 }
3110 }
3111
3112 if (bad_operands)
3113 {
3114 free (opcm);
3115 return;
3116 }
3117
3118 opcode_value = 0;
3119 encoded_ok = FALSE;
3120 for (try_rank = max_rank; try_rank >= min_rank; try_rank--)
3121 {
3122 fix_needed = FALSE;
3123
3124 if (opc_rank[try_rank] == (unsigned int) -1)
3125 continue;
3126
3127 opcode_value = tic6x_try_encode (opcm[opc_rank[try_rank]], operands,
3128 num_operands_read, this_line_creg,
3129 this_line_z, func_unit_side,
3130 func_unit_cross, func_unit_data_side,
3131 seginfo->tc_segment_info_data.sploop_ii,
3132 &fix_exp, &fix_pcrel, &fx_r_type,
3133 &fix_adda, &fix_needed, &encoded_ok,
3134 (try_rank == min_rank ? TRUE : FALSE),
3135 str, opc_len);
3136 if (encoded_ok)
3137 {
3138 opct = &tic6x_opcode_table[opcm[opc_rank[try_rank]]];
3139 break;
3140 }
3141 }
3142
3143 free (opcm);
3144
3145 if (!encoded_ok)
3146 return;
3147
3148 if (this_line_parallel)
3149 {
3150 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag;
3151 if (insn_frag == NULL)
3152 {
3153 as_bad (_("parallel instruction not following another instruction"));
3154 return;
3155 }
3156
3157 if (insn_frag->fr_fix >= 32)
3158 {
3159 as_bad (_("too many instructions in execute packet"));
3160 return;
3161 }
3162
3163 if (this_insn_label_list != NULL)
3164 as_bad (_("label not at start of execute packet"));
3165
3166 if (opct->flags & TIC6X_FLAG_FIRST)
3167 as_bad (_("'%.*s' instruction not at start of execute packet"),
3168 opc_len, str);
3169
3170 *seginfo->tc_segment_info_data.last_insn_lsb |= 0x1;
3171 output = insn_frag->fr_literal + insn_frag->fr_fix;
3172 }
3173 else
3174 {
3175 tic6x_label_list *l;
3176
3177 seginfo->tc_segment_info_data.spmask_addr = NULL;
3178 seginfo->tc_segment_info_data.func_units_used = 0;
3179
3180 /* Start a new frag for this execute packet. */
3181 if (frag_now_fix () != 0)
3182 {
3183 if (frag_now->fr_type != rs_machine_dependent)
3184 frag_wane (frag_now);
3185
3186 frag_new (0);
3187 }
3188 frag_grow (32);
3189 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag = frag_now;
3190 for (l = this_insn_label_list; l; l = l->next)
3191 {
3192 symbol_set_frag (l->label, frag_now);
3193 S_SET_VALUE (l->label, 0);
3194 S_SET_SEGMENT (l->label, now_seg);
3195 }
3196 tic6x_free_label_list (this_insn_label_list);
3197 dwarf2_emit_insn (0);
3198 output = frag_var (rs_machine_dependent, 32, 32, 0, NULL, 0, NULL);
3199 /* This must be the same as the frag to which a pointer was just
3200 saved. */
3201 if (output != insn_frag->fr_literal)
3202 abort ();
3203 insn_frag->tc_frag_data.is_insns = TRUE;
3204 insn_frag->tc_frag_data.can_cross_fp_boundary
3205 = tic6x_can_cross_fp_boundary;
3206 }
3207
3208 if (func_unit_base != tic6x_func_unit_nfu)
3209 {
3210 unsigned int func_unit_enc;
3211
3212 func_unit_enc = tic6x_encode_spmask (func_unit_base, func_unit_side);
3213
3214 if (seginfo->tc_segment_info_data.func_units_used & func_unit_enc)
3215 as_bad (_("functional unit already used in this execute packet"));
3216
3217 seginfo->tc_segment_info_data.func_units_used |= func_unit_enc;
3218 }
3219
3220 if (opct->flags & TIC6X_FLAG_SPLOOP)
3221 {
3222 if (seginfo->tc_segment_info_data.sploop_ii)
3223 as_bad (_("nested software pipelined loop"));
3224 if (num_operands_read != 1
3225 || operands[0].form != TIC6X_OP_EXP
3226 || operands[0].value.exp.X_op != O_constant)
3227 abort ();
3228 seginfo->tc_segment_info_data.sploop_ii
3229 = operands[0].value.exp.X_add_number;
3230 }
3231 else if (opct->flags & TIC6X_FLAG_SPKERNEL)
3232 {
3233 if (!seginfo->tc_segment_info_data.sploop_ii)
3234 as_bad (_("'%.*s' instruction not in a software pipelined loop"),
3235 opc_len, str);
3236 seginfo->tc_segment_info_data.sploop_ii = 0;
3237 }
3238
3239 if (this_line_spmask)
3240 {
3241 if (seginfo->tc_segment_info_data.spmask_addr == NULL)
3242 as_bad (_("'||^' without previous SPMASK"));
3243 else if (func_unit_base == tic6x_func_unit_nfu)
3244 as_bad (_("cannot mask instruction using no functional unit"));
3245 else
3246 {
3247 unsigned int spmask_opcode;
3248 unsigned int mask_bit;
3249
3250 spmask_opcode
3251 = md_chars_to_number (seginfo->tc_segment_info_data.spmask_addr,
3252 4);
3253 mask_bit = tic6x_encode_spmask (func_unit_base, func_unit_side);
3254 mask_bit <<= 18;
3255 if (spmask_opcode & mask_bit)
3256 as_bad (_("functional unit already masked"));
3257 spmask_opcode |= mask_bit;
3258 md_number_to_chars (seginfo->tc_segment_info_data.spmask_addr,
3259 spmask_opcode, 4);
3260 }
3261 }
3262
3263 record_alignment (now_seg, 5);
3264 md_number_to_chars (output, opcode_value, 4);
3265 if (fix_needed)
3266 tic6x_fix_new_exp (insn_frag, output - insn_frag->fr_literal, 4, fix_exp,
3267 fix_pcrel, fx_r_type, fix_adda);
3268 insn_frag->fr_fix += 4;
3269 insn_frag->fr_var -= 4;
3270 seginfo->tc_segment_info_data.last_insn_lsb
3271 = (target_big_endian ? output + 3 : output);
3272 if (opct->flags & TIC6X_FLAG_SPMASK)
3273 seginfo->tc_segment_info_data.spmask_addr = output;
3274 }
3275
3276 /* Modify NEWVAL (32-bit) by inserting VALUE, shifted right by SHIFT
3277 and the least significant BITS bits taken, at position POS. */
3278 #define MODIFY_VALUE(NEWVAL, VALUE, SHIFT, POS, BITS) \
3279 do { \
3280 (NEWVAL) &= 0xffffffffU & ~(((1U << (BITS)) - 1) << (POS)); \
3281 (NEWVAL) |= (((VALUE) >> (SHIFT)) & ((1U << (BITS)) - 1)) << (POS); \
3282 } while (0)
3283
3284 /* Apply a fixup to the object file. */
3285
3286 void
3287 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
3288 {
3289 offsetT value = *valP;
3290 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3291
3292 value = SEXT (value);
3293 *valP = value;
3294
3295 fixP->fx_offset = SEXT (fixP->fx_offset);
3296
3297 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
3298 fixP->fx_done = 1;
3299
3300 /* We do our own overflow checks. */
3301 fixP->fx_no_overflow = 1;
3302
3303 switch (fixP->fx_r_type)
3304 {
3305 case BFD_RELOC_NONE:
3306 /* Force output to the object file. */
3307 fixP->fx_done = 0;
3308 break;
3309
3310 case BFD_RELOC_32:
3311 if (fixP->fx_done || !seg->use_rela_p)
3312 md_number_to_chars (buf, value, 4);
3313 break;
3314
3315 case BFD_RELOC_16:
3316 if (fixP->fx_done || !seg->use_rela_p)
3317 {
3318 if (value < -0x8000 || value > 0xffff)
3319 as_bad_where (fixP->fx_file, fixP->fx_line,
3320 _("value too large for 2-byte field"));
3321 md_number_to_chars (buf, value, 2);
3322 }
3323 break;
3324
3325 case BFD_RELOC_8:
3326 if (fixP->fx_done || !seg->use_rela_p)
3327 {
3328 if (value < -0x80 || value > 0xff)
3329 as_bad_where (fixP->fx_file, fixP->fx_line,
3330 _("value too large for 1-byte field"));
3331 md_number_to_chars (buf, value, 1);
3332 }
3333 break;
3334
3335 case BFD_RELOC_C6000_ABS_S16:
3336 case BFD_RELOC_C6000_ABS_L16:
3337 case BFD_RELOC_C6000_SBR_S16:
3338 case BFD_RELOC_C6000_SBR_L16_B:
3339 case BFD_RELOC_C6000_SBR_L16_H:
3340 case BFD_RELOC_C6000_SBR_L16_W:
3341 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3342 if (fixP->fx_done || !seg->use_rela_p)
3343 {
3344 offsetT newval = md_chars_to_number (buf, 4);
3345 int shift;
3346
3347 switch (fixP->fx_r_type)
3348 {
3349 case BFD_RELOC_C6000_SBR_L16_H:
3350 shift = 1;
3351 break;
3352
3353 case BFD_RELOC_C6000_SBR_L16_W:
3354 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3355 shift = 2;
3356 break;
3357
3358 default:
3359 shift = 0;
3360 break;
3361 }
3362
3363 MODIFY_VALUE (newval, value, shift, 7, 16);
3364 if ((value < -0x8000 || value > 0x7fff)
3365 && (fixP->fx_r_type == BFD_RELOC_C6000_ABS_S16
3366 || fixP->fx_r_type == BFD_RELOC_C6000_SBR_S16))
3367 as_bad_where (fixP->fx_file, fixP->fx_line,
3368 _("immediate offset out of range"));
3369
3370 md_number_to_chars (buf, newval, 4);
3371 }
3372 if (fixP->fx_done
3373 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_S16
3374 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_L16)
3375 abort ();
3376 break;
3377
3378 case BFD_RELOC_C6000_ABS_H16:
3379 case BFD_RELOC_C6000_SBR_H16_B:
3380 case BFD_RELOC_C6000_SBR_H16_H:
3381 case BFD_RELOC_C6000_SBR_H16_W:
3382 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3383 if (fixP->fx_done || !seg->use_rela_p)
3384 {
3385 offsetT newval = md_chars_to_number (buf, 4);
3386 int shift;
3387
3388 switch (fixP->fx_r_type)
3389 {
3390 case BFD_RELOC_C6000_SBR_H16_H:
3391 shift = 17;
3392 break;
3393
3394 case BFD_RELOC_C6000_SBR_H16_W:
3395 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3396 shift = 18;
3397 break;
3398
3399 default:
3400 shift = 16;
3401 break;
3402 }
3403
3404 MODIFY_VALUE (newval, value, shift, 7, 16);
3405
3406 md_number_to_chars (buf, newval, 4);
3407 }
3408 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_ABS_H16)
3409 abort ();
3410 break;
3411
3412 case BFD_RELOC_C6000_SBR_U15_B:
3413 if (fixP->fx_done || !seg->use_rela_p)
3414 {
3415 offsetT newval = md_chars_to_number (buf, 4);
3416
3417 MODIFY_VALUE (newval, value, 0, 8, 15);
3418 if (value < 0 || value > 0x7fff)
3419 as_bad_where (fixP->fx_file, fixP->fx_line,
3420 _("immediate offset out of range"));
3421
3422 md_number_to_chars (buf, newval, 4);
3423 }
3424 break;
3425
3426 case BFD_RELOC_C6000_SBR_U15_H:
3427 if (fixP->fx_done || !seg->use_rela_p)
3428 {
3429 offsetT newval = md_chars_to_number (buf, 4);
3430
3431 /* Constant ADDA operands, processed as constant when the
3432 instruction is parsed, are encoded as-is rather than
3433 shifted. If the operand of an ADDA instruction is now
3434 constant (for example, the difference between two labels
3435 found after the instruction), ensure it is encoded the
3436 same way it would have been if the constant value had
3437 been known when the instruction was parsed. */
3438 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3439 value <<= 1;
3440
3441 MODIFY_VALUE (newval, value, 1, 8, 15);
3442 if (value & 1)
3443 as_bad_where (fixP->fx_file, fixP->fx_line,
3444 _("immediate offset not 2-byte-aligned"));
3445 if (value < 0 || value > 0xfffe)
3446 as_bad_where (fixP->fx_file, fixP->fx_line,
3447 _("immediate offset out of range"));
3448
3449 md_number_to_chars (buf, newval, 4);
3450 }
3451 break;
3452
3453 case BFD_RELOC_C6000_SBR_U15_W:
3454 case BFD_RELOC_C6000_SBR_GOT_U15_W:
3455 if (fixP->fx_done || !seg->use_rela_p)
3456 {
3457 offsetT newval = md_chars_to_number (buf, 4);
3458
3459 /* Constant ADDA operands, processed as constant when the
3460 instruction is parsed, are encoded as-is rather than
3461 shifted. If the operand of an ADDA instruction is now
3462 constant (for example, the difference between two labels
3463 found after the instruction), ensure it is encoded the
3464 same way it would have been if the constant value had
3465 been known when the instruction was parsed. */
3466 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3467 value <<= 2;
3468
3469 MODIFY_VALUE (newval, value, 2, 8, 15);
3470 if (value & 3)
3471 as_bad_where (fixP->fx_file, fixP->fx_line,
3472 _("immediate offset not 4-byte-aligned"));
3473 if (value < 0 || value > 0x1fffc)
3474 as_bad_where (fixP->fx_file, fixP->fx_line,
3475 _("immediate offset out of range"));
3476
3477 md_number_to_chars (buf, newval, 4);
3478 }
3479 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_SBR_U15_W)
3480 abort ();
3481 break;
3482
3483 case BFD_RELOC_C6000_DSBT_INDEX:
3484 if (value != 0)
3485 as_bad_where (fixP->fx_file, fixP->fx_line,
3486 _("addend used with $DSBT_INDEX"));
3487 if (fixP->fx_done)
3488 abort ();
3489 break;
3490
3491 case BFD_RELOC_C6000_PCR_S21:
3492 if (fixP->fx_done || !seg->use_rela_p)
3493 {
3494 offsetT newval = md_chars_to_number (buf, 4);
3495
3496 MODIFY_VALUE (newval, value, 2, 7, 21);
3497
3498 if (value & 3)
3499 as_bad_where (fixP->fx_file, fixP->fx_line,
3500 _("PC-relative offset not 4-byte-aligned"));
3501 if (value < -0x400000 || value > 0x3ffffc)
3502 as_bad_where (fixP->fx_file, fixP->fx_line,
3503 _("PC-relative offset out of range"));
3504
3505 md_number_to_chars (buf, newval, 4);
3506 }
3507 break;
3508
3509 case BFD_RELOC_C6000_PCR_S12:
3510 if (fixP->fx_done || !seg->use_rela_p)
3511 {
3512 offsetT newval = md_chars_to_number (buf, 4);
3513
3514 MODIFY_VALUE (newval, value, 2, 16, 12);
3515
3516 if (value & 3)
3517 as_bad_where (fixP->fx_file, fixP->fx_line,
3518 _("PC-relative offset not 4-byte-aligned"));
3519 if (value < -0x2000 || value > 0x1ffc)
3520 as_bad_where (fixP->fx_file, fixP->fx_line,
3521 _("PC-relative offset out of range"));
3522
3523 md_number_to_chars (buf, newval, 4);
3524 }
3525 break;
3526
3527 case BFD_RELOC_C6000_PCR_S10:
3528 if (fixP->fx_done || !seg->use_rela_p)
3529 {
3530 offsetT newval = md_chars_to_number (buf, 4);
3531
3532 MODIFY_VALUE (newval, value, 2, 13, 10);
3533
3534 if (value & 3)
3535 as_bad_where (fixP->fx_file, fixP->fx_line,
3536 _("PC-relative offset not 4-byte-aligned"));
3537 if (value < -0x800 || value > 0x7fc)
3538 as_bad_where (fixP->fx_file, fixP->fx_line,
3539 _("PC-relative offset out of range"));
3540
3541 md_number_to_chars (buf, newval, 4);
3542 }
3543 break;
3544
3545 case BFD_RELOC_C6000_PCR_S7:
3546 if (fixP->fx_done || !seg->use_rela_p)
3547 {
3548 offsetT newval = md_chars_to_number (buf, 4);
3549
3550 MODIFY_VALUE (newval, value, 2, 16, 7);
3551
3552 if (value & 3)
3553 as_bad_where (fixP->fx_file, fixP->fx_line,
3554 _("PC-relative offset not 4-byte-aligned"));
3555 if (value < -0x100 || value > 0xfc)
3556 as_bad_where (fixP->fx_file, fixP->fx_line,
3557 _("PC-relative offset out of range"));
3558
3559 md_number_to_chars (buf, newval, 4);
3560 }
3561 break;
3562
3563 default:
3564 abort ();
3565 }
3566 }
3567
3568 /* Convert a floating-point number to target (IEEE) format. */
3569
3570 char *
3571 md_atof (int type, char *litP, int *sizeP)
3572 {
3573 return ieee_md_atof (type, litP, sizeP, target_big_endian);
3574 }
3575
3576 /* Adjust the frags in SECTION (see tic6x_end). */
3577
3578 static void
3579 tic6x_adjust_section (bfd *abfd ATTRIBUTE_UNUSED, segT section,
3580 void *dummy ATTRIBUTE_UNUSED)
3581 {
3582 segment_info_type *info;
3583 frchainS *frchp;
3584 fragS *fragp;
3585 bfd_boolean have_code = FALSE;
3586 bfd_boolean have_non_code = FALSE;
3587
3588 info = seg_info (section);
3589 if (info == NULL)
3590 return;
3591
3592 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
3593 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
3594 switch (fragp->fr_type)
3595 {
3596 case rs_machine_dependent:
3597 if (fragp->tc_frag_data.is_insns)
3598 have_code = TRUE;
3599 break;
3600
3601 case rs_dummy:
3602 case rs_fill:
3603 if (fragp->fr_fix > 0)
3604 have_non_code = TRUE;
3605 break;
3606
3607 default:
3608 have_non_code = TRUE;
3609 break;
3610 }
3611
3612 /* Process alignment requirements in a code-only section. */
3613 if (have_code && !have_non_code)
3614 {
3615 /* If we need to insert an odd number of instructions to meet an
3616 alignment requirement, there must have been an odd number of
3617 instructions since the last 8-byte-aligned execute packet
3618 boundary. So there must have been an execute packet with an
3619 odd number (and so a number fewer than 8) of instructions
3620 into which we can insert a NOP without breaking any previous
3621 alignments.
3622
3623 If then we need to insert a number 2 mod 4 of instructions,
3624 the number of instructions since the last 16-byte-aligned
3625 execute packet boundary must be 2 mod 4. So between that
3626 boundary and the following 8-byte-aligned boundary there must
3627 either be at least one execute packet with 2-mod-4
3628 instructions, or at least two with an odd number of
3629 instructions; again, greedily inserting NOPs as soon as
3630 possible suffices to meet the alignment requirement.
3631
3632 If then we need to insert 4 instructions, we look between the
3633 last 32-byte-aligned boundary and the following
3634 16-byte-aligned boundary. The sizes of the execute packets
3635 in this range total 4 instructions mod 8, so again there is
3636 room for greedy insertion of NOPs to meet the alignment
3637 requirement, and before any intermediate point with 8-byte
3638 (2-instruction) alignment requirement the sizes of execute
3639 packets (and so the room for NOPs) will total 2 instructions
3640 mod 4 so greedy insertion will not break such alignments.
3641
3642 So we can always meet these alignment requirements by
3643 inserting NOPs in parallel with existing execute packets, and
3644 by induction the approach described above inserts the minimum
3645 number of such NOPs. */
3646
3647 /* The number of NOPs we are currently looking to insert, if we
3648 have gone back to insert NOPs. */
3649 unsigned int want_insert = 0;
3650
3651 /* Out of that number, the number inserted so far in the current
3652 stage of the above algorithm. */
3653 unsigned int want_insert_done_so_far = 0;
3654
3655 /* The position mod 32 at the start of the current frag. */
3656 unsigned int pos = 0;
3657
3658 /* The locations in the frag chain of the most recent frags at
3659 the start of which there is the given alignment. */
3660 frchainS *frchp_last32, *frchp_last16, *frchp_last8;
3661 fragS *fragp_last32, *fragp_last16, *fragp_last8;
3662 unsigned int pos_last32, pos_last16, pos_last8;
3663
3664 frchp_last32 = frchp_last16 = frchp_last8 = info->frchainP;
3665 fragp_last32 = fragp_last16 = fragp_last8 = info->frchainP->frch_root;
3666 pos_last32 = pos_last16 = pos_last8 = 0;
3667
3668 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
3669 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
3670 look_at_frag:
3671 {
3672 bfd_boolean go_back = FALSE;
3673 frchainS *frchp_next;
3674 fragS *fragp_next;
3675
3676 if (fragp->fr_type != rs_machine_dependent)
3677 continue;
3678
3679 if (fragp->tc_frag_data.is_insns
3680 && pos + fragp->fr_fix > 32
3681 && !fragp->tc_frag_data.can_cross_fp_boundary)
3682 {
3683 /* As described above, we should always have met an
3684 alignment requirement by the time we come back to
3685 it. */
3686 if (want_insert)
3687 abort ();
3688
3689 if (pos & 3)
3690 abort ();
3691 want_insert = (32 - pos) >> 2;
3692 if (want_insert > 7)
3693 abort ();
3694 want_insert_done_so_far = 0;
3695 go_back = TRUE;
3696 }
3697
3698 if (!fragp->tc_frag_data.is_insns)
3699 {
3700 unsigned int would_insert_bytes;
3701
3702 if (!(pos & ((1 << fragp->fr_offset) - 1)))
3703 /* This alignment requirement is already met. */
3704 continue;
3705
3706 /* As described above, we should always have met an
3707 alignment requirement by the time we come back to
3708 it. */
3709 if (want_insert)
3710 abort ();
3711
3712 /* We may not be able to meet this requirement within
3713 the given number of characters. */
3714 would_insert_bytes
3715 = ((1 << fragp->fr_offset)
3716 - (pos & ((1 << fragp->fr_offset) - 1)));
3717
3718 if (fragp->fr_subtype != 0
3719 && would_insert_bytes > fragp->fr_subtype)
3720 continue;
3721
3722 /* An unmet alignment must be 8, 16 or 32 bytes;
3723 smaller ones must always be met within code-only
3724 sections and larger ones cause the section not to
3725 be code-only. */
3726 if (fragp->fr_offset != 3
3727 && fragp->fr_offset != 4
3728 && fragp->fr_offset != 5)
3729 abort ();
3730
3731 if (would_insert_bytes & 3)
3732 abort ();
3733 want_insert = would_insert_bytes >> 2;
3734 if (want_insert > 7)
3735 abort ();
3736 want_insert_done_so_far = 0;
3737 go_back = TRUE;
3738 }
3739 else if (want_insert && !go_back)
3740 {
3741 unsigned int num_insns = fragp->fr_fix >> 2;
3742 unsigned int max_poss_nops = 8 - num_insns;
3743
3744 if (max_poss_nops)
3745 {
3746 unsigned int cur_want_nops, max_want_nops, do_nops, i;
3747
3748 if (want_insert & 1)
3749 cur_want_nops = 1;
3750 else if (want_insert & 2)
3751 cur_want_nops = 2;
3752 else if (want_insert & 4)
3753 cur_want_nops = 4;
3754 else
3755 abort ();
3756
3757 max_want_nops = cur_want_nops - want_insert_done_so_far;
3758
3759 do_nops = (max_poss_nops < max_want_nops
3760 ? max_poss_nops
3761 : max_want_nops);
3762 for (i = 0; i < do_nops; i++)
3763 {
3764 md_number_to_chars (fragp->fr_literal + fragp->fr_fix,
3765 0, 4);
3766 if (target_big_endian)
3767 fragp->fr_literal[fragp->fr_fix - 1] |= 0x1;
3768 else
3769 fragp->fr_literal[fragp->fr_fix - 4] |= 0x1;
3770 fragp->fr_fix += 4;
3771 fragp->fr_var -= 4;
3772 }
3773 want_insert_done_so_far += do_nops;
3774 if (want_insert_done_so_far == cur_want_nops)
3775 {
3776 want_insert -= want_insert_done_so_far;
3777 want_insert_done_so_far = 0;
3778 if (want_insert)
3779 go_back = TRUE;
3780 }
3781 }
3782 }
3783 if (go_back)
3784 {
3785 if (want_insert & 1)
3786 {
3787 frchp = frchp_last8;
3788 fragp = fragp_last8;
3789 pos = pos_last8;
3790 }
3791 else if (want_insert & 2)
3792 {
3793 frchp = frchp_last8 = frchp_last16;
3794 fragp = fragp_last8 = fragp_last16;
3795 pos = pos_last8 = pos_last16;
3796 }
3797 else if (want_insert & 4)
3798 {
3799 frchp = frchp_last8 = frchp_last16 = frchp_last32;
3800 fragp = fragp_last8 = fragp_last16 = fragp_last32;
3801 pos = pos_last8 = pos_last16 = pos_last32;
3802 }
3803 else
3804 abort ();
3805
3806 goto look_at_frag;
3807 }
3808
3809 /* Update current position for moving past a code
3810 frag. */
3811 pos += fragp->fr_fix;
3812 pos &= 31;
3813 frchp_next = frchp;
3814 fragp_next = fragp->fr_next;
3815 if (fragp_next == NULL)
3816 {
3817 frchp_next = frchp->frch_next;
3818 if (frchp_next != NULL)
3819 fragp_next = frchp_next->frch_root;
3820 }
3821 if (!(pos & 7))
3822 {
3823 frchp_last8 = frchp_next;
3824 fragp_last8 = fragp_next;
3825 pos_last8 = pos;
3826 }
3827 if (!(pos & 15))
3828 {
3829 frchp_last16 = frchp_next;
3830 fragp_last16 = fragp_next;
3831 pos_last16 = pos;
3832 }
3833 if (!(pos & 31))
3834 {
3835 frchp_last32 = frchp_next;
3836 fragp_last32 = fragp_next;
3837 pos_last32 = pos;
3838 }
3839 }
3840 }
3841
3842 /* Now convert the machine-dependent frags to machine-independent
3843 ones. */
3844 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
3845 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
3846 {
3847 if (fragp->fr_type == rs_machine_dependent)
3848 {
3849 if (fragp->tc_frag_data.is_insns)
3850 frag_wane (fragp);
3851 else
3852 {
3853 fragp->fr_type = rs_align_code;
3854 fragp->fr_var = 1;
3855 *fragp->fr_literal = 0;
3856 }
3857 }
3858 }
3859 }
3860
3861 /* Initialize the machine-dependent parts of a frag. */
3862
3863 void
3864 tic6x_frag_init (fragS *fragp)
3865 {
3866 fragp->tc_frag_data.is_insns = FALSE;
3867 fragp->tc_frag_data.can_cross_fp_boundary = FALSE;
3868 }
3869
3870 /* Set an attribute if it has not already been set by the user. */
3871
3872 static void
3873 tic6x_set_attribute_int (int tag, int value)
3874 {
3875 if (tag < 1
3876 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES)
3877 abort ();
3878 if (!tic6x_attributes_set_explicitly[tag])
3879 bfd_elf_add_proc_attr_int (stdoutput, tag, value);
3880 }
3881
3882 /* Set object attributes deduced from the input file and command line
3883 rather than given explicitly. */
3884 static void
3885 tic6x_set_attributes (void)
3886 {
3887 if (tic6x_arch_attribute == C6XABI_Tag_CPU_arch_none)
3888 tic6x_arch_attribute = C6XABI_Tag_CPU_arch_C674X;
3889
3890 tic6x_set_attribute_int (Tag_C6XABI_Tag_CPU_arch, tic6x_arch_attribute);
3891 }
3892
3893 /* Do machine-dependent manipulations of the frag chains after all
3894 input has been read and before the machine-independent sizing and
3895 relaxing. */
3896
3897 void
3898 tic6x_end (void)
3899 {
3900 /* Set object attributes at this point if not explicitly set. */
3901 tic6x_set_attributes ();
3902
3903 /* Meeting alignment requirements may require inserting NOPs in
3904 parallel in execute packets earlier in the segment. Future
3905 16-bit instruction generation involves whole-segment optimization
3906 to determine the best choice and ordering of 32-bit or 16-bit
3907 instructions. This doesn't fit will in the general relaxation
3908 framework, so handle alignment and 16-bit instruction generation
3909 here. */
3910 bfd_map_over_sections (stdoutput, tic6x_adjust_section, NULL);
3911 }
3912
3913 /* No machine-dependent frags at this stage; all converted in
3914 tic6x_end. */
3915
3916 void
3917 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
3918 fragS *fragp ATTRIBUTE_UNUSED)
3919 {
3920 abort ();
3921 }
3922
3923 /* No machine-dependent frags at this stage; all converted in
3924 tic6x_end. */
3925
3926 int
3927 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
3928 segT seg ATTRIBUTE_UNUSED)
3929 {
3930 abort ();
3931 }
3932
3933 /* Put a number into target byte order. */
3934
3935 void
3936 md_number_to_chars (char *buf, valueT val, int n)
3937 {
3938 if (target_big_endian)
3939 number_to_chars_bigendian (buf, val, n);
3940 else
3941 number_to_chars_littleendian (buf, val, n);
3942 }
3943
3944 /* Machine-dependent operand parsing not currently needed. */
3945
3946 void
3947 md_operand (expressionS *op ATTRIBUTE_UNUSED)
3948 {
3949 }
3950
3951 /* PC-relative operands are relative to the start of the fetch
3952 packet. */
3953
3954 long
3955 tic6x_pcrel_from_section (fixS *fixp, segT sec)
3956 {
3957 if (fixp->fx_addsy != NULL
3958 && (!S_IS_DEFINED (fixp->fx_addsy)
3959 || S_GET_SEGMENT (fixp->fx_addsy) != sec))
3960 return 0;
3961 return (fixp->fx_where + fixp->fx_frag->fr_address) & ~(long) 0x1f;
3962 }
3963
3964 /* Round up a section size to the appropriate boundary. */
3965
3966 valueT
3967 md_section_align (segT segment ATTRIBUTE_UNUSED,
3968 valueT size)
3969 {
3970 /* Round up section sizes to ensure that text sections consist of
3971 whole fetch packets. */
3972 int align = bfd_get_section_alignment (stdoutput, segment);
3973 return ((size + (1 << align) - 1) & ((valueT) -1 << align));
3974 }
3975
3976 /* No special undefined symbol handling needed for now. */
3977
3978 symbolS *
3979 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
3980 {
3981 return NULL;
3982 }
3983
3984 /* Translate internal representation of relocation info to BFD target
3985 format. */
3986
3987 arelent *
3988 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
3989 {
3990 arelent *reloc;
3991 bfd_reloc_code_real_type r_type;
3992
3993 reloc = xmalloc (sizeof (arelent));
3994 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
3995 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3996 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3997 reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0);
3998 r_type = fixp->fx_r_type;
3999 reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
4000
4001 if (reloc->howto == NULL)
4002 {
4003 as_bad_where (fixp->fx_file, fixp->fx_line,
4004 _("Cannot represent relocation type %s"),
4005 bfd_get_reloc_code_name (r_type));
4006 return NULL;
4007 }
4008
4009 /* Correct for adjustments bfd_install_relocation will make. */
4010 if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
4011 reloc->addend += reloc->address;
4012
4013 return reloc;
4014 }
This page took 0.172658 seconds and 5 git commands to generate.