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