]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gas/config/tc-d10v.c
Remove trailing redundant `;'
[thirdparty/binutils-gdb.git] / gas / config / tc-d10v.c
1 /* tc-d10v.c -- Assembler code for the Mitsubishi D10V
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
3 2007, 2009, 2010
4 Free Software Foundation, Inc.
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to
20 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
21 Boston, MA 02110-1301, USA. */
22
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "subsegs.h"
26 #include "opcode/d10v.h"
27 #include "elf/ppc.h"
28 #include "dwarf2dbg.h"
29
30 const char comment_chars[] = ";";
31 const char line_comment_chars[] = "#";
32 const char line_separator_chars[] = "";
33 const char *md_shortopts = "O";
34 const char EXP_CHARS[] = "eE";
35 const char FLT_CHARS[] = "dD";
36
37 int Optimizing = 0;
38
39 #define AT_WORD_P(X) ((X)->X_op == O_right_shift \
40 && (X)->X_op_symbol != NULL \
41 && symbol_constant_p ((X)->X_op_symbol) \
42 && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT)
43 #define AT_WORD_RIGHT_SHIFT 2
44
45 /* Fixups. */
46 #define MAX_INSN_FIXUPS 5
47
48 struct d10v_fixup
49 {
50 expressionS exp;
51 int operand;
52 int pcrel;
53 int size;
54 bfd_reloc_code_real_type reloc;
55 };
56
57 typedef struct _fixups
58 {
59 int fc;
60 struct d10v_fixup fix[MAX_INSN_FIXUPS];
61 struct _fixups *next;
62 } Fixups;
63
64 static Fixups FixUps[2];
65 static Fixups *fixups;
66
67 static int do_not_ignore_hash = 0;
68
69 typedef int packing_type;
70 #define PACK_UNSPEC (0) /* Packing order not specified. */
71 #define PACK_PARALLEL (1) /* "||" */
72 #define PACK_LEFT_RIGHT (2) /* "->" */
73 #define PACK_RIGHT_LEFT (3) /* "<-" */
74 static packing_type etype = PACK_UNSPEC; /* Used by d10v_cleanup. */
75
76 /* TRUE if instruction swapping warnings should be inhibited.
77 --nowarnswap. */
78 static bfd_boolean flag_warn_suppress_instructionswap;
79
80 /* TRUE if instruction packing should be performed when --gstabs is specified.
81 --gstabs-packing, --no-gstabs-packing. */
82 static bfd_boolean flag_allow_gstabs_packing = 1;
83
84 /* Local functions. */
85
86 enum options
87 {
88 OPTION_NOWARNSWAP = OPTION_MD_BASE,
89 OPTION_GSTABSPACKING,
90 OPTION_NOGSTABSPACKING
91 };
92
93 struct option md_longopts[] =
94 {
95 {"nowarnswap", no_argument, NULL, OPTION_NOWARNSWAP},
96 {"gstabspacking", no_argument, NULL, OPTION_GSTABSPACKING},
97 {"gstabs-packing", no_argument, NULL, OPTION_GSTABSPACKING},
98 {"nogstabspacking", no_argument, NULL, OPTION_NOGSTABSPACKING},
99 {"no-gstabs-packing", no_argument, NULL, OPTION_NOGSTABSPACKING},
100 {NULL, no_argument, NULL, 0}
101 };
102
103 size_t md_longopts_size = sizeof (md_longopts);
104
105 /* Opcode hash table. */
106 static struct hash_control *d10v_hash;
107
108 /* Do a binary search of the d10v_predefined_registers array to see if
109 NAME is a valid regiter name. Return the register number from the
110 array on success, or -1 on failure. */
111
112 static int
113 reg_name_search (char *name)
114 {
115 int middle, low, high;
116 int cmp;
117
118 low = 0;
119 high = d10v_reg_name_cnt () - 1;
120
121 do
122 {
123 middle = (low + high) / 2;
124 cmp = strcasecmp (name, d10v_predefined_registers[middle].name);
125 if (cmp < 0)
126 high = middle - 1;
127 else if (cmp > 0)
128 low = middle + 1;
129 else
130 return d10v_predefined_registers[middle].value;
131 }
132 while (low <= high);
133 return -1;
134 }
135
136 /* Check the string at input_line_pointer
137 to see if it is a valid register name. */
138
139 static int
140 register_name (expressionS *expressionP)
141 {
142 int reg_number;
143 char c, *p = input_line_pointer;
144
145 while (*p
146 && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
147 p++;
148
149 c = *p;
150 if (c)
151 *p++ = 0;
152
153 /* Look to see if it's in the register table. */
154 reg_number = reg_name_search (input_line_pointer);
155 if (reg_number >= 0)
156 {
157 expressionP->X_op = O_register;
158 /* Temporarily store a pointer to the string here. */
159 expressionP->X_op_symbol = (symbolS *) input_line_pointer;
160 expressionP->X_add_number = reg_number;
161 input_line_pointer = p;
162 return 1;
163 }
164 if (c)
165 *(p - 1) = c;
166 return 0;
167 }
168
169 static int
170 check_range (unsigned long num, int bits, int flags)
171 {
172 long min, max;
173 int retval = 0;
174
175 /* Don't bother checking 16-bit values. */
176 if (bits == 16)
177 return 0;
178
179 if (flags & OPERAND_SHIFT)
180 {
181 /* All special shift operands are unsigned and <= 16.
182 We allow 0 for now. */
183 if (num > 16)
184 return 1;
185 else
186 return 0;
187 }
188
189 if (flags & OPERAND_SIGNED)
190 {
191 /* Signed 3-bit integers are restricted to the (-2, 3) range. */
192 if (flags & RESTRICTED_NUM3)
193 {
194 if ((long) num < -2 || (long) num > 3)
195 retval = 1;
196 }
197 else
198 {
199 max = (1 << (bits - 1)) - 1;
200 min = - (1 << (bits - 1));
201 if (((long) num > max) || ((long) num < min))
202 retval = 1;
203 }
204 }
205 else
206 {
207 max = (1 << bits) - 1;
208 min = 0;
209 if (((long) num > max) || ((long) num < min))
210 retval = 1;
211 }
212 return retval;
213 }
214
215 void
216 md_show_usage (FILE *stream)
217 {
218 fprintf (stream, _("D10V options:\n\
219 -O Optimize. Will do some operations in parallel.\n\
220 --gstabs-packing Pack adjacent short instructions together even\n\
221 when --gstabs is specified. On by default.\n\
222 --no-gstabs-packing If --gstabs is specified, do not pack adjacent\n\
223 instructions together.\n"));
224 }
225
226 int
227 md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
228 {
229 switch (c)
230 {
231 case 'O':
232 /* Optimize. Will attempt to parallelize operations. */
233 Optimizing = 1;
234 break;
235 case OPTION_NOWARNSWAP:
236 flag_warn_suppress_instructionswap = 1;
237 break;
238 case OPTION_GSTABSPACKING:
239 flag_allow_gstabs_packing = 1;
240 break;
241 case OPTION_NOGSTABSPACKING:
242 flag_allow_gstabs_packing = 0;
243 break;
244 default:
245 return 0;
246 }
247 return 1;
248 }
249
250 symbolS *
251 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
252 {
253 return 0;
254 }
255
256 char *
257 md_atof (int type, char *litP, int *sizeP)
258 {
259 return ieee_md_atof (type, litP, sizeP, TRUE);
260 }
261
262 void
263 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
264 asection *sec ATTRIBUTE_UNUSED,
265 fragS *fragP ATTRIBUTE_UNUSED)
266 {
267 abort ();
268 }
269
270 valueT
271 md_section_align (asection *seg, valueT addr)
272 {
273 int align = bfd_get_section_alignment (stdoutput, seg);
274 return ((addr + (1 << align) - 1) & (-1 << align));
275 }
276
277 void
278 md_begin (void)
279 {
280 char *prev_name = "";
281 struct d10v_opcode *opcode;
282 d10v_hash = hash_new ();
283
284 /* Insert unique names into hash table. The D10v instruction set
285 has many identical opcode names that have different opcodes based
286 on the operands. This hash table then provides a quick index to
287 the first opcode with a particular name in the opcode table. */
288
289 for (opcode = (struct d10v_opcode *) d10v_opcodes; opcode->name; opcode++)
290 {
291 if (strcmp (prev_name, opcode->name))
292 {
293 prev_name = (char *) opcode->name;
294 hash_insert (d10v_hash, opcode->name, (char *) opcode);
295 }
296 }
297
298 fixups = &FixUps[0];
299 FixUps[0].next = &FixUps[1];
300 FixUps[1].next = &FixUps[0];
301 }
302
303 /* Remove the postincrement or postdecrement operator ( '+' or '-' )
304 from an expression. */
305
306 static int
307 postfix (char *p)
308 {
309 while (*p != '-' && *p != '+')
310 {
311 if (*p == 0 || *p == '\n' || *p == '\r')
312 break;
313 p++;
314 }
315
316 if (*p == '-')
317 {
318 *p = ' ';
319 return -1;
320 }
321 if (*p == '+')
322 {
323 *p = ' ';
324 return 1;
325 }
326
327 return 0;
328 }
329
330 static bfd_reloc_code_real_type
331 get_reloc (struct d10v_operand *op)
332 {
333 int bits = op->bits;
334
335 if (bits <= 4)
336 return 0;
337
338 if (op->flags & OPERAND_ADDR)
339 {
340 if (bits == 8)
341 return BFD_RELOC_D10V_10_PCREL_R;
342 else
343 return BFD_RELOC_D10V_18_PCREL;
344 }
345
346 return BFD_RELOC_16;
347 }
348
349 /* Parse a string of operands. Return an array of expressions. */
350
351 static int
352 get_operands (expressionS exp[])
353 {
354 char *p = input_line_pointer;
355 int numops = 0;
356 int post = 0;
357 int uses_at = 0;
358
359 while (*p)
360 {
361 while (*p == ' ' || *p == '\t' || *p == ',')
362 p++;
363 if (*p == 0 || *p == '\n' || *p == '\r')
364 break;
365
366 if (*p == '@')
367 {
368 uses_at = 1;
369
370 p++;
371 exp[numops].X_op = O_absent;
372 if (*p == '(')
373 {
374 p++;
375 exp[numops].X_add_number = OPERAND_ATPAR;
376 }
377 else if (*p == '-')
378 {
379 p++;
380 exp[numops].X_add_number = OPERAND_ATMINUS;
381 }
382 else
383 {
384 exp[numops].X_add_number = OPERAND_ATSIGN;
385 if (*p == '+')
386 {
387 numops++;
388 exp[numops].X_op = O_absent;
389 exp[numops].X_add_number = OPERAND_PLUS;
390 p++;
391 }
392 post = postfix (p);
393 }
394 numops++;
395 continue;
396 }
397
398 if (*p == ')')
399 {
400 /* Just skip the trailing paren. */
401 p++;
402 continue;
403 }
404
405 input_line_pointer = p;
406
407 /* Check to see if it might be a register name. */
408 if (!register_name (&exp[numops]))
409 {
410 /* Parse as an expression. */
411 if (uses_at)
412 {
413 /* Any expression that involves the indirect addressing
414 cannot also involve immediate addressing. Therefore
415 the use of the hash character is illegal. */
416 int save = do_not_ignore_hash;
417 do_not_ignore_hash = 1;
418
419 expression (&exp[numops]);
420
421 do_not_ignore_hash = save;
422 }
423 else
424 expression (&exp[numops]);
425 }
426
427 if (strncasecmp (input_line_pointer, "@word", 5) == 0)
428 {
429 input_line_pointer += 5;
430 if (exp[numops].X_op == O_register)
431 {
432 /* If it looked like a register name but was followed by
433 "@word" then it was really a symbol, so change it to
434 one. */
435 exp[numops].X_op = O_symbol;
436 exp[numops].X_add_symbol =
437 symbol_find_or_make ((char *) exp[numops].X_op_symbol);
438 }
439
440 /* Check for identifier@word+constant. */
441 if (*input_line_pointer == '-' || *input_line_pointer == '+')
442 {
443 expressionS new_exp;
444 expression (&new_exp);
445 exp[numops].X_add_number = new_exp.X_add_number;
446 }
447
448 /* Convert expr into a right shift by AT_WORD_RIGHT_SHIFT. */
449 {
450 expressionS new_exp;
451 memset (&new_exp, 0, sizeof new_exp);
452 new_exp.X_add_number = AT_WORD_RIGHT_SHIFT;
453 new_exp.X_op = O_constant;
454 new_exp.X_unsigned = 1;
455 exp[numops].X_op_symbol = make_expr_symbol (&new_exp);
456 exp[numops].X_op = O_right_shift;
457 }
458
459 know (AT_WORD_P (&exp[numops]));
460 }
461
462 if (exp[numops].X_op == O_illegal)
463 as_bad (_("illegal operand"));
464 else if (exp[numops].X_op == O_absent)
465 as_bad (_("missing operand"));
466
467 numops++;
468 p = input_line_pointer;
469 }
470
471 switch (post)
472 {
473 case -1: /* Postdecrement mode. */
474 exp[numops].X_op = O_absent;
475 exp[numops++].X_add_number = OPERAND_MINUS;
476 break;
477 case 1: /* Postincrement mode. */
478 exp[numops].X_op = O_absent;
479 exp[numops++].X_add_number = OPERAND_PLUS;
480 break;
481 }
482
483 exp[numops].X_op = 0;
484 return numops;
485 }
486
487 static unsigned long
488 d10v_insert_operand (unsigned long insn,
489 int op_type,
490 offsetT value,
491 int left,
492 fixS *fix)
493 {
494 int shift, bits;
495
496 shift = d10v_operands[op_type].shift;
497 if (left)
498 shift += 15;
499
500 bits = d10v_operands[op_type].bits;
501
502 /* Truncate to the proper number of bits. */
503 if (check_range (value, bits, d10v_operands[op_type].flags))
504 as_bad_where (fix->fx_file, fix->fx_line,
505 _("operand out of range: %ld"), (long) value);
506
507 value &= 0x7FFFFFFF >> (31 - bits);
508 insn |= (value << shift);
509
510 return insn;
511 }
512
513 /* Take a pointer to the opcode entry in the opcode table and the
514 array of operand expressions. Return the instruction. */
515
516 static unsigned long
517 build_insn (struct d10v_opcode *opcode,
518 expressionS *opers,
519 unsigned long insn)
520 {
521 int i, bits, shift, flags, format;
522 unsigned long number;
523
524 /* The insn argument is only used for the DIVS kludge. */
525 if (insn)
526 format = LONG_R;
527 else
528 {
529 insn = opcode->opcode;
530 format = opcode->format;
531 }
532
533 for (i = 0; opcode->operands[i]; i++)
534 {
535 flags = d10v_operands[opcode->operands[i]].flags;
536 bits = d10v_operands[opcode->operands[i]].bits;
537 shift = d10v_operands[opcode->operands[i]].shift;
538 number = opers[i].X_add_number;
539
540 if (flags & OPERAND_REG)
541 {
542 number &= REGISTER_MASK;
543 if (format == LONG_L)
544 shift += 15;
545 }
546
547 if (opers[i].X_op != O_register && opers[i].X_op != O_constant)
548 {
549 /* Now create a fixup. */
550
551 if (fixups->fc >= MAX_INSN_FIXUPS)
552 as_fatal (_("too many fixups"));
553
554 if (AT_WORD_P (&opers[i]))
555 {
556 /* Recognize XXX>>1+N aka XXX@word+N as special (AT_WORD). */
557 fixups->fix[fixups->fc].reloc = BFD_RELOC_D10V_18;
558 opers[i].X_op = O_symbol;
559 opers[i].X_op_symbol = NULL; /* Should free it. */
560 /* number is left shifted by AT_WORD_RIGHT_SHIFT so
561 that, it is aligned with the symbol's value. Later,
562 BFD_RELOC_D10V_18 will right shift (symbol_value +
563 X_add_number). */
564 number <<= AT_WORD_RIGHT_SHIFT;
565 opers[i].X_add_number = number;
566 }
567 else
568 {
569 fixups->fix[fixups->fc].reloc =
570 get_reloc ((struct d10v_operand *) &d10v_operands[opcode->operands[i]]);
571
572 /* Check that an immediate was passed to ops that expect one. */
573 if ((flags & OPERAND_NUM)
574 && (fixups->fix[fixups->fc].reloc == 0))
575 as_bad (_("operand is not an immediate"));
576 }
577
578 if (fixups->fix[fixups->fc].reloc == BFD_RELOC_16 ||
579 fixups->fix[fixups->fc].reloc == BFD_RELOC_D10V_18)
580 fixups->fix[fixups->fc].size = 2;
581 else
582 fixups->fix[fixups->fc].size = 4;
583
584 fixups->fix[fixups->fc].exp = opers[i];
585 fixups->fix[fixups->fc].operand = opcode->operands[i];
586 fixups->fix[fixups->fc].pcrel =
587 (flags & OPERAND_ADDR) ? TRUE : FALSE;
588 (fixups->fc)++;
589 }
590
591 /* Truncate to the proper number of bits. */
592 if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
593 as_bad (_("operand out of range: %lu"), number);
594 number &= 0x7FFFFFFF >> (31 - bits);
595 insn = insn | (number << shift);
596 }
597
598 /* kludge: for DIVS, we need to put the operands in twice on the second
599 pass, format is changed to LONG_R to force the second set of operands
600 to not be shifted over 15. */
601 if ((opcode->opcode == OPCODE_DIVS) && (format == LONG_L))
602 insn = build_insn (opcode, opers, insn);
603
604 return insn;
605 }
606
607 /* Write out a long form instruction. */
608
609 static void
610 write_long (unsigned long insn, Fixups *fx)
611 {
612 int i, where;
613 char *f = frag_more (4);
614
615 dwarf2_emit_insn (4);
616 insn |= FM11;
617 number_to_chars_bigendian (f, insn, 4);
618
619 for (i = 0; i < fx->fc; i++)
620 {
621 if (fx->fix[i].reloc)
622 {
623 where = f - frag_now->fr_literal;
624 if (fx->fix[i].size == 2)
625 where += 2;
626
627 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
628 fx->fix[i].operand |= 4096;
629
630 fix_new_exp (frag_now,
631 where,
632 fx->fix[i].size,
633 &(fx->fix[i].exp),
634 fx->fix[i].pcrel,
635 fx->fix[i].operand|2048);
636 }
637 }
638 fx->fc = 0;
639 }
640
641 /* Write out a short form instruction by itself. */
642
643 static void
644 write_1_short (struct d10v_opcode *opcode,
645 unsigned long insn,
646 Fixups *fx)
647 {
648 char *f = frag_more (4);
649 int i, where;
650
651 dwarf2_emit_insn (4);
652 if (opcode->exec_type & PARONLY)
653 as_fatal (_("Instruction must be executed in parallel with another instruction."));
654
655 /* The other container needs to be NOP.
656 According to 4.3.1: for FM=00, sub-instructions performed only by IU
657 cannot be encoded in L-container. */
658 if (opcode->unit == IU)
659 insn |= FM00 | (NOP << 15); /* Right container. */
660 else
661 insn = FM00 | (insn << 15) | NOP; /* Left container. */
662
663 number_to_chars_bigendian (f, insn, 4);
664 for (i = 0; i < fx->fc; i++)
665 {
666 if (fx->fix[i].reloc)
667 {
668 where = f - frag_now->fr_literal;
669 if (fx->fix[i].size == 2)
670 where += 2;
671
672 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
673 fx->fix[i].operand |= 4096;
674
675 /* If it's an R reloc, we may have to switch it to L. */
676 if ((fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R)
677 && (opcode->unit != IU))
678 fx->fix[i].operand |= 1024;
679
680 fix_new_exp (frag_now,
681 where,
682 fx->fix[i].size,
683 &(fx->fix[i].exp),
684 fx->fix[i].pcrel,
685 fx->fix[i].operand|2048);
686 }
687 }
688 fx->fc = 0;
689 }
690
691 /* Determine if there are any resource conflicts among two manually
692 parallelized instructions. Some of this was lifted from parallel_ok. */
693
694 static void
695 check_resource_conflict (struct d10v_opcode *op1,
696 unsigned long insn1,
697 struct d10v_opcode *op2,
698 unsigned long insn2)
699 {
700 int i, j, flags, mask, shift, regno;
701 unsigned long ins, mod[2];
702 struct d10v_opcode *op;
703
704 if ((op1->exec_type & SEQ)
705 || ! ((op1->exec_type & PAR) || (op1->exec_type & PARONLY)))
706 {
707 as_warn (_("packing conflict: %s must dispatch sequentially"),
708 op1->name);
709 return;
710 }
711
712 if ((op2->exec_type & SEQ)
713 || ! ((op2->exec_type & PAR) || (op2->exec_type & PARONLY)))
714 {
715 as_warn (_("packing conflict: %s must dispatch sequentially"),
716 op2->name);
717 return;
718 }
719
720 /* See if both instructions write to the same resource.
721
722 The idea here is to create two sets of bitmasks (mod and used) which
723 indicate which registers are modified or used by each instruction.
724 The operation can only be done in parallel if neither instruction
725 modifies the same register. Accesses to control registers and memory
726 are treated as accesses to a single register. So if both instructions
727 write memory or if the first instruction writes memory and the second
728 reads, then they cannot be done in parallel. We treat reads to the PSW
729 (which includes C, F0, and F1) in isolation. So simultaneously writing
730 C and F0 in two different sub-instructions is permitted. */
731
732 /* The bitmasks (mod and used) look like this (bit 31 = MSB).
733 r0-r15 0-15
734 a0-a1 16-17
735 cr (not psw) 18
736 psw(other) 19
737 mem 20
738 psw(C flag) 21
739 psw(F0 flag) 22 */
740
741 for (j = 0; j < 2; j++)
742 {
743 if (j == 0)
744 {
745 op = op1;
746 ins = insn1;
747 }
748 else
749 {
750 op = op2;
751 ins = insn2;
752 }
753 mod[j] = 0;
754 if (op->exec_type & BRANCH_LINK)
755 mod[j] |= 1 << 13;
756
757 for (i = 0; op->operands[i]; i++)
758 {
759 flags = d10v_operands[op->operands[i]].flags;
760 shift = d10v_operands[op->operands[i]].shift;
761 mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
762 if (flags & OPERAND_REG)
763 {
764 regno = (ins >> shift) & mask;
765 if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
766 regno += 16;
767 else if (flags & OPERAND_CONTROL) /* mvtc or mvfc */
768 {
769 if (regno == 0)
770 regno = 19;
771 else
772 regno = 18;
773 }
774 else if (flags & OPERAND_FFLAG)
775 regno = 22;
776 else if (flags & OPERAND_CFLAG)
777 regno = 21;
778
779 if (flags & OPERAND_DEST
780 /* Auto inc/dec also modifies the register. */
781 || (op->operands[i + 1] != 0
782 && (d10v_operands[op->operands[i + 1]].flags
783 & (OPERAND_PLUS | OPERAND_MINUS)) != 0))
784 {
785 mod[j] |= 1 << regno;
786 if (flags & OPERAND_EVEN)
787 mod[j] |= 1 << (regno + 1);
788 }
789 }
790 else if (flags & OPERAND_ATMINUS)
791 {
792 /* SP implicitly used/modified. */
793 mod[j] |= 1 << 15;
794 }
795 }
796
797 if (op->exec_type & WMEM)
798 mod[j] |= 1 << 20;
799 else if (op->exec_type & WF0)
800 mod[j] |= 1 << 22;
801 else if (op->exec_type & WCAR)
802 mod[j] |= 1 << 21;
803 }
804
805 if ((mod[0] & mod[1]) == 0)
806 return;
807 else
808 {
809 unsigned long x;
810 x = mod[0] & mod[1];
811
812 for (j = 0; j <= 15; j++)
813 if (x & (1 << j))
814 as_warn (_("resource conflict (R%d)"), j);
815 for (j = 16; j <= 17; j++)
816 if (x & (1 << j))
817 as_warn (_("resource conflict (A%d)"), j - 16);
818 if (x & (1 << 19))
819 as_warn (_("resource conflict (PSW)"));
820 if (x & (1 << 21))
821 as_warn (_("resource conflict (C flag)"));
822 if (x & (1 << 22))
823 as_warn (_("resource conflict (F flag)"));
824 }
825 }
826
827 /* Check 2 instructions and determine if they can be safely
828 executed in parallel. Return 1 if they can be. */
829
830 static int
831 parallel_ok (struct d10v_opcode *op1,
832 unsigned long insn1,
833 struct d10v_opcode *op2,
834 unsigned long insn2,
835 packing_type exec_type)
836 {
837 int i, j, flags, mask, shift, regno;
838 unsigned long ins, mod[2], used[2];
839 struct d10v_opcode *op;
840
841 if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0
842 || (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0
843 || (op1->unit == BOTH) || (op2->unit == BOTH)
844 || (op1->unit == IU && op2->unit == IU)
845 || (op1->unit == MU && op2->unit == MU))
846 return 0;
847
848 /* If this is auto parallelization, and the first instruction is a
849 branch or should not be packed, then don't parallelize. */
850 if (exec_type == PACK_UNSPEC
851 && (op1->exec_type & (ALONE | BRANCH)))
852 return 0;
853
854 /* The idea here is to create two sets of bitmasks (mod and used)
855 which indicate which registers are modified or used by each
856 instruction. The operation can only be done in parallel if
857 instruction 1 and instruction 2 modify different registers, and
858 the first instruction does not modify registers that the second
859 is using (The second instruction can modify registers that the
860 first is using as they are only written back after the first
861 instruction has completed). Accesses to control registers, PSW,
862 and memory are treated as accesses to a single register. So if
863 both instructions write memory or if the first instruction writes
864 memory and the second reads, then they cannot be done in
865 parallel. Likewise, if the first instruction mucks with the psw
866 and the second reads the PSW (which includes C, F0, and F1), then
867 they cannot operate safely in parallel. */
868
869 /* The bitmasks (mod and used) look like this (bit 31 = MSB).
870 r0-r15 0-15
871 a0-a1 16-17
872 cr (not psw) 18
873 psw 19
874 mem 20 */
875
876 for (j = 0; j < 2; j++)
877 {
878 if (j == 0)
879 {
880 op = op1;
881 ins = insn1;
882 }
883 else
884 {
885 op = op2;
886 ins = insn2;
887 }
888 mod[j] = used[j] = 0;
889 if (op->exec_type & BRANCH_LINK)
890 mod[j] |= 1 << 13;
891
892 for (i = 0; op->operands[i]; i++)
893 {
894 flags = d10v_operands[op->operands[i]].flags;
895 shift = d10v_operands[op->operands[i]].shift;
896 mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
897 if (flags & OPERAND_REG)
898 {
899 regno = (ins >> shift) & mask;
900 if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
901 regno += 16;
902 else if (flags & OPERAND_CONTROL) /* mvtc or mvfc. */
903 {
904 if (regno == 0)
905 regno = 19;
906 else
907 regno = 18;
908 }
909 else if (flags & (OPERAND_FFLAG | OPERAND_CFLAG))
910 regno = 19;
911
912 if (flags & OPERAND_DEST)
913 {
914 mod[j] |= 1 << regno;
915 if (flags & OPERAND_EVEN)
916 mod[j] |= 1 << (regno + 1);
917 }
918 else
919 {
920 used[j] |= 1 << regno;
921 if (flags & OPERAND_EVEN)
922 used[j] |= 1 << (regno + 1);
923
924 /* Auto inc/dec also modifies the register. */
925 if (op->operands[i + 1] != 0
926 && (d10v_operands[op->operands[i + 1]].flags
927 & (OPERAND_PLUS | OPERAND_MINUS)) != 0)
928 mod[j] |= 1 << regno;
929 }
930 }
931 else if (flags & OPERAND_ATMINUS)
932 {
933 /* SP implicitly used/modified. */
934 mod[j] |= 1 << 15;
935 used[j] |= 1 << 15;
936 }
937 }
938 if (op->exec_type & RMEM)
939 used[j] |= 1 << 20;
940 else if (op->exec_type & WMEM)
941 mod[j] |= 1 << 20;
942 else if (op->exec_type & RF0)
943 used[j] |= 1 << 19;
944 else if (op->exec_type & WF0)
945 mod[j] |= 1 << 19;
946 else if (op->exec_type & WCAR)
947 mod[j] |= 1 << 19;
948 }
949 if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0)
950 return 1;
951 return 0;
952 }
953
954 /* Expects two short instructions.
955 If possible, writes out both as a single packed instruction.
956 Otherwise, writes out the first one, packed with a NOP.
957 Returns number of instructions not written out. */
958
959 static int
960 write_2_short (struct d10v_opcode *opcode1,
961 unsigned long insn1,
962 struct d10v_opcode *opcode2,
963 unsigned long insn2,
964 packing_type exec_type,
965 Fixups *fx)
966 {
967 unsigned long insn;
968 char *f;
969 int i, j, where;
970
971 if ((exec_type != PACK_PARALLEL)
972 && ((opcode1->exec_type & PARONLY) || (opcode2->exec_type & PARONLY)))
973 as_fatal (_("Instruction must be executed in parallel"));
974
975 if ((opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE))
976 as_fatal (_("Long instructions may not be combined."));
977
978 switch (exec_type)
979 {
980 case PACK_UNSPEC: /* Order not specified. */
981 if (opcode1->exec_type & ALONE)
982 {
983 /* Case of a short branch on a separate GAS line. Pack with NOP. */
984 write_1_short (opcode1, insn1, fx->next);
985 return 1;
986 }
987 if (Optimizing
988 && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
989 {
990 /* Parallel. */
991 if (opcode1->unit == IU)
992 insn = FM00 | (insn2 << 15) | insn1;
993 else if (opcode2->unit == MU)
994 insn = FM00 | (insn2 << 15) | insn1;
995 else
996 insn = FM00 | (insn1 << 15) | insn2;
997 }
998 else if (opcode1->unit == IU)
999 /* Reverse sequential with IU opcode1 on right and done first. */
1000 insn = FM10 | (insn2 << 15) | insn1;
1001 else
1002 /* Sequential with non-IU opcode1 on left and done first. */
1003 insn = FM01 | (insn1 << 15) | insn2;
1004 break;
1005
1006 case PACK_PARALLEL:
1007 if (opcode1->exec_type & SEQ || opcode2->exec_type & SEQ)
1008 as_fatal
1009 (_("One of these instructions may not be executed in parallel."));
1010 if (opcode1->unit == IU)
1011 {
1012 if (opcode2->unit == IU)
1013 as_fatal (_("Two IU instructions may not be executed in parallel"));
1014 if (!flag_warn_suppress_instructionswap)
1015 as_warn (_("Swapping instruction order"));
1016 insn = FM00 | (insn2 << 15) | insn1;
1017 }
1018 else if (opcode2->unit == MU)
1019 {
1020 if (opcode1->unit == MU)
1021 as_fatal (_("Two MU instructions may not be executed in parallel"));
1022 if (!flag_warn_suppress_instructionswap)
1023 as_warn (_("Swapping instruction order"));
1024 insn = FM00 | (insn2 << 15) | insn1;
1025 }
1026 else
1027 insn = FM00 | (insn1 << 15) | insn2;
1028 check_resource_conflict (opcode1, insn1, opcode2, insn2);
1029 break;
1030
1031 case PACK_LEFT_RIGHT:
1032 if (opcode1->unit != IU)
1033 insn = FM01 | (insn1 << 15) | insn2;
1034 else if (opcode2->unit == MU || opcode2->unit == EITHER)
1035 {
1036 if (!flag_warn_suppress_instructionswap)
1037 as_warn (_("Swapping instruction order"));
1038 insn = FM10 | (insn2 << 15) | insn1;
1039 }
1040 else
1041 as_fatal (_("IU instruction may not be in the left container"));
1042 if (opcode1->exec_type & ALONE)
1043 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1044 break;
1045
1046 case PACK_RIGHT_LEFT:
1047 if (opcode2->unit != MU)
1048 insn = FM10 | (insn1 << 15) | insn2;
1049 else if (opcode1->unit == IU || opcode1->unit == EITHER)
1050 {
1051 if (!flag_warn_suppress_instructionswap)
1052 as_warn (_("Swapping instruction order"));
1053 insn = FM01 | (insn2 << 15) | insn1;
1054 }
1055 else
1056 as_fatal (_("MU instruction may not be in the right container"));
1057 if (opcode2->exec_type & ALONE)
1058 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1059 break;
1060
1061 default:
1062 as_fatal (_("unknown execution type passed to write_2_short()"));
1063 }
1064
1065 f = frag_more (4);
1066 dwarf2_emit_insn (4);
1067 number_to_chars_bigendian (f, insn, 4);
1068
1069 /* Process fixup chains. fx refers to insn2 when j == 0, and to
1070 insn1 when j == 1. Yes, it's reversed. */
1071
1072 for (j = 0; j < 2; j++)
1073 {
1074 for (i = 0; i < fx->fc; i++)
1075 {
1076 if (fx->fix[i].reloc)
1077 {
1078 where = f - frag_now->fr_literal;
1079 if (fx->fix[i].size == 2)
1080 where += 2;
1081
1082 if (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R
1083 /* A BFD_RELOC_D10V_10_PCREL_R relocation applied to
1084 the instruction in the L container has to be
1085 adjusted to BDF_RELOC_D10V_10_PCREL_L. When
1086 j==0, we're processing insn2's operands, so we
1087 want to mark the operand if insn2 is *not* in the
1088 R container. When j==1, we're processing insn1's
1089 operands, so we want to mark the operand if insn2
1090 *is* in the R container. Note that, if two
1091 instructions are identical, we're never going to
1092 swap them, so the test is safe. */
1093 && j == ((insn & 0x7fff) == insn2))
1094 fx->fix[i].operand |= 1024;
1095
1096 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
1097 fx->fix[i].operand |= 4096;
1098
1099 fix_new_exp (frag_now,
1100 where,
1101 fx->fix[i].size,
1102 &(fx->fix[i].exp),
1103 fx->fix[i].pcrel,
1104 fx->fix[i].operand|2048);
1105 }
1106 }
1107 fx->fc = 0;
1108 fx = fx->next;
1109 }
1110 return 0;
1111 }
1112
1113 /* This is the main entry point for the machine-dependent assembler.
1114 str points to a machine-dependent instruction. This function is
1115 supposed to emit the frags/bytes it assembles to. For the D10V, it
1116 mostly handles the special VLIW parsing and packing and leaves the
1117 difficult stuff to do_assemble(). */
1118
1119 static unsigned long prev_insn;
1120 static struct d10v_opcode *prev_opcode = 0;
1121 static subsegT prev_subseg;
1122 static segT prev_seg = 0;
1123
1124 /* Find the symbol which has the same name as the register in exp. */
1125
1126 static symbolS *
1127 find_symbol_matching_register (expressionS *exp)
1128 {
1129 int i;
1130
1131 if (exp->X_op != O_register)
1132 return NULL;
1133
1134 /* Find the name of the register. */
1135 for (i = d10v_reg_name_cnt (); i--;)
1136 if (d10v_predefined_registers[i].value == exp->X_add_number)
1137 break;
1138
1139 if (i < 0)
1140 abort ();
1141
1142 /* Now see if a symbol has been defined with the same name. */
1143 return symbol_find (d10v_predefined_registers[i].name);
1144 }
1145
1146 /* Get a pointer to an entry in the opcode table.
1147 The function must look at all opcodes with the same name and use
1148 the operands to choose the correct opcode. */
1149
1150 static struct d10v_opcode *
1151 find_opcode (struct d10v_opcode *opcode, expressionS myops[])
1152 {
1153 int i, match;
1154 struct d10v_opcode *next_opcode;
1155
1156 /* Get all the operands and save them as expressions. */
1157 get_operands (myops);
1158
1159 /* Now see if the operand is a fake. If so, find the correct size
1160 instruction, if possible. */
1161 if (opcode->format == OPCODE_FAKE)
1162 {
1163 int opnum = opcode->operands[0];
1164 int flags;
1165
1166 if (myops[opnum].X_op == O_register)
1167 {
1168 myops[opnum].X_op = O_symbol;
1169 myops[opnum].X_add_symbol =
1170 symbol_find_or_make ((char *) myops[opnum].X_op_symbol);
1171 myops[opnum].X_add_number = 0;
1172 myops[opnum].X_op_symbol = NULL;
1173 }
1174
1175 next_opcode = opcode + 1;
1176
1177 /* If the first operand is supposed to be a register, make sure
1178 we got a valid one. */
1179 flags = d10v_operands[next_opcode->operands[0]].flags;
1180 if (flags & OPERAND_REG)
1181 {
1182 int X_op = myops[0].X_op;
1183 int num = myops[0].X_add_number;
1184
1185 if (X_op != O_register
1186 || (num & ~flags
1187 & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1188 | OPERAND_FFLAG | OPERAND_CFLAG | OPERAND_CONTROL))
1189 || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1190 {
1191 as_bad (_("bad opcode or operands"));
1192 return 0;
1193 }
1194 }
1195
1196 if (myops[opnum].X_op == O_constant
1197 || (myops[opnum].X_op == O_symbol
1198 && S_IS_DEFINED (myops[opnum].X_add_symbol)
1199 && (S_GET_SEGMENT (myops[opnum].X_add_symbol) == now_seg)))
1200 {
1201 for (i = 0; opcode->operands[i + 1]; i++)
1202 {
1203 int bits = d10v_operands[next_opcode->operands[opnum]].bits;
1204
1205 flags = d10v_operands[next_opcode->operands[opnum]].flags;
1206
1207 if (flags & OPERAND_ADDR)
1208 bits += 2;
1209
1210 if (myops[opnum].X_op == O_constant)
1211 {
1212 if (!check_range (myops[opnum].X_add_number, bits, flags))
1213 break;
1214 }
1215 else
1216 {
1217 fragS *sym_frag;
1218 fragS *f;
1219 unsigned long current_position;
1220 unsigned long symbol_position;
1221 unsigned long value;
1222 bfd_boolean found_symbol;
1223
1224 /* Calculate the address of the current instruction
1225 and the address of the symbol. Do this by summing
1226 the offsets of previous frags until we reach the
1227 frag containing the symbol, and the current frag. */
1228 sym_frag = symbol_get_frag (myops[opnum].X_add_symbol);
1229 found_symbol = FALSE;
1230
1231 current_position =
1232 obstack_next_free (&frchain_now->frch_obstack)
1233 - frag_now->fr_literal;
1234 symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol);
1235
1236 for (f = frchain_now->frch_root; f; f = f->fr_next)
1237 {
1238 current_position += f->fr_fix + f->fr_offset;
1239
1240 if (f == sym_frag)
1241 found_symbol = TRUE;
1242
1243 if (! found_symbol)
1244 symbol_position += f->fr_fix + f->fr_offset;
1245 }
1246
1247 value = symbol_position;
1248
1249 if (flags & OPERAND_ADDR)
1250 value -= current_position;
1251
1252 if (AT_WORD_P (&myops[opnum]))
1253 {
1254 if (bits > 4)
1255 {
1256 bits += 2;
1257 if (!check_range (value, bits, flags))
1258 break;
1259 }
1260 }
1261 else if (!check_range (value, bits, flags))
1262 break;
1263 }
1264 next_opcode++;
1265 }
1266
1267 if (opcode->operands [i + 1] == 0)
1268 as_fatal (_("value out of range"));
1269 else
1270 opcode = next_opcode;
1271 }
1272 else
1273 /* Not a constant, so use a long instruction. */
1274 opcode += 2;
1275 }
1276
1277 match = 0;
1278
1279 /* Now search the opcode table table for one with operands
1280 that matches what we've got. */
1281 while (!match)
1282 {
1283 match = 1;
1284 for (i = 0; opcode->operands[i]; i++)
1285 {
1286 int flags = d10v_operands[opcode->operands[i]].flags;
1287 int X_op = myops[i].X_op;
1288 int num = myops[i].X_add_number;
1289
1290 if (X_op == 0)
1291 {
1292 match = 0;
1293 break;
1294 }
1295
1296 if (flags & OPERAND_REG)
1297 {
1298 if ((X_op != O_register)
1299 || (num & ~flags
1300 & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1301 | OPERAND_FFLAG | OPERAND_CFLAG
1302 | OPERAND_CONTROL))
1303 || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1304 {
1305 match = 0;
1306 break;
1307 }
1308 }
1309
1310 if (((flags & OPERAND_MINUS) && ((X_op != O_absent) || (num != OPERAND_MINUS))) ||
1311 ((flags & OPERAND_PLUS) && ((X_op != O_absent) || (num != OPERAND_PLUS))) ||
1312 ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) ||
1313 ((flags & OPERAND_ATPAR) && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
1314 ((flags & OPERAND_ATSIGN) && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR)))))
1315 {
1316 match = 0;
1317 break;
1318 }
1319
1320 /* Unfortunately, for the indirect operand in instructions such
1321 as ``ldb r1, @(c,r14)'' this function can be passed
1322 X_op == O_register (because 'c' is a valid register name).
1323 However we cannot just ignore the case when X_op == O_register
1324 but flags & OPERAND_REG is null, so we check to see if a symbol
1325 of the same name as the register exists. If the symbol does
1326 exist, then the parser was unable to distinguish the two cases
1327 and we fix things here. (Ref: PR14826) */
1328
1329 if (!(flags & OPERAND_REG) && (X_op == O_register))
1330 {
1331 symbolS * sym;
1332
1333 sym = find_symbol_matching_register (& myops[i]);
1334
1335 if (sym != NULL)
1336 {
1337 myops[i].X_op = X_op = O_symbol;
1338 myops[i].X_add_symbol = sym;
1339 }
1340 else
1341 as_bad
1342 (_("illegal operand - register name found where none expected"));
1343 }
1344 }
1345
1346 /* We're only done if the operands matched so far AND there
1347 are no more to check. */
1348 if (match && myops[i].X_op == 0)
1349 break;
1350 else
1351 match = 0;
1352
1353 next_opcode = opcode + 1;
1354
1355 if (next_opcode->opcode == 0)
1356 break;
1357
1358 if (strcmp (next_opcode->name, opcode->name))
1359 break;
1360
1361 opcode = next_opcode;
1362 }
1363
1364 if (!match)
1365 {
1366 as_bad (_("bad opcode or operands"));
1367 return 0;
1368 }
1369
1370 /* Check that all registers that are required to be even are.
1371 Also, if any operands were marked as registers, but were really symbols,
1372 fix that here. */
1373 for (i = 0; opcode->operands[i]; i++)
1374 {
1375 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
1376 (myops[i].X_add_number & 1))
1377 as_fatal (_("Register number must be EVEN"));
1378 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_NOSP)
1379 && (myops[i].X_add_number & OPERAND_SP))
1380 as_bad (_("Unsupported use of sp"));
1381 if (myops[i].X_op == O_register)
1382 {
1383 if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
1384 {
1385 myops[i].X_op = O_symbol;
1386 myops[i].X_add_symbol =
1387 symbol_find_or_make ((char *) myops[i].X_op_symbol);
1388 myops[i].X_add_number = 0;
1389 myops[i].X_op_symbol = NULL;
1390 }
1391 }
1392 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_CONTROL)
1393 && (myops[i].X_add_number == OPERAND_CONTROL + 4
1394 || myops[i].X_add_number == OPERAND_CONTROL + 5
1395 || myops[i].X_add_number == OPERAND_CONTROL + 6
1396 || myops[i].X_add_number == OPERAND_CONTROL + 12
1397 || myops[i].X_add_number == OPERAND_CONTROL + 13
1398 || myops[i].X_add_number == OPERAND_CONTROL + 15))
1399 as_warn (_("cr%ld is a reserved control register"),
1400 myops[i].X_add_number - OPERAND_CONTROL);
1401 }
1402 return opcode;
1403 }
1404
1405 /* Assemble a single instruction.
1406 Return an opcode, or -1 (an invalid opcode) on error. */
1407
1408 static unsigned long
1409 do_assemble (char *str, struct d10v_opcode **opcode)
1410 {
1411 unsigned char *op_start, *op_end;
1412 char *save;
1413 char name[20];
1414 int nlen = 0;
1415 expressionS myops[6];
1416
1417 /* Drop leading whitespace. */
1418 while (*str == ' ')
1419 str++;
1420
1421 /* Find the opcode end. */
1422 for (op_start = op_end = (unsigned char *) str;
1423 *op_end && !is_end_of_line[*op_end] && *op_end != ' ';
1424 op_end++)
1425 {
1426 name[nlen] = TOLOWER (op_start[nlen]);
1427 nlen++;
1428 if (nlen == sizeof (name) - 1)
1429 break;
1430 }
1431 name[nlen] = 0;
1432
1433 if (nlen == 0)
1434 return -1;
1435
1436 /* Find the first opcode with the proper name. */
1437 *opcode = (struct d10v_opcode *) hash_find (d10v_hash, name);
1438 if (*opcode == NULL)
1439 return -1;
1440
1441 save = input_line_pointer;
1442 input_line_pointer = (char *) op_end;
1443 *opcode = find_opcode (*opcode, myops);
1444 if (*opcode == 0)
1445 return -1;
1446 input_line_pointer = save;
1447
1448 return build_insn ((*opcode), myops, 0);
1449 }
1450
1451 /* If while processing a fixup, a reloc really needs to be created.
1452 Then it is done here. */
1453
1454 arelent *
1455 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1456 {
1457 arelent *reloc;
1458 reloc = xmalloc (sizeof (arelent));
1459 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1460 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1461 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1462 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1463 if (reloc->howto == (reloc_howto_type *) NULL)
1464 {
1465 as_bad_where (fixp->fx_file, fixp->fx_line,
1466 _("reloc %d not supported by object file format"),
1467 (int) fixp->fx_r_type);
1468 return NULL;
1469 }
1470
1471 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1472 reloc->address = fixp->fx_offset;
1473
1474 reloc->addend = 0;
1475
1476 return reloc;
1477 }
1478
1479 int
1480 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1481 asection *seg ATTRIBUTE_UNUSED)
1482 {
1483 abort ();
1484 return 0;
1485 }
1486
1487 long
1488 md_pcrel_from_section (fixS *fixp, segT sec)
1489 {
1490 if (fixp->fx_addsy != (symbolS *) NULL
1491 && (!S_IS_DEFINED (fixp->fx_addsy)
1492 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1493 return 0;
1494 return fixp->fx_frag->fr_address + fixp->fx_where;
1495 }
1496
1497 void
1498 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1499 {
1500 char *where;
1501 unsigned long insn;
1502 long value = *valP;
1503 int op_type;
1504 int left = 0;
1505
1506 if (fixP->fx_addsy == (symbolS *) NULL)
1507 fixP->fx_done = 1;
1508
1509 /* We don't actually support subtracting a symbol. */
1510 if (fixP->fx_subsy != (symbolS *) NULL)
1511 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1512
1513 op_type = fixP->fx_r_type;
1514 if (op_type & 2048)
1515 {
1516 op_type -= 2048;
1517 if (op_type & 1024)
1518 {
1519 op_type -= 1024;
1520 fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1521 left = 1;
1522 }
1523 else if (op_type & 4096)
1524 {
1525 op_type -= 4096;
1526 fixP->fx_r_type = BFD_RELOC_D10V_18;
1527 }
1528 else
1529 fixP->fx_r_type =
1530 get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
1531 }
1532
1533 /* Fetch the instruction, insert the fully resolved operand
1534 value, and stuff the instruction back again. */
1535 where = fixP->fx_frag->fr_literal + fixP->fx_where;
1536 insn = bfd_getb32 ((unsigned char *) where);
1537
1538 switch (fixP->fx_r_type)
1539 {
1540 case BFD_RELOC_D10V_10_PCREL_L:
1541 case BFD_RELOC_D10V_10_PCREL_R:
1542 case BFD_RELOC_D10V_18_PCREL:
1543 /* If the fix is relative to a global symbol, not a section
1544 symbol, then ignore the offset.
1545 XXX - Do we have to worry about branches to a symbol + offset ? */
1546 if (fixP->fx_addsy != NULL
1547 && S_IS_EXTERNAL (fixP->fx_addsy) )
1548 {
1549 segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
1550 segment_info_type *segf = seg_info(fseg);
1551
1552 if ( segf && segf->sym != fixP->fx_addsy)
1553 value = 0;
1554 }
1555 /* Drop through. */
1556 case BFD_RELOC_D10V_18:
1557 /* Instruction addresses are always right-shifted by 2. */
1558 value >>= AT_WORD_RIGHT_SHIFT;
1559 if (fixP->fx_size == 2)
1560 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1561 else
1562 {
1563 struct d10v_opcode *rep, *repi;
1564
1565 rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep");
1566 repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi");
1567 if ((insn & FM11) == FM11
1568 && ((repi != NULL
1569 && (insn & repi->mask) == (unsigned) repi->opcode)
1570 || (rep != NULL
1571 && (insn & rep->mask) == (unsigned) rep->opcode))
1572 && value < 4)
1573 as_fatal
1574 (_("line %d: rep or repi must include at least 4 instructions"),
1575 fixP->fx_line);
1576 insn =
1577 d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP);
1578 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1579 }
1580 break;
1581 case BFD_RELOC_32:
1582 bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1583 break;
1584 case BFD_RELOC_16:
1585 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1586 break;
1587
1588 case BFD_RELOC_VTABLE_INHERIT:
1589 case BFD_RELOC_VTABLE_ENTRY:
1590 fixP->fx_done = 0;
1591 return;
1592
1593 default:
1594 as_fatal (_("line %d: unknown relocation type: 0x%x"),
1595 fixP->fx_line, fixP->fx_r_type);
1596 }
1597 }
1598
1599 /* d10v_cleanup() is called after the assembler has finished parsing
1600 the input file, when a label is read from the input file, or when a
1601 stab directive is output. Because the D10V assembler sometimes
1602 saves short instructions to see if it can package them with the
1603 next instruction, there may be a short instruction that still needs
1604 to be written.
1605
1606 NOTE: accesses a global, etype.
1607 NOTE: invoked by various macros such as md_cleanup: see. */
1608
1609 int
1610 d10v_cleanup (void)
1611 {
1612 segT seg;
1613 subsegT subseg;
1614
1615 /* If cleanup was invoked because the assembler encountered, e.g., a
1616 user label, we write out the pending instruction, if any. If it
1617 was invoked because the assembler is outputting a piece of line
1618 debugging information, though, we write out the pending
1619 instruction only if the --no-gstabs-packing command line switch
1620 has been specified. */
1621 if (prev_opcode
1622 && etype == PACK_UNSPEC
1623 && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing))
1624 {
1625 seg = now_seg;
1626 subseg = now_subseg;
1627
1628 if (prev_seg)
1629 subseg_set (prev_seg, prev_subseg);
1630
1631 write_1_short (prev_opcode, prev_insn, fixups->next);
1632 subseg_set (seg, subseg);
1633 prev_opcode = NULL;
1634 }
1635 return 1;
1636 }
1637
1638 void
1639 d10v_frob_label (symbolS *lab)
1640 {
1641 d10v_cleanup ();
1642 symbol_set_frag (lab, frag_now);
1643 S_SET_VALUE (lab, (valueT) frag_now_fix ());
1644 dwarf2_emit_label (lab);
1645 }
1646
1647 /* Like normal .word, except support @word.
1648 Clobbers input_line_pointer, checks end-of-line. */
1649
1650 static void
1651 d10v_dot_word (int dummy ATTRIBUTE_UNUSED)
1652 {
1653 expressionS exp;
1654 char *p;
1655
1656 if (is_it_end_of_statement ())
1657 {
1658 demand_empty_rest_of_line ();
1659 return;
1660 }
1661
1662 do
1663 {
1664 expression (&exp);
1665 if (!strncasecmp (input_line_pointer, "@word", 5))
1666 {
1667 exp.X_add_number = 0;
1668 input_line_pointer += 5;
1669
1670 p = frag_more (2);
1671 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1672 &exp, 0, BFD_RELOC_D10V_18);
1673 }
1674 else
1675 emit_expr (&exp, 2);
1676 }
1677 while (*input_line_pointer++ == ',');
1678
1679 input_line_pointer--; /* Put terminator back into stream. */
1680 demand_empty_rest_of_line ();
1681 }
1682
1683 /* Mitsubishi asked that we support some old syntax that apparently
1684 had immediate operands starting with '#'. This is in some of their
1685 sample code but is not documented (although it appears in some
1686 examples in their assembler manual). For now, we'll solve this
1687 compatibility problem by simply ignoring any '#' at the beginning
1688 of an operand. */
1689
1690 /* Operands that begin with '#' should fall through to here.
1691 From expr.c. */
1692
1693 void
1694 md_operand (expressionS *expressionP)
1695 {
1696 if (*input_line_pointer == '#' && ! do_not_ignore_hash)
1697 {
1698 input_line_pointer++;
1699 expression (expressionP);
1700 }
1701 }
1702
1703 bfd_boolean
1704 d10v_fix_adjustable (fixS *fixP)
1705 {
1706 /* We need the symbol name for the VTABLE entries. */
1707 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1708 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1709 return 0;
1710
1711 return 1;
1712 }
1713
1714 /* The target specific pseudo-ops which we support. */
1715 const pseudo_typeS md_pseudo_table[] =
1716 {
1717 { "word", d10v_dot_word, 2 },
1718 { NULL, NULL, 0 }
1719 };
1720
1721 void
1722 md_assemble (char *str)
1723 {
1724 /* etype is saved extype. For multi-line instructions. */
1725 packing_type extype = PACK_UNSPEC; /* Parallel, etc. */
1726 struct d10v_opcode *opcode;
1727 unsigned long insn;
1728 char *str2;
1729
1730 if (etype == PACK_UNSPEC)
1731 {
1732 /* Look for the special multiple instruction separators. */
1733 str2 = strstr (str, "||");
1734 if (str2)
1735 extype = PACK_PARALLEL;
1736 else
1737 {
1738 str2 = strstr (str, "->");
1739 if (str2)
1740 extype = PACK_LEFT_RIGHT;
1741 else
1742 {
1743 str2 = strstr (str, "<-");
1744 if (str2)
1745 extype = PACK_RIGHT_LEFT;
1746 }
1747 }
1748
1749 /* str2 points to the separator, if there is one. */
1750 if (str2)
1751 {
1752 *str2 = 0;
1753
1754 /* If two instructions are present and we already have one saved,
1755 then first write out the saved one. */
1756 d10v_cleanup ();
1757
1758 /* Assemble first instruction and save it. */
1759 prev_insn = do_assemble (str, &prev_opcode);
1760 prev_seg = now_seg;
1761 prev_subseg = now_subseg;
1762 if (prev_insn == (unsigned long) -1)
1763 as_fatal (_("can't find previous opcode "));
1764 fixups = fixups->next;
1765 str = str2 + 2;
1766 }
1767 }
1768
1769 insn = do_assemble (str, &opcode);
1770 if (insn == (unsigned long) -1)
1771 {
1772 if (extype != PACK_UNSPEC)
1773 etype = extype;
1774 else
1775 as_bad (_("could not assemble: %s"), str);
1776 return;
1777 }
1778
1779 if (etype != PACK_UNSPEC)
1780 {
1781 extype = etype;
1782 etype = PACK_UNSPEC;
1783 }
1784
1785 /* If this is a long instruction, write it and any previous short
1786 instruction. */
1787 if (opcode->format & LONG_OPCODE)
1788 {
1789 if (extype != PACK_UNSPEC)
1790 as_fatal (_("Unable to mix instructions as specified"));
1791 d10v_cleanup ();
1792 write_long (insn, fixups);
1793 prev_opcode = NULL;
1794 return;
1795 }
1796
1797 if (prev_opcode
1798 && prev_seg
1799 && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1800 d10v_cleanup ();
1801
1802 if (prev_opcode
1803 && (0 == write_2_short (prev_opcode, prev_insn, opcode, insn, extype,
1804 fixups)))
1805 {
1806 /* No instructions saved. */
1807 prev_opcode = NULL;
1808 }
1809 else
1810 {
1811 if (extype != PACK_UNSPEC)
1812 as_fatal (_("Unable to mix instructions as specified"));
1813 /* Save last instruction so it may be packed on next pass. */
1814 prev_opcode = opcode;
1815 prev_insn = insn;
1816 prev_seg = now_seg;
1817 prev_subseg = now_subseg;
1818 fixups = fixups->next;
1819 }
1820 }
1821