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