2001-01-15 Jeff Johnston <jjohnstn@redhat.com>
[binutils.git] / gas / config / tc-d10v.c
blob85cfe875960a7a6a17e4fa89eb31b9e26c8a0c3a
1 /* tc-d10v.c -- Assembler code for the Mitsubishi D10V
2 Copyright (C) 1996, 97, 98, 99, 2000 Free Software Foundation.
4 This file is part of GAS, the GNU Assembler.
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.
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.
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. */
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 //#include "read.h"
29 const char comment_chars[] = ";";
30 const char line_comment_chars[] = "#";
31 const char line_separator_chars[] = "";
32 const char *md_shortopts = "O";
33 const char EXP_CHARS[] = "eE";
34 const char FLT_CHARS[] = "dD";
36 int Optimizing = 0;
38 #define AT_WORD_P(X) ((X)->X_op == O_right_shift \
39 && (X)->X_op_symbol != NULL \
40 && symbol_constant_p ((X)->X_op_symbol) \
41 && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT)
42 #define AT_WORD_RIGHT_SHIFT 2
44 /* Fixups. */
45 #define MAX_INSN_FIXUPS (5)
46 struct d10v_fixup
48 expressionS exp;
49 int operand;
50 int pcrel;
51 int size;
52 bfd_reloc_code_real_type reloc;
55 typedef struct _fixups
57 int fc;
58 struct d10v_fixup fix[MAX_INSN_FIXUPS];
59 struct _fixups *next;
60 } Fixups;
62 static Fixups FixUps[2];
63 static Fixups *fixups;
65 static int do_not_ignore_hash = 0;
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. */
74 /* True if instruction swapping warnings should be inhibited.
75 --nowarnswap. */
76 static boolean flag_warn_suppress_instructionswap;
78 /* True if instruction packing should be performed when --gstabs is specified.
79 --gstabs-packing, --no-gstabs-packing. */
80 static boolean flag_allow_gstabs_packing = 1;
82 /* Local functions. */
83 static int reg_name_search PARAMS ((char *name));
84 static int register_name PARAMS ((expressionS *expressionP));
85 static int check_range PARAMS ((unsigned long num, int bits, int flags));
86 static int postfix PARAMS ((char *p));
87 static bfd_reloc_code_real_type get_reloc PARAMS ((struct d10v_operand *op));
88 static int get_operands PARAMS ((expressionS exp[]));
89 static struct d10v_opcode *find_opcode PARAMS ((struct d10v_opcode *opcode, expressionS ops[]));
90 static unsigned long build_insn PARAMS ((struct d10v_opcode *opcode, expressionS *opers, unsigned long insn));
91 static void write_long PARAMS ((unsigned long insn, Fixups *fx));
92 static void write_1_short PARAMS ((struct d10v_opcode *opcode, unsigned long insn, Fixups *fx));
93 static int write_2_short PARAMS ((struct d10v_opcode *opcode1, unsigned long insn1,
94 struct d10v_opcode *opcode2, unsigned long insn2, packing_type exec_type, Fixups *fx));
95 static unsigned long do_assemble PARAMS ((char *str, struct d10v_opcode **opcode));
96 static unsigned long d10v_insert_operand PARAMS (( unsigned long insn, int op_type,
97 offsetT value, int left, fixS *fix));
98 static int parallel_ok PARAMS ((struct d10v_opcode *opcode1, unsigned long insn1,
99 struct d10v_opcode *opcode2, unsigned long insn2,
100 packing_type exec_type));
101 static symbolS * find_symbol_matching_register PARAMS ((expressionS *));
103 struct option md_longopts[] =
105 #define OPTION_NOWARNSWAP (OPTION_MD_BASE)
106 {"nowarnswap", no_argument, NULL, OPTION_NOWARNSWAP},
107 #define OPTION_GSTABSPACKING (OPTION_MD_BASE + 1)
108 {"gstabspacking", no_argument, NULL, OPTION_GSTABSPACKING},
109 {"gstabs-packing", no_argument, NULL, OPTION_GSTABSPACKING},
110 #define OPTION_NOGSTABSPACKING (OPTION_MD_BASE + 2)
111 {"nogstabspacking", no_argument, NULL, OPTION_NOGSTABSPACKING},
112 {"no-gstabs-packing", no_argument, NULL, OPTION_NOGSTABSPACKING},
113 {NULL, no_argument, NULL, 0}
116 size_t md_longopts_size = sizeof (md_longopts);
118 static void d10v_dot_word PARAMS ((int));
120 /* The target specific pseudo-ops which we support. */
121 const pseudo_typeS md_pseudo_table[] =
123 { "word", d10v_dot_word, 2 },
124 { NULL, NULL, 0 }
127 /* Opcode hash table. */
128 static struct hash_control *d10v_hash;
130 /* Do a binary search of the d10v_predefined_registers array to see if
131 NAME is a valid regiter name. Return the register number from the
132 array on success, or -1 on failure. */
134 static int
135 reg_name_search (name)
136 char *name;
138 int middle, low, high;
139 int cmp;
141 low = 0;
142 high = d10v_reg_name_cnt () - 1;
146 middle = (low + high) / 2;
147 cmp = strcasecmp (name, d10v_predefined_registers[middle].name);
148 if (cmp < 0)
149 high = middle - 1;
150 else if (cmp > 0)
151 low = middle + 1;
152 else
153 return d10v_predefined_registers[middle].value;
155 while (low <= high);
156 return -1;
159 /* Check the string at input_line_pointer
160 to see if it is a valid register name. */
162 static int
163 register_name (expressionP)
164 expressionS *expressionP;
166 int reg_number;
167 char c, *p = input_line_pointer;
169 while (*p
170 && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
171 p++;
173 c = *p;
174 if (c)
175 *p++ = 0;
177 /* Look to see if it's in the register table. */
178 reg_number = reg_name_search (input_line_pointer);
179 if (reg_number >= 0)
181 expressionP->X_op = O_register;
182 /* Temporarily store a pointer to the string here. */
183 expressionP->X_op_symbol = (symbolS *) input_line_pointer;
184 expressionP->X_add_number = reg_number;
185 input_line_pointer = p;
186 return 1;
188 if (c)
189 *(p - 1) = c;
190 return 0;
193 static int
194 check_range (num, bits, flags)
195 unsigned long num;
196 int bits;
197 int flags;
199 long min, max;
200 int retval = 0;
202 /* Don't bother checking 16-bit values. */
203 if (bits == 16)
204 return 0;
206 if (flags & OPERAND_SHIFT)
208 /* All special shift operands are unsigned and <= 16.
209 We allow 0 for now. */
210 if (num > 16)
211 return 1;
212 else
213 return 0;
216 if (flags & OPERAND_SIGNED)
218 /* Signed 3-bit integers are restricted to the (-2, 3) range. */
219 if (flags & RESTRICTED_NUM3)
221 if ((long) num < -2 || (long) num > 3)
222 retval = 1;
224 else
226 max = (1 << (bits - 1)) - 1;
227 min = - (1 << (bits - 1));
228 if (((long) num > max) || ((long) num < min))
229 retval = 1;
232 else
234 max = (1 << bits) - 1;
235 min = 0;
236 if (((long) num > max) || ((long) num < min))
237 retval = 1;
239 return retval;
242 void
243 md_show_usage (stream)
244 FILE *stream;
246 fprintf (stream, _("D10V options:\n\
247 -O Optimize. Will do some operations in parallel.\n\
248 --gstabs-packing Pack adjacent short instructions together even\n\
249 when --gstabs is specified. On by default.\n\
250 --no-gstabs-packing If --gstabs is specified, do not pack adjacent\n\
251 instructions together.\n"));
255 md_parse_option (c, arg)
256 int c;
257 char *arg ATTRIBUTE_UNUSED;
259 switch (c)
261 case 'O':
262 /* Optimize. Will attempt to parallelize operations. */
263 Optimizing = 1;
264 break;
265 case OPTION_NOWARNSWAP:
266 flag_warn_suppress_instructionswap = 1;
267 break;
268 case OPTION_GSTABSPACKING:
269 flag_allow_gstabs_packing = 1;
270 break;
271 case OPTION_NOGSTABSPACKING:
272 flag_allow_gstabs_packing = 0;
273 break;
274 default:
275 return 0;
277 return 1;
280 symbolS *
281 md_undefined_symbol (name)
282 char *name ATTRIBUTE_UNUSED;
284 return 0;
287 /* Turn a string in input_line_pointer into a floating point constant
288 of type TYPE, and store the appropriate bytes in *LITP. The number
289 of LITTLENUMS emitted is stored in *SIZEP. An error message is
290 returned, or NULL on OK. */
292 char *
293 md_atof (type, litP, sizeP)
294 int type;
295 char *litP;
296 int *sizeP;
298 int prec;
299 LITTLENUM_TYPE words[4];
300 char *t;
301 int i;
303 switch (type)
305 case 'f':
306 prec = 2;
307 break;
308 case 'd':
309 prec = 4;
310 break;
311 default:
312 *sizeP = 0;
313 return _("bad call to md_atof");
316 t = atof_ieee (input_line_pointer, type, words);
317 if (t)
318 input_line_pointer = t;
320 *sizeP = prec * 2;
322 for (i = 0; i < prec; i++)
324 md_number_to_chars (litP, (valueT) words[i], 2);
325 litP += 2;
327 return NULL;
330 void
331 md_convert_frag (abfd, sec, fragP)
332 bfd *abfd ATTRIBUTE_UNUSED;
333 asection *sec ATTRIBUTE_UNUSED;
334 fragS *fragP ATTRIBUTE_UNUSED;
336 abort ();
339 valueT
340 md_section_align (seg, addr)
341 asection *seg;
342 valueT addr;
344 int align = bfd_get_section_alignment (stdoutput, seg);
345 return ((addr + (1 << align) - 1) & (-1 << align));
348 void
349 md_begin ()
351 char *prev_name = "";
352 struct d10v_opcode *opcode;
353 d10v_hash = hash_new ();
355 /* Insert unique names into hash table. The D10v instruction set
356 has many identical opcode names that have different opcodes based
357 on the operands. This hash table then provides a quick index to
358 the first opcode with a particular name in the opcode table. */
360 for (opcode = (struct d10v_opcode *) d10v_opcodes; opcode->name; opcode++)
362 if (strcmp (prev_name, opcode->name))
364 prev_name = (char *) opcode->name;
365 hash_insert (d10v_hash, opcode->name, (char *) opcode);
369 fixups = &FixUps[0];
370 FixUps[0].next = &FixUps[1];
371 FixUps[1].next = &FixUps[0];
374 /* Remove the postincrement or postdecrement operator ( '+' or '-' )
375 from an expression. */
377 static int
378 postfix (p)
379 char *p;
381 while (*p != '-' && *p != '+')
383 if (*p == 0 || *p == '\n' || *p == '\r')
384 break;
385 p++;
388 if (*p == '-')
390 *p = ' ';
391 return (-1);
393 if (*p == '+')
395 *p = ' ';
396 return (1);
399 return (0);
402 static bfd_reloc_code_real_type
403 get_reloc (op)
404 struct d10v_operand *op;
406 int bits = op->bits;
408 if (bits <= 4)
409 return (0);
411 if (op->flags & OPERAND_ADDR)
413 if (bits == 8)
414 return (BFD_RELOC_D10V_10_PCREL_R);
415 else
416 return (BFD_RELOC_D10V_18_PCREL);
419 return (BFD_RELOC_16);
422 /* Parse a string of operands. Return an array of expressions. */
424 static int
425 get_operands (exp)
426 expressionS exp[];
428 char *p = input_line_pointer;
429 int numops = 0;
430 int post = 0;
431 int uses_at = 0;
433 while (*p)
435 while (*p == ' ' || *p == '\t' || *p == ',')
436 p++;
437 if (*p == 0 || *p == '\n' || *p == '\r')
438 break;
440 if (*p == '@')
442 uses_at = 1;
444 p++;
445 exp[numops].X_op = O_absent;
446 if (*p == '(')
448 p++;
449 exp[numops].X_add_number = OPERAND_ATPAR;
451 else if (*p == '-')
453 p++;
454 exp[numops].X_add_number = OPERAND_ATMINUS;
456 else
458 exp[numops].X_add_number = OPERAND_ATSIGN;
459 post = postfix (p);
461 numops++;
462 continue;
465 if (*p == ')')
467 /* Just skip the trailing paren. */
468 p++;
469 continue;
472 input_line_pointer = p;
474 /* Check to see if it might be a register name. */
475 if (!register_name (&exp[numops]))
477 /* Parse as an expression. */
478 if (uses_at)
480 /* Any expression that involves the indirect addressing
481 cannot also involve immediate addressing. Therefore
482 the use of the hash character is illegal. */
483 int save = do_not_ignore_hash;
484 do_not_ignore_hash = 1;
486 expression (&exp[numops]);
488 do_not_ignore_hash = save;
490 else
491 expression (&exp[numops]);
494 if (strncasecmp (input_line_pointer, "@word", 5) == 0)
496 input_line_pointer += 5;
497 if (exp[numops].X_op == O_register)
499 /* If it looked like a register name but was followed by
500 "@word" then it was really a symbol, so change it to
501 one. */
502 exp[numops].X_op = O_symbol;
503 exp[numops].X_add_symbol =
504 symbol_find_or_make ((char *) exp[numops].X_op_symbol);
507 /* Check for identifier@word+constant. */
508 if (*input_line_pointer == '-' || *input_line_pointer == '+')
510 expressionS new_exp;
511 expression (&new_exp);
512 exp[numops].X_add_number = new_exp.X_add_number;
515 /* Convert expr into a right shift by AT_WORD_RIGHT_SHIFT. */
517 expressionS new_exp;
518 memset (&new_exp, 0, sizeof new_exp);
519 new_exp.X_add_number = AT_WORD_RIGHT_SHIFT;
520 new_exp.X_op = O_constant;
521 new_exp.X_unsigned = 1;
522 exp[numops].X_op_symbol = make_expr_symbol (&new_exp);
523 exp[numops].X_op = O_right_shift;
526 know (AT_WORD_P (&exp[numops]));
529 if (exp[numops].X_op == O_illegal)
530 as_bad (_("illegal operand"));
531 else if (exp[numops].X_op == O_absent)
532 as_bad (_("missing operand"));
534 numops++;
535 p = input_line_pointer;
538 switch (post)
540 case -1: /* Postdecrement mode. */
541 exp[numops].X_op = O_absent;
542 exp[numops++].X_add_number = OPERAND_MINUS;
543 break;
544 case 1: /* Postincrement mode. */
545 exp[numops].X_op = O_absent;
546 exp[numops++].X_add_number = OPERAND_PLUS;
547 break;
550 exp[numops].X_op = 0;
551 return (numops);
554 static unsigned long
555 d10v_insert_operand (insn, op_type, value, left, fix)
556 unsigned long insn;
557 int op_type;
558 offsetT value;
559 int left;
560 fixS *fix;
562 int shift, bits;
564 shift = d10v_operands[op_type].shift;
565 if (left)
566 shift += 15;
568 bits = d10v_operands[op_type].bits;
570 /* Truncate to the proper number of bits. */
571 if (check_range (value, bits, d10v_operands[op_type].flags))
572 as_bad_where (fix->fx_file, fix->fx_line,
573 _("operand out of range: %d"), value);
575 value &= 0x7FFFFFFF >> (31 - bits);
576 insn |= (value << shift);
578 return insn;
581 /* Take a pointer to the opcode entry in the opcode table and the
582 array of operand expressions. Return the instruction. */
584 static unsigned long
585 build_insn (opcode, opers, insn)
586 struct d10v_opcode *opcode;
587 expressionS *opers;
588 unsigned long insn;
590 int i, bits, shift, flags, format;
591 unsigned long number;
593 /* The insn argument is only used for the DIVS kludge. */
594 if (insn)
595 format = LONG_R;
596 else
598 insn = opcode->opcode;
599 format = opcode->format;
602 for (i = 0; opcode->operands[i]; i++)
604 flags = d10v_operands[opcode->operands[i]].flags;
605 bits = d10v_operands[opcode->operands[i]].bits;
606 shift = d10v_operands[opcode->operands[i]].shift;
607 number = opers[i].X_add_number;
609 if (flags & OPERAND_REG)
611 number &= REGISTER_MASK;
612 if (format == LONG_L)
613 shift += 15;
616 if (opers[i].X_op != O_register && opers[i].X_op != O_constant)
618 /* Now create a fixup. */
620 if (fixups->fc >= MAX_INSN_FIXUPS)
621 as_fatal (_("too many fixups"));
623 if (AT_WORD_P (&opers[i]))
625 /* Reconize XXX>>1+N aka XXX@word+N as special (AT_WORD). */
626 fixups->fix[fixups->fc].reloc = BFD_RELOC_D10V_18;
627 opers[i].X_op = O_symbol;
628 opers[i].X_op_symbol = NULL; /* Should free it. */
629 /* number is left shifted by AT_WORD_RIGHT_SHIFT so
630 that, it is aligned with the symbol's value. Later,
631 BFD_RELOC_D10V_18 will right shift (symbol_value +
632 X_add_number). */
633 number <<= AT_WORD_RIGHT_SHIFT;
634 opers[i].X_add_number = number;
636 else
637 fixups->fix[fixups->fc].reloc =
638 get_reloc ((struct d10v_operand *) &d10v_operands[opcode->operands[i]]);
640 if (fixups->fix[fixups->fc].reloc == BFD_RELOC_16 ||
641 fixups->fix[fixups->fc].reloc == BFD_RELOC_D10V_18)
642 fixups->fix[fixups->fc].size = 2;
643 else
644 fixups->fix[fixups->fc].size = 4;
646 fixups->fix[fixups->fc].exp = opers[i];
647 fixups->fix[fixups->fc].operand = opcode->operands[i];
648 fixups->fix[fixups->fc].pcrel =
649 (flags & OPERAND_ADDR) ? true : false;
650 (fixups->fc)++;
653 /* Truncate to the proper number of bits. */
654 if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
655 as_bad (_("operand out of range: %d"), number);
656 number &= 0x7FFFFFFF >> (31 - bits);
657 insn = insn | (number << shift);
660 /* kludge: for DIVS, we need to put the operands in twice */
661 /* on the second pass, format is changed to LONG_R to force
662 the second set of operands to not be shifted over 15. */
663 if ((opcode->opcode == OPCODE_DIVS) && (format == LONG_L))
664 insn = build_insn (opcode, opers, insn);
666 return insn;
669 /* Write out a long form instruction. */
671 static void
672 write_long (insn, fx)
673 unsigned long insn;
674 Fixups *fx;
676 int i, where;
677 char *f = frag_more (4);
679 insn |= FM11;
680 number_to_chars_bigendian (f, insn, 4);
682 for (i = 0; i < fx->fc; i++)
684 if (fx->fix[i].reloc)
686 where = f - frag_now->fr_literal;
687 if (fx->fix[i].size == 2)
688 where += 2;
690 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
691 fx->fix[i].operand |= 4096;
693 fix_new_exp (frag_now,
694 where,
695 fx->fix[i].size,
696 &(fx->fix[i].exp),
697 fx->fix[i].pcrel,
698 fx->fix[i].operand|2048);
701 fx->fc = 0;
704 /* Write out a short form instruction by itself. */
706 static void
707 write_1_short (opcode, insn, fx)
708 struct d10v_opcode *opcode;
709 unsigned long insn;
710 Fixups *fx;
712 char *f = frag_more (4);
713 int i, where;
715 if (opcode->exec_type & PARONLY)
716 as_fatal (_("Instruction must be executed in parallel with another instruction."));
718 /* The other container needs to be NOP. */
719 /* According to 4.3.1: for FM=00, sub-instructions performed only
720 by IU cannot be encoded in L-container. */
721 if (opcode->unit == IU)
722 insn |= FM00 | (NOP << 15); /* Right container. */
723 else
724 insn = FM00 | (insn << 15) | NOP; /* Left container. */
726 number_to_chars_bigendian (f, insn, 4);
727 for (i = 0; i < fx->fc; i++)
729 if (fx->fix[i].reloc)
731 where = f - frag_now->fr_literal;
732 if (fx->fix[i].size == 2)
733 where += 2;
735 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
736 fx->fix[i].operand |= 4096;
738 /* If it's an R reloc, we may have to switch it to L. */
739 if ((fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R)
740 && (opcode->unit != IU))
741 fx->fix[i].operand |= 1024;
743 fix_new_exp (frag_now,
744 where,
745 fx->fix[i].size,
746 &(fx->fix[i].exp),
747 fx->fix[i].pcrel,
748 fx->fix[i].operand|2048);
751 fx->fc = 0;
754 /* Expects two short instructions.
755 If possible, writes out both as a single packed instruction.
756 Otherwise, writes out the first one, packed with a NOP.
757 Returns number of instructions not written out. */
759 static int
760 write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx)
761 struct d10v_opcode *opcode1, *opcode2;
762 unsigned long insn1, insn2;
763 packing_type exec_type;
764 Fixups *fx;
766 unsigned long insn;
767 char *f;
768 int i, j, where;
770 if ((exec_type != PACK_PARALLEL)
771 && ((opcode1->exec_type & PARONLY) || (opcode2->exec_type & PARONLY)))
772 as_fatal (_("Instruction must be executed in parallel"));
774 if ((opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE))
775 as_fatal (_("Long instructions may not be combined."));
777 switch (exec_type)
779 case PACK_UNSPEC: /* Order not specified. */
780 if (opcode1->exec_type & ALONE)
782 /* Case of a short branch on a separate GAS line.
783 Pack with NOP. */
784 write_1_short (opcode1, insn1, fx->next);
785 return 1;
787 if (Optimizing
788 && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
790 /* Parallel. */
791 if (opcode1->unit == IU)
792 insn = FM00 | (insn2 << 15) | insn1;
793 else if (opcode2->unit == MU)
794 insn = FM00 | (insn2 << 15) | insn1;
795 else
797 insn = FM00 | (insn1 << 15) | insn2;
798 /* Advance over dummy fixup since packed insn1 in L. */
799 fx = fx->next;
802 else if (opcode1->unit == IU)
803 /* Reverse sequential with IU opcode1 on right and done first. */
804 insn = FM10 | (insn2 << 15) | insn1;
805 else
807 /* Sequential with non-IU opcode1 on left and done first. */
808 insn = FM01 | (insn1 << 15) | insn2;
809 /* Advance over dummy fixup since packed insn1 in L. */
810 fx = fx->next;
812 break;
814 case PACK_PARALLEL:
815 if (opcode1->exec_type & SEQ || opcode2->exec_type & SEQ)
816 as_fatal
817 (_("One of these instructions may not be executed in parallel."));
818 if (opcode1->unit == IU)
820 if (opcode2->unit == IU)
821 as_fatal (_("Two IU instructions may not be executed in parallel"));
822 if (!flag_warn_suppress_instructionswap)
823 as_warn (_("Swapping instruction order"));
824 insn = FM00 | (insn2 << 15) | insn1;
826 else if (opcode2->unit == MU)
828 if (opcode1->unit == MU)
829 as_fatal (_("Two MU instructions may not be executed in parallel"));
830 if (!flag_warn_suppress_instructionswap)
831 as_warn (_("Swapping instruction order"));
832 insn = FM00 | (insn2 << 15) | insn1;
834 else
836 insn = FM00 | (insn1 << 15) | insn2;
837 /* Advance over dummy fixup since packed insn1 in L. */
838 fx = fx->next;
840 break;
842 case PACK_LEFT_RIGHT:
843 if (opcode1->unit != IU)
844 insn = FM01 | (insn1 << 15) | insn2;
845 else if (opcode2->unit == MU || opcode2->unit == EITHER)
847 if (!flag_warn_suppress_instructionswap)
848 as_warn (_("Swapping instruction order"));
849 insn = FM10 | (insn2 << 15) | insn1;
851 else
852 as_fatal (_("IU instruction may not be in the left container"));
853 if (opcode1->exec_type & ALONE)
854 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
855 /* Advance over dummy fixup. */
856 fx = fx->next;
857 break;
859 case PACK_RIGHT_LEFT:
860 if (opcode2->unit != MU)
861 insn = FM10 | (insn1 << 15) | insn2;
862 else if (opcode1->unit == IU || opcode1->unit == EITHER)
864 if (!flag_warn_suppress_instructionswap)
865 as_warn (_("Swapping instruction order"));
866 insn = FM01 | (insn2 << 15) | insn1;
868 else
869 as_fatal (_("MU instruction may not be in the right container"));
870 if (opcode2->exec_type & ALONE)
871 as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
872 /* Advance over dummy fixup. */
873 fx = fx->next;
874 break;
876 default:
877 as_fatal (_("unknown execution type passed to write_2_short()"));
880 f = frag_more (4);
881 number_to_chars_bigendian (f, insn, 4);
883 /* Process fixup chains.
884 Note that the packing code above advanced fx conditionally.
885 dlindsay@cygnus.com: There's something subtle going on here involving
886 _dummy_first_bfd_reloc_code_real. This is related to the
887 difference between BFD_RELOC_D10V_10_PCREL_R and _L, ie whether
888 a fixup is done in the L or R container. A bug in this code
889 can pass Plum Hall fine, yet still affect hand-written assembler. */
891 for (j = 0; j < 2; j++)
893 for (i = 0; i < fx->fc; i++)
895 if (fx->fix[i].reloc)
897 where = f - frag_now->fr_literal;
898 if (fx->fix[i].size == 2)
899 where += 2;
901 if ((fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R) && (j == 0))
902 fx->fix[i].operand |= 1024;
904 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
905 fx->fix[i].operand |= 4096;
907 fix_new_exp (frag_now,
908 where,
909 fx->fix[i].size,
910 &(fx->fix[i].exp),
911 fx->fix[i].pcrel,
912 fx->fix[i].operand|2048);
915 fx->fc = 0;
916 fx = fx->next;
918 return (0);
921 /* Check 2 instructions and determine if they can be safely
922 executed in parallel. Return 1 if they can be. */
924 static int
925 parallel_ok (op1, insn1, op2, insn2, exec_type)
926 struct d10v_opcode *op1, *op2;
927 unsigned long insn1, insn2;
928 packing_type exec_type;
930 int i, j, flags, mask, shift, regno;
931 unsigned long ins, mod[2], used[2];
932 struct d10v_opcode *op;
934 if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0
935 || (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0
936 || (op1->unit == BOTH) || (op2->unit == BOTH)
937 || (op1->unit == IU && op2->unit == IU)
938 || (op1->unit == MU && op2->unit == MU))
939 return 0;
941 /* If this is auto parallization, and either instruction is a branch,
942 don't parallel. */
943 if (exec_type == PACK_UNSPEC
944 && (op1->exec_type & ALONE || op2->exec_type & ALONE))
945 return 0;
947 /* The idea here is to create two sets of bitmasks (mod and used)
948 which indicate which registers are modified or used by each
949 instruction. The operation can only be done in parallel if
950 instruction 1 and instruction 2 modify different registers, and
951 the first instruction does not modify registers that the second
952 is using (The second instruction can modify registers that the
953 first is using as they are only written back after the first
954 instruction has completed). Accesses to control registers, PSW,
955 and memory are treated as accesses to a single register. So if
956 both instructions write memory or if the first instruction writes
957 memory and the second reads, then they cannot be done in
958 parallel. Likewise, if the first instruction mucks with the psw
959 and the second reads the PSW (which includes C, F0, and F1), then
960 they cannot operate safely in parallel. */
962 /* The bitmasks (mod and used) look like this (bit 31 = MSB). */
963 /* r0-r15 0-15 */
964 /* a0-a1 16-17 */
965 /* cr (not psw) 18 */
966 /* psw 19 */
967 /* mem 20 */
969 for (j = 0; j < 2; j++)
971 if (j == 0)
973 op = op1;
974 ins = insn1;
976 else
978 op = op2;
979 ins = insn2;
981 mod[j] = used[j] = 0;
982 if (op->exec_type & BRANCH_LINK)
983 mod[j] |= 1 << 13;
985 for (i = 0; op->operands[i]; i++)
987 flags = d10v_operands[op->operands[i]].flags;
988 shift = d10v_operands[op->operands[i]].shift;
989 mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
990 if (flags & OPERAND_REG)
992 regno = (ins >> shift) & mask;
993 if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
994 regno += 16;
995 else if (flags & OPERAND_CONTROL) /* mvtc or mvfc. */
997 if (regno == 0)
998 regno = 19;
999 else
1000 regno = 18;
1002 else if (flags & (OPERAND_FFLAG | OPERAND_CFLAG))
1003 regno = 19;
1005 if (flags & OPERAND_DEST)
1007 mod[j] |= 1 << regno;
1008 if (flags & OPERAND_EVEN)
1009 mod[j] |= 1 << (regno + 1);
1011 else
1013 used[j] |= 1 << regno;
1014 if (flags & OPERAND_EVEN)
1015 used[j] |= 1 << (regno + 1);
1017 /* Auto inc/dec also modifies the register. */
1018 if (op->operands[i + 1] != 0
1019 && (d10v_operands[op->operands[i + 1]].flags
1020 & (OPERAND_PLUS | OPERAND_MINUS)) != 0)
1021 mod[j] |= 1 << regno;
1024 else if (flags & OPERAND_ATMINUS)
1026 /* SP implicitly used/modified. */
1027 mod[j] |= 1 << 15;
1028 used[j] |= 1 << 15;
1031 if (op->exec_type & RMEM)
1032 used[j] |= 1 << 20;
1033 else if (op->exec_type & WMEM)
1034 mod[j] |= 1 << 20;
1035 else if (op->exec_type & RF0)
1036 used[j] |= 1 << 19;
1037 else if (op->exec_type & WF0)
1038 mod[j] |= 1 << 19;
1039 else if (op->exec_type & WCAR)
1040 mod[j] |= 1 << 19;
1042 if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0)
1043 return 1;
1044 return 0;
1047 /* This is the main entry point for the machine-dependent assembler.
1048 STR points to a machine-dependent instruction. This function is
1049 supposed to emit the frags/bytes it assembles to. For the D10V, it
1050 mostly handles the special VLIW parsing and packing and leaves the
1051 difficult stuff to do_assemble(). */
1053 static unsigned long prev_insn;
1054 static struct d10v_opcode *prev_opcode = 0;
1055 static subsegT prev_subseg;
1056 static segT prev_seg = 0;;
1058 void
1059 md_assemble (str)
1060 char *str;
1062 /* etype is saved extype. For multi-line instructions. */
1064 packing_type extype = PACK_UNSPEC; /* Parallel, etc. */
1066 struct d10v_opcode *opcode;
1067 unsigned long insn;
1068 char *str2;
1070 if (etype == PACK_UNSPEC)
1072 /* Look for the special multiple instruction separators. */
1073 str2 = strstr (str, "||");
1074 if (str2)
1075 extype = PACK_PARALLEL;
1076 else
1078 str2 = strstr (str, "->");
1079 if (str2)
1080 extype = PACK_LEFT_RIGHT;
1081 else
1083 str2 = strstr (str, "<-");
1084 if (str2)
1085 extype = PACK_RIGHT_LEFT;
1088 /* STR2 points to the separator, if there is one. */
1089 if (str2)
1091 *str2 = 0;
1093 /* If two instructions are present and we already have one saved,
1094 then first write out the saved one. */
1095 d10v_cleanup ();
1097 /* Assemble first instruction and save it. */
1098 prev_insn = do_assemble (str, &prev_opcode);
1099 prev_seg = now_seg;
1100 prev_subseg = now_subseg;
1101 if (prev_insn == (unsigned long) -1)
1102 as_fatal (_("can't find opcode "));
1103 fixups = fixups->next;
1104 str = str2 + 2;
1108 insn = do_assemble (str, &opcode);
1109 if (insn == (unsigned long) -1)
1111 if (extype != PACK_UNSPEC)
1113 etype = extype;
1114 return;
1116 as_fatal (_("can't find opcode "));
1119 if (etype != PACK_UNSPEC)
1121 extype = etype;
1122 etype = PACK_UNSPEC;
1125 /* If this is a long instruction, write it and any previous short
1126 instruction. */
1127 if (opcode->format & LONG_OPCODE)
1129 if (extype != PACK_UNSPEC)
1130 as_fatal (_("Unable to mix instructions as specified"));
1131 d10v_cleanup ();
1132 write_long (insn, fixups);
1133 prev_opcode = NULL;
1134 return;
1137 if (prev_opcode
1138 && prev_seg
1139 && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1140 d10v_cleanup ();
1142 if (prev_opcode
1143 && (write_2_short (prev_opcode, prev_insn, opcode, insn, extype, fixups) == 0))
1145 /* No instructions saved. */
1146 prev_opcode = NULL;
1148 else
1150 if (extype != PACK_UNSPEC)
1151 as_fatal (_("Unable to mix instructions as specified"));
1152 /* Save last instruction so it may be packed on next pass. */
1153 prev_opcode = opcode;
1154 prev_insn = insn;
1155 prev_seg = now_seg;
1156 prev_subseg = now_subseg;
1157 fixups = fixups->next;
1161 /* Assemble a single instruction.
1162 Return an opcode, or -1 (an invalid opcode) on error. */
1164 static unsigned long
1165 do_assemble (str, opcode)
1166 char *str;
1167 struct d10v_opcode **opcode;
1169 unsigned char *op_start, *save;
1170 unsigned char *op_end;
1171 char name[20];
1172 int nlen = 0;
1173 expressionS myops[6];
1174 unsigned long insn;
1176 /* Drop leading whitespace. */
1177 while (*str == ' ')
1178 str++;
1180 /* Find the opcode end. */
1181 for (op_start = op_end = (unsigned char *) (str);
1182 *op_end
1183 && nlen < 20
1184 && !is_end_of_line[*op_end] && *op_end != ' ';
1185 op_end++)
1187 name[nlen] = tolower (op_start[nlen]);
1188 nlen++;
1190 name[nlen] = 0;
1192 if (nlen == 0)
1193 return -1;
1195 /* Find the first opcode with the proper name. */
1196 *opcode = (struct d10v_opcode *) hash_find (d10v_hash, name);
1197 if (*opcode == NULL)
1198 as_fatal (_("unknown opcode: %s"), name);
1200 save = input_line_pointer;
1201 input_line_pointer = op_end;
1202 *opcode = find_opcode (*opcode, myops);
1203 if (*opcode == 0)
1204 return -1;
1205 input_line_pointer = save;
1207 insn = build_insn ((*opcode), myops, 0);
1208 return (insn);
1211 /* Find the symbol which has the same name as the register in EXP. */
1213 static symbolS *
1214 find_symbol_matching_register (exp)
1215 expressionS *exp;
1217 int i;
1219 if (exp->X_op != O_register)
1220 return NULL;
1222 /* Find the name of the register. */
1223 for (i = d10v_reg_name_cnt (); i--;)
1224 if (d10v_predefined_registers[i].value == exp->X_add_number)
1225 break;
1227 if (i < 0)
1228 abort ();
1230 /* Now see if a symbol has been defined with the same name. */
1231 return symbol_find (d10v_predefined_registers[i].name);
1234 /* Get a pointer to an entry in the opcode table.
1235 The function must look at all opcodes with the same name and use
1236 the operands to choose the correct opcode. */
1238 static struct d10v_opcode *
1239 find_opcode (opcode, myops)
1240 struct d10v_opcode *opcode;
1241 expressionS myops[];
1243 int i, match;
1244 struct d10v_opcode *next_opcode;
1246 /* Get all the operands and save them as expressions. */
1247 get_operands (myops);
1249 /* Now see if the operand is a fake. If so, find the correct size
1250 instruction, if possible. */
1251 if (opcode->format == OPCODE_FAKE)
1253 int opnum = opcode->operands[0];
1254 int flags;
1256 if (myops[opnum].X_op == O_register)
1258 myops[opnum].X_op = O_symbol;
1259 myops[opnum].X_add_symbol =
1260 symbol_find_or_make ((char *) myops[opnum].X_op_symbol);
1261 myops[opnum].X_add_number = 0;
1262 myops[opnum].X_op_symbol = NULL;
1265 next_opcode = opcode + 1;
1267 /* If the first operand is supposed to be a register, make sure
1268 we got a valid one. */
1269 flags = d10v_operands[next_opcode->operands[0]].flags;
1270 if (flags & OPERAND_REG)
1272 int X_op = myops[0].X_op;
1273 int num = myops[0].X_add_number;
1275 if (X_op != O_register
1276 || (num & ~flags
1277 & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1278 | OPERAND_FFLAG | OPERAND_CFLAG | OPERAND_CONTROL)))
1280 as_bad (_("bad opcode or operands"));
1281 return 0;
1285 if (myops[opnum].X_op == O_constant
1286 || (myops[opnum].X_op == O_symbol
1287 && S_IS_DEFINED (myops[opnum].X_add_symbol)
1288 && (S_GET_SEGMENT (myops[opnum].X_add_symbol) == now_seg)))
1290 for (i = 0; opcode->operands[i + 1]; i++)
1292 int bits = d10v_operands[next_opcode->operands[opnum]].bits;
1293 int flags = d10v_operands[next_opcode->operands[opnum]].flags;
1294 if (flags & OPERAND_ADDR)
1295 bits += 2;
1297 if (myops[opnum].X_op == O_constant)
1299 if (!check_range (myops[opnum].X_add_number, bits, flags))
1300 return next_opcode;
1302 else
1304 fragS *sym_frag;
1305 fragS *f;
1306 unsigned long current_position;
1307 unsigned long symbol_position;
1308 unsigned long value;
1309 boolean found_symbol;
1311 /* Calculate the address of the current instruction
1312 and the address of the symbol. Do this by summing
1313 the offsets of previous frags until we reach the
1314 frag containing the symbol, and the current frag. */
1315 sym_frag = symbol_get_frag (myops[opnum].X_add_symbol);
1316 found_symbol = false;
1318 current_position =
1319 obstack_next_free (&frchain_now->frch_obstack)
1320 - frag_now->fr_literal;
1321 symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol);
1323 for (f = frchain_now->frch_root; f; f = f->fr_next)
1325 current_position += f->fr_fix + f->fr_offset;
1327 if (f == sym_frag)
1328 found_symbol = true;
1330 if (! found_symbol)
1331 symbol_position += f->fr_fix + f->fr_offset;
1334 value = symbol_position;
1336 if (flags & OPERAND_ADDR)
1337 value -= current_position;
1339 if (AT_WORD_P (&myops[opnum]))
1341 if (bits > 4)
1343 bits += 2;
1344 if (!check_range (value, bits, flags))
1345 return next_opcode;
1348 else if (!check_range (value, bits, flags))
1349 return next_opcode;
1351 next_opcode++;
1353 as_fatal (_("value out of range"));
1355 else
1357 /* Not a constant, so use a long instruction. */
1358 return opcode + 2;
1361 else
1363 match = 0;
1364 /* Now search the opcode table table for one with operands
1365 that matches what we've got. */
1366 while (!match)
1368 match = 1;
1369 for (i = 0; opcode->operands[i]; i++)
1371 int flags = d10v_operands[opcode->operands[i]].flags;
1372 int X_op = myops[i].X_op;
1373 int num = myops[i].X_add_number;
1375 if (X_op == 0)
1377 match = 0;
1378 break;
1381 if (flags & OPERAND_REG)
1383 if ((X_op != O_register)
1384 || (num & ~flags
1385 & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1386 | OPERAND_FFLAG | OPERAND_CFLAG
1387 | OPERAND_CONTROL)))
1389 match = 0;
1390 break;
1394 if (((flags & OPERAND_MINUS) && ((X_op != O_absent) || (num != OPERAND_MINUS))) ||
1395 ((flags & OPERAND_PLUS) && ((X_op != O_absent) || (num != OPERAND_PLUS))) ||
1396 ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) ||
1397 ((flags & OPERAND_ATPAR) && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
1398 ((flags & OPERAND_ATSIGN) && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR)))))
1400 match = 0;
1401 break;
1404 /* Unfortunatly, for the indirect operand in
1405 instructions such as ``ldb r1, @(c,r14)'' this
1406 function can be passed X_op == O_register (because
1407 'c' is a valid register name). However we cannot
1408 just ignore the case when X_op == O_register but
1409 flags & OPERAND_REG is null, so we check to see if a
1410 symbol of the same name as the register exists. If
1411 the symbol does exist, then the parser was unable to
1412 distinguish the two cases and we fix things here.
1413 (Ref: PR14826) */
1415 if (!(flags & OPERAND_REG) && (X_op == O_register))
1417 symbolS *sym = find_symbol_matching_register (&myops[i]);
1419 if (sym != NULL)
1421 myops[i].X_op = X_op = O_symbol;
1422 myops[i].X_add_symbol = sym;
1424 else
1425 as_bad
1426 (_("illegal operand - register name found where none expected"));
1430 /* We're only done if the operands matched so far AND there
1431 are no more to check. */
1432 if (match && myops[i].X_op == 0)
1433 break;
1434 else
1435 match = 0;
1437 next_opcode = opcode + 1;
1439 if (next_opcode->opcode == 0)
1440 break;
1442 if (strcmp (next_opcode->name, opcode->name))
1443 break;
1445 opcode = next_opcode;
1449 if (!match)
1451 as_bad (_("bad opcode or operands"));
1452 return (0);
1455 /* Check that all registers that are required to be even are.
1456 Also, if any operands were marked as registers, but were really symbols,
1457 fix that here. */
1458 for (i = 0; opcode->operands[i]; i++)
1460 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
1461 (myops[i].X_add_number & 1))
1462 as_fatal (_("Register number must be EVEN"));
1463 if (myops[i].X_op == O_register)
1465 if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
1467 myops[i].X_op = O_symbol;
1468 myops[i].X_add_symbol =
1469 symbol_find_or_make ((char *) myops[i].X_op_symbol);
1470 myops[i].X_add_number = 0;
1471 myops[i].X_op_symbol = NULL;
1475 return opcode;
1478 /* If while processing a fixup, a reloc really needs to be created.
1479 Then it is done here. */
1481 arelent *
1482 tc_gen_reloc (seg, fixp)
1483 asection *seg ATTRIBUTE_UNUSED;
1484 fixS *fixp;
1486 arelent *reloc;
1487 reloc = (arelent *) xmalloc (sizeof (arelent));
1488 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1489 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1490 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1491 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1492 if (reloc->howto == (reloc_howto_type *) NULL)
1494 as_bad_where (fixp->fx_file, fixp->fx_line,
1495 _("reloc %d not supported by object file format"),
1496 (int) fixp->fx_r_type);
1497 return NULL;
1500 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1501 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1502 reloc->address = fixp->fx_offset;
1504 reloc->addend = fixp->fx_addnumber;
1506 return reloc;
1510 md_estimate_size_before_relax (fragp, seg)
1511 fragS *fragp ATTRIBUTE_UNUSED;
1512 asection *seg ATTRIBUTE_UNUSED;
1514 abort ();
1515 return 0;
1518 long
1519 md_pcrel_from_section (fixp, sec)
1520 fixS *fixp;
1521 segT sec;
1523 if (fixp->fx_addsy != (symbolS *) NULL
1524 && (!S_IS_DEFINED (fixp->fx_addsy)
1525 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1526 return 0;
1527 return fixp->fx_frag->fr_address + fixp->fx_where;
1531 md_apply_fix3 (fixp, valuep, seg)
1532 fixS *fixp;
1533 valueT *valuep;
1534 segT seg ATTRIBUTE_UNUSED;
1536 char *where;
1537 unsigned long insn;
1538 long value;
1539 int op_type;
1540 int left = 0;
1542 if (fixp->fx_addsy == (symbolS *) NULL)
1544 value = *valuep;
1545 fixp->fx_done = 1;
1547 else if (fixp->fx_pcrel)
1548 value = *valuep;
1549 else
1551 value = fixp->fx_offset;
1552 if (fixp->fx_subsy != (symbolS *) NULL)
1554 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
1555 value -= S_GET_VALUE (fixp->fx_subsy);
1556 else
1558 /* We don't actually support subtracting a symbol. */
1559 as_bad_where (fixp->fx_file, fixp->fx_line,
1560 _("expression too complex"));
1565 op_type = fixp->fx_r_type;
1566 if (op_type & 2048)
1568 op_type -= 2048;
1569 if (op_type & 1024)
1571 op_type -= 1024;
1572 fixp->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1573 left = 1;
1575 else if (op_type & 4096)
1577 op_type -= 4096;
1578 fixp->fx_r_type = BFD_RELOC_D10V_18;
1580 else
1581 fixp->fx_r_type =
1582 get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
1585 /* Fetch the instruction, insert the fully resolved operand
1586 value, and stuff the instruction back again. */
1587 where = fixp->fx_frag->fr_literal + fixp->fx_where;
1588 insn = bfd_getb32 ((unsigned char *) where);
1590 switch (fixp->fx_r_type)
1592 case BFD_RELOC_D10V_10_PCREL_L:
1593 case BFD_RELOC_D10V_10_PCREL_R:
1594 case BFD_RELOC_D10V_18_PCREL:
1595 case BFD_RELOC_D10V_18:
1596 /* Instruction addresses are always right-shifted by 2. */
1597 value >>= AT_WORD_RIGHT_SHIFT;
1598 if (fixp->fx_size == 2)
1599 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1600 else
1602 struct d10v_opcode *rep, *repi;
1604 rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep");
1605 repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi");
1606 if ((insn & FM11) == FM11
1607 && ( (repi != NULL && (insn & repi->mask) == (unsigned) repi->opcode)
1608 || (rep != NULL && (insn & rep->mask) == (unsigned) rep->opcode))
1609 && value < 4)
1610 as_fatal
1611 (_("line %d: rep or repi must include at least 4 instructions"),
1612 fixp->fx_line);
1613 insn =
1614 d10v_insert_operand (insn, op_type, (offsetT) value, left, fixp);
1615 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1617 break;
1618 case BFD_RELOC_32:
1619 bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1620 break;
1621 case BFD_RELOC_16:
1622 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1623 break;
1625 case BFD_RELOC_VTABLE_INHERIT:
1626 case BFD_RELOC_VTABLE_ENTRY:
1627 fixp->fx_done = 0;
1628 return 1;
1630 default:
1631 as_fatal (_("line %d: unknown relocation type: 0x%x"),
1632 fixp->fx_line, fixp->fx_r_type);
1634 return 0;
1637 /* d10v_cleanup() is called after the assembler has finished parsing
1638 the input file, when a label is read from the input file, or when a
1639 stab directive is output. Because the D10V assembler sometimes
1640 saves short instructions to see if it can package them with the
1641 next instruction, there may be a short instruction that still needs
1642 to be written.
1644 NOTE: accesses a global, etype.
1645 NOTE: invoked by various macros such as md_cleanup: see. */
1648 d10v_cleanup ()
1650 segT seg;
1651 subsegT subseg;
1653 /* If cleanup was invoked because the assembler encountered, e.g., a
1654 user label, we write out the pending instruction, if any. If it
1655 was invoked because the assembler is outputting a piece of line
1656 debugging information, though, we write out the pending
1657 instruction only if the --no-gstabs-packing command line switch
1658 has been specified. */
1659 if (prev_opcode
1660 && etype == PACK_UNSPEC
1661 && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing))
1663 seg = now_seg;
1664 subseg = now_subseg;
1666 if (prev_seg)
1667 subseg_set (prev_seg, prev_subseg);
1669 write_1_short (prev_opcode, prev_insn, fixups->next);
1671 subseg_set (seg, subseg);
1672 prev_opcode = NULL;
1674 return 1;
1677 /* Like normal .word, except support @word. */
1678 /* Clobbers input_line_pointer, checks end-of-line. */
1680 static void
1681 d10v_dot_word (dummy)
1682 int dummy ATTRIBUTE_UNUSED;
1684 expressionS exp;
1685 char *p;
1687 if (is_it_end_of_statement ())
1689 demand_empty_rest_of_line ();
1690 return;
1695 expression (&exp);
1696 if (!strncasecmp (input_line_pointer, "@word", 5))
1698 exp.X_add_number = 0;
1699 input_line_pointer += 5;
1701 p = frag_more (2);
1702 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1703 &exp, 0, BFD_RELOC_D10V_18);
1705 else
1706 emit_expr (&exp, 2);
1708 while (*input_line_pointer++ == ',');
1710 input_line_pointer--; /* Put terminator back into stream. */
1711 demand_empty_rest_of_line ();
1714 /* Mitsubishi asked that we support some old syntax that apparently
1715 had immediate operands starting with '#'. This is in some of their
1716 sample code but is not documented (although it appears in some
1717 examples in their assembler manual). For now, we'll solve this
1718 compatibility problem by simply ignoring any '#' at the beginning
1719 of an operand. */
1721 /* Operands that begin with '#' should fall through to here. */
1722 /* From expr.c. */
1724 void
1725 md_operand (expressionP)
1726 expressionS *expressionP;
1728 if (*input_line_pointer == '#' && ! do_not_ignore_hash)
1730 input_line_pointer++;
1731 expression (expressionP);
1735 boolean
1736 d10v_fix_adjustable (fixP)
1737 fixS *fixP;
1739 if (fixP->fx_addsy == NULL)
1740 return 1;
1742 /* Prevent all adjustments to global symbols. */
1743 if (S_IS_EXTERN (fixP->fx_addsy))
1744 return 0;
1745 if (S_IS_WEAK (fixP->fx_addsy))
1746 return 0;
1748 /* We need the symbol name for the VTABLE entries. */
1749 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1750 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1751 return 0;
1753 return 1;
1757 d10v_force_relocation (fixp)
1758 fixS *fixp;
1760 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1761 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1762 return 1;
1764 return 0;