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