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