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