]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-d10v.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gas / config / tc-d10v.c
CommitLineData
252b5132 1/* tc-d10v.c -- Assembler code for the Mitsubishi D10V
d87bef3a 2 Copyright (C) 1996-2023 Free Software Foundation, Inc.
252b5132
RH
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
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
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
4b4da160
NC
18 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
19 Boston, MA 02110-1301, USA. */
252b5132 20
252b5132 21#include "as.h"
3882b010 22#include "safe-ctype.h"
e0c6ed95 23#include "subsegs.h"
252b5132
RH
24#include "opcode/d10v.h"
25#include "elf/ppc.h"
800f6ec8 26#include "dwarf2dbg.h"
252b5132 27
ea1562b3
NC
28const char comment_chars[] = ";";
29const char line_comment_chars[] = "#";
252b5132 30const char line_separator_chars[] = "";
ea1562b3
NC
31const char *md_shortopts = "O";
32const char EXP_CHARS[] = "eE";
33const char FLT_CHARS[] = "dD";
252b5132
RH
34
35int Optimizing = 0;
36
37#define AT_WORD_P(X) ((X)->X_op == O_right_shift \
38 && (X)->X_op_symbol != NULL \
a77f5182
ILT
39 && symbol_constant_p ((X)->X_op_symbol) \
40 && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT)
252b5132
RH
41#define AT_WORD_RIGHT_SHIFT 2
42
e0c6ed95 43/* Fixups. */
ea1562b3
NC
44#define MAX_INSN_FIXUPS 5
45
252b5132
RH
46struct d10v_fixup
47{
48 expressionS exp;
49 int operand;
50 int pcrel;
51 int size;
52 bfd_reloc_code_real_type reloc;
53};
54
55typedef struct _fixups
56{
57 int fc;
58 struct d10v_fixup fix[MAX_INSN_FIXUPS];
59 struct _fixups *next;
60} Fixups;
61
62static Fixups FixUps[2];
63static Fixups *fixups;
64
0f94f4c8
NC
65static int do_not_ignore_hash = 0;
66
0a44c2b1 67typedef int packing_type;
e0c6ed95
AM
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) /* "<-" */
72static packing_type etype = PACK_UNSPEC; /* Used by d10v_cleanup. */
0a44c2b1 73
b34976b6 74/* TRUE if instruction swapping warnings should be inhibited.
bfb32b52 75 --nowarnswap. */
5b7c81bd 76static bool flag_warn_suppress_instructionswap;
bccba5f0 77
b34976b6 78/* TRUE if instruction packing should be performed when --gstabs is specified.
bccba5f0 79 --gstabs-packing, --no-gstabs-packing. */
5b7c81bd 80static bool flag_allow_gstabs_packing = 1;
252b5132 81
e0c6ed95 82/* Local functions. */
ea1562b3
NC
83
84enum options
85{
86 OPTION_NOWARNSWAP = OPTION_MD_BASE,
87 OPTION_GSTABSPACKING,
88 OPTION_NOGSTABSPACKING
89};
252b5132
RH
90
91struct option md_longopts[] =
92{
252b5132 93 {"nowarnswap", no_argument, NULL, OPTION_NOWARNSWAP},
bccba5f0
NC
94 {"gstabspacking", no_argument, NULL, OPTION_GSTABSPACKING},
95 {"gstabs-packing", no_argument, NULL, OPTION_GSTABSPACKING},
bccba5f0
NC
96 {"nogstabspacking", no_argument, NULL, OPTION_NOGSTABSPACKING},
97 {"no-gstabs-packing", no_argument, NULL, OPTION_NOGSTABSPACKING},
252b5132
RH
98 {NULL, no_argument, NULL, 0}
99};
ab3e48dc
KH
100
101size_t md_longopts_size = sizeof (md_longopts);
252b5132 102
252b5132 103/* Opcode hash table. */
629310ab 104static htab_t d10v_hash;
252b5132 105
e0c6ed95 106/* Do a binary search of the d10v_predefined_registers array to see if
33eaf5de 107 NAME is a valid register name. Return the register number from the
e0c6ed95 108 array on success, or -1 on failure. */
252b5132
RH
109
110static int
ea1562b3 111reg_name_search (char *name)
252b5132
RH
112{
113 int middle, low, high;
114 int cmp;
115
116 low = 0;
e0c6ed95 117 high = d10v_reg_name_cnt () - 1;
252b5132
RH
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;
e0c6ed95
AM
127 else
128 return d10v_predefined_registers[middle].value;
252b5132
RH
129 }
130 while (low <= high);
131 return -1;
132}
133
e0c6ed95
AM
134/* Check the string at input_line_pointer
135 to see if it is a valid register name. */
252b5132
RH
136
137static int
ea1562b3 138register_name (expressionS *expressionP)
252b5132
RH
139{
140 int reg_number;
141 char c, *p = input_line_pointer;
e0c6ed95
AM
142
143 while (*p
144 && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
252b5132
RH
145 p++;
146
147 c = *p;
148 if (c)
149 *p++ = 0;
150
e0c6ed95 151 /* Look to see if it's in the register table. */
252b5132 152 reg_number = reg_name_search (input_line_pointer);
e0c6ed95 153 if (reg_number >= 0)
252b5132
RH
154 {
155 expressionP->X_op = O_register;
e0c6ed95
AM
156 /* Temporarily store a pointer to the string here. */
157 expressionP->X_op_symbol = (symbolS *) input_line_pointer;
252b5132
RH
158 expressionP->X_add_number = reg_number;
159 input_line_pointer = p;
160 return 1;
161 }
162 if (c)
e0c6ed95 163 *(p - 1) = c;
252b5132
RH
164 return 0;
165}
166
252b5132 167static int
ea1562b3 168check_range (unsigned long num, int bits, int flags)
252b5132 169{
bccba5f0 170 long min, max;
e0c6ed95 171 int retval = 0;
252b5132 172
e0c6ed95 173 /* Don't bother checking 16-bit values. */
252b5132
RH
174 if (bits == 16)
175 return 0;
176
177 if (flags & OPERAND_SHIFT)
178 {
e0c6ed95
AM
179 /* All special shift operands are unsigned and <= 16.
180 We allow 0 for now. */
181 if (num > 16)
252b5132
RH
182 return 1;
183 else
184 return 0;
185 }
186
187 if (flags & OPERAND_SIGNED)
188 {
e0c6ed95 189 /* Signed 3-bit integers are restricted to the (-2, 3) range. */
c43185de
DN
190 if (flags & RESTRICTED_NUM3)
191 {
192 if ((long) num < -2 || (long) num > 3)
193 retval = 1;
194 }
195 else
196 {
e0c6ed95
AM
197 max = (1 << (bits - 1)) - 1;
198 min = - (1 << (bits - 1));
c43185de
DN
199 if (((long) num > max) || ((long) num < min))
200 retval = 1;
201 }
252b5132
RH
202 }
203 else
204 {
205 max = (1 << bits) - 1;
206 min = 0;
bccba5f0 207 if (((long) num > max) || ((long) num < min))
252b5132
RH
208 retval = 1;
209 }
210 return retval;
211}
212
252b5132 213void
ea1562b3 214md_show_usage (FILE *stream)
252b5132 215{
e0c6ed95 216 fprintf (stream, _("D10V options:\n\
bccba5f0
NC
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"));
e0c6ed95 222}
252b5132
RH
223
224int
17b9d67d 225md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
252b5132
RH
226{
227 switch (c)
228 {
229 case 'O':
e0c6ed95 230 /* Optimize. Will attempt to parallelize operations. */
252b5132
RH
231 Optimizing = 1;
232 break;
233 case OPTION_NOWARNSWAP:
234 flag_warn_suppress_instructionswap = 1;
235 break;
bccba5f0
NC
236 case OPTION_GSTABSPACKING:
237 flag_allow_gstabs_packing = 1;
238 break;
239 case OPTION_NOGSTABSPACKING:
240 flag_allow_gstabs_packing = 0;
241 break;
252b5132
RH
242 default:
243 return 0;
244 }
245 return 1;
246}
247
248symbolS *
ea1562b3 249md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
252b5132
RH
250{
251 return 0;
252}
253
6d4af3c2 254const char *
ea1562b3 255md_atof (int type, char *litP, int *sizeP)
252b5132 256{
5b7c81bd 257 return ieee_md_atof (type, litP, sizeP, true);
252b5132
RH
258}
259
260void
ea1562b3
NC
261md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
262 asection *sec ATTRIBUTE_UNUSED,
263 fragS *fragP ATTRIBUTE_UNUSED)
252b5132
RH
264{
265 abort ();
266}
267
268valueT
ea1562b3 269md_section_align (asection *seg, valueT addr)
252b5132 270{
fd361982 271 int align = bfd_section_alignment (seg);
8d3842cd 272 return ((addr + (1 << align) - 1) & -(1 << align));
252b5132
RH
273}
274
252b5132 275void
ea1562b3 276md_begin (void)
252b5132 277{
e0471c16 278 const char *prev_name = "";
252b5132 279 struct d10v_opcode *opcode;
629310ab 280 d10v_hash = str_htab_create ();
252b5132
RH
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
e0c6ed95 287 for (opcode = (struct d10v_opcode *) d10v_opcodes; opcode->name; opcode++)
252b5132
RH
288 {
289 if (strcmp (prev_name, opcode->name))
290 {
e0c6ed95 291 prev_name = (char *) opcode->name;
fe0e921f 292 str_hash_insert (d10v_hash, opcode->name, opcode, 0);
252b5132
RH
293 }
294 }
295
296 fixups = &FixUps[0];
297 FixUps[0].next = &FixUps[1];
298 FixUps[1].next = &FixUps[0];
299}
300
e0c6ed95
AM
301/* Remove the postincrement or postdecrement operator ( '+' or '-' )
302 from an expression. */
252b5132 303
e0c6ed95 304static int
ea1562b3 305postfix (char *p)
252b5132 306{
e0c6ed95 307 while (*p != '-' && *p != '+')
252b5132 308 {
e0c6ed95 309 if (*p == 0 || *p == '\n' || *p == '\r')
252b5132
RH
310 break;
311 p++;
312 }
313
e0c6ed95 314 if (*p == '-')
252b5132
RH
315 {
316 *p = ' ';
ea1562b3 317 return -1;
252b5132 318 }
e0c6ed95 319 if (*p == '+')
252b5132
RH
320 {
321 *p = ' ';
ea1562b3 322 return 1;
252b5132
RH
323 }
324
ea1562b3 325 return 0;
252b5132
RH
326}
327
e0c6ed95 328static bfd_reloc_code_real_type
ea1562b3 329get_reloc (struct d10v_operand *op)
252b5132
RH
330{
331 int bits = op->bits;
332
e0c6ed95 333 if (bits <= 4)
ea1562b3 334 return 0;
e0c6ed95
AM
335
336 if (op->flags & OPERAND_ADDR)
252b5132
RH
337 {
338 if (bits == 8)
ea1562b3 339 return BFD_RELOC_D10V_10_PCREL_R;
252b5132 340 else
ea1562b3 341 return BFD_RELOC_D10V_18_PCREL;
252b5132
RH
342 }
343
ea1562b3 344 return BFD_RELOC_16;
252b5132
RH
345}
346
e0c6ed95 347/* Parse a string of operands. Return an array of expressions. */
252b5132
RH
348
349static int
ea1562b3 350get_operands (expressionS exp[])
252b5132
RH
351{
352 char *p = input_line_pointer;
353 int numops = 0;
354 int post = 0;
0f94f4c8 355 int uses_at = 0;
e0c6ed95
AM
356
357 while (*p)
252b5132 358 {
e0c6ed95 359 while (*p == ' ' || *p == '\t' || *p == ',')
252b5132 360 p++;
e0c6ed95 361 if (*p == 0 || *p == '\n' || *p == '\r')
252b5132 362 break;
e0c6ed95
AM
363
364 if (*p == '@')
252b5132 365 {
0f94f4c8 366 uses_at = 1;
e0c6ed95 367
252b5132
RH
368 p++;
369 exp[numops].X_op = O_absent;
e0c6ed95 370 if (*p == '(')
252b5132
RH
371 {
372 p++;
373 exp[numops].X_add_number = OPERAND_ATPAR;
374 }
e0c6ed95 375 else if (*p == '-')
252b5132
RH
376 {
377 p++;
378 exp[numops].X_add_number = OPERAND_ATMINUS;
379 }
380 else
381 {
382 exp[numops].X_add_number = OPERAND_ATSIGN;
3543a2f1
AO
383 if (*p == '+')
384 {
8c0392a9
AO
385 numops++;
386 exp[numops].X_op = O_absent;
387 exp[numops].X_add_number = OPERAND_PLUS;
388 p++;
3543a2f1 389 }
252b5132
RH
390 post = postfix (p);
391 }
392 numops++;
393 continue;
394 }
395
e0c6ed95 396 if (*p == ')')
252b5132 397 {
e0c6ed95 398 /* Just skip the trailing paren. */
252b5132
RH
399 p++;
400 continue;
401 }
402
403 input_line_pointer = p;
404
e0c6ed95 405 /* Check to see if it might be a register name. */
252b5132
RH
406 if (!register_name (&exp[numops]))
407 {
e0c6ed95 408 /* Parse as an expression. */
0f94f4c8
NC
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;
e0c6ed95 416
0f94f4c8 417 expression (&exp[numops]);
e0c6ed95 418
0f94f4c8
NC
419 do_not_ignore_hash = save;
420 }
421 else
422 expression (&exp[numops]);
252b5132
RH
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 {
e0c6ed95 430 /* If it looked like a register name but was followed by
252b5132 431 "@word" then it was really a symbol, so change it to
e0c6ed95 432 one. */
252b5132 433 exp[numops].X_op = O_symbol;
e0c6ed95
AM
434 exp[numops].X_add_symbol =
435 symbol_find_or_make ((char *) exp[numops].X_op_symbol);
252b5132
RH
436 }
437
e0c6ed95 438 /* Check for identifier@word+constant. */
252b5132 439 if (*input_line_pointer == '-' || *input_line_pointer == '+')
e0c6ed95 440 {
e0c6ed95
AM
441 expressionS new_exp;
442 expression (&new_exp);
443 exp[numops].X_add_number = new_exp.X_add_number;
444 }
252b5132 445
e0c6ed95 446 /* Convert expr into a right shift by AT_WORD_RIGHT_SHIFT. */
252b5132
RH
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 }
e0c6ed95
AM
459
460 if (exp[numops].X_op == O_illegal)
252b5132 461 as_bad (_("illegal operand"));
e0c6ed95 462 else if (exp[numops].X_op == O_absent)
252b5132
RH
463 as_bad (_("missing operand"));
464
465 numops++;
466 p = input_line_pointer;
467 }
468
e0c6ed95 469 switch (post)
252b5132 470 {
e0c6ed95 471 case -1: /* Postdecrement mode. */
252b5132
RH
472 exp[numops].X_op = O_absent;
473 exp[numops++].X_add_number = OPERAND_MINUS;
474 break;
e0c6ed95 475 case 1: /* Postincrement mode. */
252b5132
RH
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;
ea1562b3 482 return numops;
252b5132
RH
483}
484
485static unsigned long
ea1562b3
NC
486d10v_insert_operand (unsigned long insn,
487 int op_type,
488 offsetT value,
489 int left,
490 fixS *fix)
252b5132
RH
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
e0c6ed95 500 /* Truncate to the proper number of bits. */
252b5132 501 if (check_range (value, bits, d10v_operands[op_type].flags))
ab3e48dc 502 as_bad_where (fix->fx_file, fix->fx_line,
fbdbf472 503 _("operand out of range: %ld"), (long) value);
252b5132
RH
504
505 value &= 0x7FFFFFFF >> (31 - bits);
506 insn |= (value << shift);
507
508 return insn;
509}
510
e0c6ed95
AM
511/* Take a pointer to the opcode entry in the opcode table and the
512 array of operand expressions. Return the instruction. */
252b5132
RH
513
514static unsigned long
ea1562b3
NC
515build_insn (struct d10v_opcode *opcode,
516 expressionS *opers,
517 unsigned long insn)
252b5132
RH
518{
519 int i, bits, shift, flags, format;
520 unsigned long number;
e0c6ed95
AM
521
522 /* The insn argument is only used for the DIVS kludge. */
252b5132
RH
523 if (insn)
524 format = LONG_R;
525 else
526 {
527 insn = opcode->opcode;
528 format = opcode->format;
529 }
e0c6ed95
AM
530
531 for (i = 0; opcode->operands[i]; i++)
252b5132
RH
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
e0c6ed95 538 if (flags & OPERAND_REG)
252b5132
RH
539 {
540 number &= REGISTER_MASK;
541 if (format == LONG_L)
542 shift += 15;
543 }
544
e0c6ed95 545 if (opers[i].X_op != O_register && opers[i].X_op != O_constant)
252b5132 546 {
e0c6ed95 547 /* Now create a fixup. */
252b5132
RH
548
549 if (fixups->fc >= MAX_INSN_FIXUPS)
550 as_fatal (_("too many fixups"));
551
552 if (AT_WORD_P (&opers[i]))
553 {
2d2255b5 554 /* Recognize XXX>>1+N aka XXX@word+N as special (AT_WORD). */
252b5132
RH
555 fixups->fix[fixups->fc].reloc = BFD_RELOC_D10V_18;
556 opers[i].X_op = O_symbol;
e0c6ed95 557 opers[i].X_op_symbol = NULL; /* Should free it. */
252b5132
RH
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 +
e0c6ed95 561 X_add_number). */
252b5132
RH
562 number <<= AT_WORD_RIGHT_SHIFT;
563 opers[i].X_add_number = number;
564 }
565 else
8ade06a8
TR
566 {
567 fixups->fix[fixups->fc].reloc =
568 get_reloc ((struct d10v_operand *) &d10v_operands[opcode->operands[i]]);
569
c03099e6 570 /* Check that an immediate was passed to ops that expect one. */
b34976b6 571 if ((flags & OPERAND_NUM)
8ade06a8
TR
572 && (fixups->fix[fixups->fc].reloc == 0))
573 as_bad (_("operand is not an immediate"));
574 }
252b5132 575
e0c6ed95 576 if (fixups->fix[fixups->fc].reloc == BFD_RELOC_16 ||
252b5132 577 fixups->fix[fixups->fc].reloc == BFD_RELOC_D10V_18)
e0c6ed95 578 fixups->fix[fixups->fc].size = 2;
252b5132
RH
579 else
580 fixups->fix[fixups->fc].size = 4;
e0c6ed95 581
252b5132
RH
582 fixups->fix[fixups->fc].exp = opers[i];
583 fixups->fix[fixups->fc].operand = opcode->operands[i];
63b4cc53 584 fixups->fix[fixups->fc].pcrel = (flags & OPERAND_ADDR) != 0;
252b5132
RH
585 (fixups->fc)++;
586 }
b34976b6 587
e0c6ed95 588 /* Truncate to the proper number of bits. */
252b5132 589 if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
fbdbf472 590 as_bad (_("operand out of range: %lu"), number);
252b5132
RH
591 number &= 0x7FFFFFFF >> (31 - bits);
592 insn = insn | (number << shift);
593 }
594
b34976b6
AM
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
fbdbf472 597 to not be shifted over 15. */
e0c6ed95 598 if ((opcode->opcode == OPCODE_DIVS) && (format == LONG_L))
252b5132 599 insn = build_insn (opcode, opers, insn);
e0c6ed95 600
252b5132
RH
601 return insn;
602}
603
e0c6ed95
AM
604/* Write out a long form instruction. */
605
252b5132 606static void
ea1562b3 607write_long (unsigned long insn, Fixups *fx)
252b5132
RH
608{
609 int i, where;
e0c6ed95 610 char *f = frag_more (4);
252b5132 611
800f6ec8 612 dwarf2_emit_insn (4);
252b5132
RH
613 insn |= FM11;
614 number_to_chars_bigendian (f, insn, 4);
615
e0c6ed95 616 for (i = 0; i < fx->fc; i++)
252b5132
RH
617 {
618 if (fx->fix[i].reloc)
e0c6ed95
AM
619 {
620 where = f - frag_now->fr_literal;
252b5132
RH
621 if (fx->fix[i].size == 2)
622 where += 2;
623
624 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
e0c6ed95 625 fx->fix[i].operand |= 4096;
252b5132
RH
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
e0c6ed95 638/* Write out a short form instruction by itself. */
252b5132 639
252b5132 640static void
ea1562b3
NC
641write_1_short (struct d10v_opcode *opcode,
642 unsigned long insn,
643 Fixups *fx)
252b5132 644{
e0c6ed95 645 char *f = frag_more (4);
252b5132
RH
646 int i, where;
647
800f6ec8 648 dwarf2_emit_insn (4);
252b5132
RH
649 if (opcode->exec_type & PARONLY)
650 as_fatal (_("Instruction must be executed in parallel with another instruction."));
651
b34976b6
AM
652 /* The other container needs to be NOP.
653 According to 4.3.1: for FM=00, sub-instructions performed only by IU
fbdbf472 654 cannot be encoded in L-container. */
252b5132 655 if (opcode->unit == IU)
e0c6ed95 656 insn |= FM00 | (NOP << 15); /* Right container. */
252b5132 657 else
e0c6ed95 658 insn = FM00 | (insn << 15) | NOP; /* Left container. */
252b5132
RH
659
660 number_to_chars_bigendian (f, insn, 4);
e0c6ed95 661 for (i = 0; i < fx->fc; i++)
252b5132
RH
662 {
663 if (fx->fix[i].reloc)
e0c6ed95
AM
664 {
665 where = f - frag_now->fr_literal;
252b5132
RH
666 if (fx->fix[i].size == 2)
667 where += 2;
668
669 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
e0c6ed95 670 fx->fix[i].operand |= 4096;
252b5132 671
e0c6ed95
AM
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))
252b5132
RH
675 fx->fix[i].operand |= 1024;
676
677 fix_new_exp (frag_now,
e0c6ed95 678 where,
252b5132
RH
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
ea1562b3
NC
688/* Determine if there are any resource conflicts among two manually
689 parallelized instructions. Some of this was lifted from parallel_ok. */
0a44c2b1 690
ea1562b3
NC
691static void
692check_resource_conflict (struct d10v_opcode *op1,
693 unsigned long insn1,
694 struct d10v_opcode *op2,
695 unsigned long insn2)
252b5132 696{
ea1562b3
NC
697 int i, j, flags, mask, shift, regno;
698 unsigned long ins, mod[2];
699 struct d10v_opcode *op;
252b5132 700
ea1562b3
NC
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 }
252b5132 708
ea1562b3
NC
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 }
252b5132 716
ea1562b3
NC
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++)
252b5132 739 {
ea1562b3 740 if (j == 0)
252b5132 741 {
ea1562b3
NC
742 op = op1;
743 ins = insn1;
252b5132 744 }
252b5132 745 else
252b5132 746 {
ea1562b3
NC
747 op = op2;
748 ins = insn2;
252b5132 749 }
ea1562b3
NC
750 mod[j] = 0;
751 if (op->exec_type & BRANCH_LINK)
752 mod[j] |= 1 << 13;
0a44c2b1 753
ea1562b3 754 for (i = 0; op->operands[i]; i++)
252b5132 755 {
ea1562b3
NC
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;
0a44c2b1 775
ea1562b3
NC
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 }
252b5132 792 }
0a44c2b1 793
ea1562b3
NC
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;
252b5132
RH
800 }
801
ea1562b3
NC
802 if ((mod[0] & mod[1]) == 0)
803 return;
804 else
252b5132 805 {
ea1562b3
NC
806 unsigned long x;
807 x = mod[0] & mod[1];
252b5132 808
ea1562b3
NC
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)"));
252b5132 821 }
252b5132
RH
822}
823
e0c6ed95
AM
824/* Check 2 instructions and determine if they can be safely
825 executed in parallel. Return 1 if they can be. */
252b5132 826
252b5132 827static int
ea1562b3
NC
828parallel_ok (struct d10v_opcode *op1,
829 unsigned long insn1,
830 struct d10v_opcode *op2,
831 unsigned long insn2,
832 packing_type exec_type)
252b5132
RH
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
8ade06a8
TR
845 /* If this is auto parallelization, and the first instruction is a
846 branch or should not be packed, then don't parallelize. */
0a44c2b1 847 if (exec_type == PACK_UNSPEC
8ade06a8 848 && (op1->exec_type & (ALONE | BRANCH)))
252b5132
RH
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
e0c6ed95 864 they cannot operate safely in parallel. */
252b5132 865
b34976b6
AM
866 /* The bitmasks (mod and used) look like this (bit 31 = MSB).
867 r0-r15 0-15
fbdbf472
TR
868 a0-a1 16-17
869 cr (not psw) 18
870 psw 19
871 mem 20 */
252b5132 872
e0c6ed95 873 for (j = 0; j < 2; j++)
252b5132
RH
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;
e0c6ed95 897 if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
252b5132 898 regno += 16;
e0c6ed95
AM
899 else if (flags & OPERAND_CONTROL) /* mvtc or mvfc. */
900 {
252b5132
RH
901 if (regno == 0)
902 regno = 19;
903 else
e0c6ed95 904 regno = 18;
252b5132 905 }
e0c6ed95 906 else if (flags & (OPERAND_FFLAG | OPERAND_CFLAG))
252b5132 907 regno = 19;
e0c6ed95
AM
908
909 if (flags & OPERAND_DEST)
252b5132
RH
910 {
911 mod[j] |= 1 << regno;
912 if (flags & OPERAND_EVEN)
913 mod[j] |= 1 << (regno + 1);
914 }
915 else
916 {
e0c6ed95 917 used[j] |= 1 << regno;
252b5132
RH
918 if (flags & OPERAND_EVEN)
919 used[j] |= 1 << (regno + 1);
920
921 /* Auto inc/dec also modifies the register. */
e0c6ed95
AM
922 if (op->operands[i + 1] != 0
923 && (d10v_operands[op->operands[i + 1]].flags
252b5132
RH
924 & (OPERAND_PLUS | OPERAND_MINUS)) != 0)
925 mod[j] |= 1 << regno;
926 }
927 }
928 else if (flags & OPERAND_ATMINUS)
929 {
e0c6ed95 930 /* SP implicitly used/modified. */
252b5132
RH
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
ea1562b3
NC
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. */
fbdbf472 955
ea1562b3
NC
956static int
957write_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;
8ade06a8 967
ea1562b3
NC
968 if ((exec_type != PACK_PARALLEL)
969 && ((opcode1->exec_type & PARONLY) || (opcode2->exec_type & PARONLY)))
970 as_fatal (_("Instruction must be executed in parallel"));
fbdbf472 971
ea1562b3
NC
972 if ((opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE))
973 as_fatal (_("Long instructions may not be combined."));
fbdbf472 974
ea1562b3 975 switch (exec_type)
fbdbf472 976 {
ea1562b3
NC
977 case PACK_UNSPEC: /* Order not specified. */
978 if (opcode1->exec_type & ALONE)
fbdbf472 979 {
ea1562b3
NC
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;
fbdbf472 983 }
ea1562b3
NC
984 if (Optimizing
985 && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
fbdbf472 986 {
ea1562b3
NC
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;
fbdbf472 994 }
ea1562b3
NC
995 else if (opcode1->unit == IU)
996 /* Reverse sequential with IU opcode1 on right and done first. */
997 insn = FM10 | (insn2 << 15) | insn1;
252b5132 998 else
ea1562b3
NC
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)
252b5132 1008 {
ea1562b3
NC
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;
252b5132 1014 }
ea1562b3 1015 else if (opcode2->unit == MU)
252b5132 1016 {
ea1562b3
NC
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;
252b5132 1022 }
ea1562b3
NC
1023 else
1024 insn = FM00 | (insn1 << 15) | insn2;
1025 check_resource_conflict (opcode1, insn1, opcode2, insn2);
1026 break;
252b5132 1027
ea1562b3
NC
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)
252b5132 1032 {
ea1562b3
NC
1033 if (!flag_warn_suppress_instructionswap)
1034 as_warn (_("Swapping instruction order"));
1035 insn = FM10 | (insn2 << 15) | insn1;
252b5132 1036 }
ea1562b3
NC
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;
e0c6ed95 1042
ea1562b3
NC
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;
252b5132 1057
ea1562b3
NC
1058 default:
1059 as_fatal (_("unknown execution type passed to write_2_short()"));
1060 }
252b5132 1061
ea1562b3 1062 f = frag_more (4);
800f6ec8 1063 dwarf2_emit_insn (4);
ea1562b3 1064 number_to_chars_bigendian (f, insn, 4);
252b5132 1065
ea1562b3
NC
1066 /* Process fixup chains. fx refers to insn2 when j == 0, and to
1067 insn1 when j == 1. Yes, it's reversed. */
252b5132 1068
ea1562b3 1069 for (j = 0; j < 2; j++)
252b5132 1070 {
ea1562b3
NC
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;
e0c6ed95 1078
ea1562b3
NC
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;
252b5132 1092
ea1562b3
NC
1093 if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
1094 fx->fix[i].operand |= 4096;
252b5132 1095
ea1562b3
NC
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;
252b5132
RH
1108}
1109
ea1562b3
NC
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
1116static unsigned long prev_insn;
1117static struct d10v_opcode *prev_opcode = 0;
1118static subsegT prev_subseg;
5bb3703f 1119static segT prev_seg = 0;
ea1562b3 1120
fbdbf472 1121/* Find the symbol which has the same name as the register in exp. */
e0c6ed95 1122
252b5132 1123static symbolS *
ea1562b3 1124find_symbol_matching_register (expressionS *exp)
252b5132
RH
1125{
1126 int i;
e0c6ed95 1127
252b5132
RH
1128 if (exp->X_op != O_register)
1129 return NULL;
e0c6ed95 1130
252b5132
RH
1131 /* Find the name of the register. */
1132 for (i = d10v_reg_name_cnt (); i--;)
e0c6ed95 1133 if (d10v_predefined_registers[i].value == exp->X_add_number)
252b5132
RH
1134 break;
1135
1136 if (i < 0)
1137 abort ();
1138
1139 /* Now see if a symbol has been defined with the same name. */
e0c6ed95 1140 return symbol_find (d10v_predefined_registers[i].name);
252b5132
RH
1141}
1142
e0c6ed95
AM
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. */
252b5132
RH
1146
1147static struct d10v_opcode *
ea1562b3 1148find_opcode (struct d10v_opcode *opcode, expressionS myops[])
252b5132 1149{
bccba5f0 1150 int i, match;
252b5132
RH
1151 struct d10v_opcode *next_opcode;
1152
e0c6ed95 1153 /* Get all the operands and save them as expressions. */
252b5132
RH
1154 get_operands (myops);
1155
e0c6ed95
AM
1156 /* Now see if the operand is a fake. If so, find the correct size
1157 instruction, if possible. */
252b5132
RH
1158 if (opcode->format == OPCODE_FAKE)
1159 {
1160 int opnum = opcode->operands[0];
1161 int flags;
e0c6ed95 1162
252b5132
RH
1163 if (myops[opnum].X_op == O_register)
1164 {
1165 myops[opnum].X_op = O_symbol;
e0c6ed95
AM
1166 myops[opnum].X_add_symbol =
1167 symbol_find_or_make ((char *) myops[opnum].X_op_symbol);
252b5132
RH
1168 myops[opnum].X_add_number = 0;
1169 myops[opnum].X_op_symbol = NULL;
1170 }
1171
e0c6ed95 1172 next_opcode = opcode + 1;
252b5132
RH
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
55aa1bc4
AO
1185 | OPERAND_FFLAG | OPERAND_CFLAG | OPERAND_CONTROL))
1186 || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
252b5132
RH
1187 {
1188 as_bad (_("bad opcode or operands"));
1189 return 0;
1190 }
1191 }
1192
e0c6ed95
AM
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)))
252b5132 1197 {
e0c6ed95 1198 for (i = 0; opcode->operands[i + 1]; i++)
252b5132
RH
1199 {
1200 int bits = d10v_operands[next_opcode->operands[opnum]].bits;
91d6fa6a
NC
1201
1202 flags = d10v_operands[next_opcode->operands[opnum]].flags;
1203
252b5132
RH
1204 if (flags & OPERAND_ADDR)
1205 bits += 2;
e0c6ed95 1206
252b5132
RH
1207 if (myops[opnum].X_op == O_constant)
1208 {
1209 if (!check_range (myops[opnum].X_add_number, bits, flags))
fbdbf472 1210 break;
252b5132
RH
1211 }
1212 else
1213 {
e0c6ed95
AM
1214 fragS *sym_frag;
1215 fragS *f;
3db10f32
NC
1216 unsigned long current_position;
1217 unsigned long symbol_position;
1218 unsigned long value;
5b7c81bd 1219 bool found_symbol;
e0c6ed95 1220
3db10f32
NC
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);
5b7c81bd 1226 found_symbol = false;
3db10f32 1227
127a8db1 1228 current_position = frag_now_fix_octets ();
3db10f32 1229 symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol);
e0c6ed95 1230
3db10f32
NC
1231 for (f = frchain_now->frch_root; f; f = f->fr_next)
1232 {
1233 current_position += f->fr_fix + f->fr_offset;
e0c6ed95 1234
3db10f32 1235 if (f == sym_frag)
5b7c81bd 1236 found_symbol = true;
e0c6ed95 1237
3db10f32
NC
1238 if (! found_symbol)
1239 symbol_position += f->fr_fix + f->fr_offset;
1240 }
252b5132 1241
3db10f32 1242 value = symbol_position;
e0c6ed95 1243
252b5132 1244 if (flags & OPERAND_ADDR)
3db10f32 1245 value -= current_position;
e0c6ed95 1246
252b5132
RH
1247 if (AT_WORD_P (&myops[opnum]))
1248 {
1249 if (bits > 4)
1250 {
1251 bits += 2;
1252 if (!check_range (value, bits, flags))
fbdbf472 1253 break;
252b5132
RH
1254 }
1255 }
1256 else if (!check_range (value, bits, flags))
fbdbf472 1257 break;
252b5132
RH
1258 }
1259 next_opcode++;
1260 }
fbdbf472
TR
1261
1262 if (opcode->operands [i + 1] == 0)
1263 as_fatal (_("value out of range"));
1264 else
1265 opcode = next_opcode;
252b5132
RH
1266 }
1267 else
ea1562b3
NC
1268 /* Not a constant, so use a long instruction. */
1269 opcode += 2;
252b5132 1270 }
fbdbf472
TR
1271
1272 match = 0;
b34976b6 1273
fbdbf472
TR
1274 /* Now search the opcode table table for one with operands
1275 that matches what we've got. */
1276 while (!match)
252b5132 1277 {
fbdbf472
TR
1278 match = 1;
1279 for (i = 0; opcode->operands[i]; i++)
252b5132 1280 {
fbdbf472
TR
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)
252b5132 1286 {
fbdbf472
TR
1287 match = 0;
1288 break;
1289 }
252b5132 1290
fbdbf472
TR
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)))
252b5132
RH
1299 {
1300 match = 0;
1301 break;
1302 }
fbdbf472 1303 }
e0c6ed95 1304
fbdbf472
TR
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 }
e0c6ed95 1314
2d2255b5 1315 /* Unfortunately, for the indirect operand in instructions such
b34976b6
AM
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
fbdbf472 1322 and we fix things here. (Ref: PR14826) */
e0c6ed95 1323
fbdbf472
TR
1324 if (!(flags & OPERAND_REG) && (X_op == O_register))
1325 {
1326 symbolS * sym;
b34976b6 1327
fbdbf472 1328 sym = find_symbol_matching_register (& myops[i]);
e0c6ed95 1329
fbdbf472
TR
1330 if (sym != NULL)
1331 {
1332 myops[i].X_op = X_op = O_symbol;
1333 myops[i].X_add_symbol = sym;
252b5132 1334 }
fbdbf472
TR
1335 else
1336 as_bad
1337 (_("illegal operand - register name found where none expected"));
252b5132 1338 }
fbdbf472 1339 }
e0c6ed95 1340
fbdbf472 1341 /* We're only done if the operands matched so far AND there
252b5132 1342 are no more to check. */
fbdbf472
TR
1343 if (match && myops[i].X_op == 0)
1344 break;
1345 else
1346 match = 0;
252b5132 1347
fbdbf472 1348 next_opcode = opcode + 1;
e0c6ed95 1349
fbdbf472
TR
1350 if (next_opcode->opcode == 0)
1351 break;
e0c6ed95 1352
fbdbf472
TR
1353 if (strcmp (next_opcode->name, opcode->name))
1354 break;
e0c6ed95 1355
fbdbf472 1356 opcode = next_opcode;
252b5132
RH
1357 }
1358
e0c6ed95 1359 if (!match)
252b5132
RH
1360 {
1361 as_bad (_("bad opcode or operands"));
ea1562b3 1362 return 0;
252b5132
RH
1363 }
1364
e0c6ed95
AM
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++)
252b5132
RH
1369 {
1370 if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
e0c6ed95 1371 (myops[i].X_add_number & 1))
252b5132 1372 as_fatal (_("Register number must be EVEN"));
461448d8
AO
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"));
252b5132
RH
1376 if (myops[i].X_op == O_register)
1377 {
e0c6ed95 1378 if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
252b5132
RH
1379 {
1380 myops[i].X_op = O_symbol;
e0c6ed95
AM
1381 myops[i].X_add_symbol =
1382 symbol_find_or_make ((char *) myops[i].X_op_symbol);
252b5132
RH
1383 myops[i].X_add_number = 0;
1384 myops[i].X_op_symbol = NULL;
1385 }
1386 }
fbdbf472
TR
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);
252b5132
RH
1396 }
1397 return opcode;
1398}
1399
ea1562b3
NC
1400/* Assemble a single instruction.
1401 Return an opcode, or -1 (an invalid opcode) on error. */
1402
1403static unsigned long
1404do_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];
ea1562b3
NC
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;
4ad7ac30 1418 *op_end && !is_end_of_line[*op_end] && *op_end != ' ';
ea1562b3
NC
1419 op_end++)
1420 {
1421 name[nlen] = TOLOWER (op_start[nlen]);
1422 nlen++;
4ad7ac30
AM
1423 if (nlen == sizeof (name) - 1)
1424 break;
ea1562b3
NC
1425 }
1426 name[nlen] = 0;
1427
1428 if (nlen == 0)
1429 return -1;
1430
1431 /* Find the first opcode with the proper name. */
629310ab 1432 *opcode = (struct d10v_opcode *) str_hash_find (d10v_hash, name);
ea1562b3 1433 if (*opcode == NULL)
c5d07591 1434 return -1;
ea1562b3
NC
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
c5d07591 1443 return build_insn ((*opcode), myops, 0);
ea1562b3
NC
1444}
1445
e0c6ed95
AM
1446/* If while processing a fixup, a reloc really needs to be created.
1447 Then it is done here. */
1448
252b5132 1449arelent *
ea1562b3 1450tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
1451{
1452 arelent *reloc;
add39d23
TS
1453 reloc = XNEW (arelent);
1454 reloc->sym_ptr_ptr = XNEW (asymbol *);
310b5aa2 1455 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
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,
e0c6ed95
AM
1461 _("reloc %d not supported by object file format"),
1462 (int) fixp->fx_r_type);
252b5132
RH
1463 return NULL;
1464 }
1465
a161fe53 1466 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
252b5132 1467 reloc->address = fixp->fx_offset;
cc8a6dd0 1468
a161fe53 1469 reloc->addend = 0;
cc8a6dd0 1470
252b5132
RH
1471 return reloc;
1472}
1473
1474int
ea1562b3
NC
1475md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1476 asection *seg ATTRIBUTE_UNUSED)
252b5132
RH
1477{
1478 abort ();
1479 return 0;
e0c6ed95 1480}
252b5132
RH
1481
1482long
ea1562b3 1483md_pcrel_from_section (fixS *fixp, segT sec)
252b5132 1484{
e0c6ed95
AM
1485 if (fixp->fx_addsy != (symbolS *) NULL
1486 && (!S_IS_DEFINED (fixp->fx_addsy)
1487 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
252b5132
RH
1488 return 0;
1489 return fixp->fx_frag->fr_address + fixp->fx_where;
1490}
1491
94f592af 1492void
55cf6793 1493md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132
RH
1494{
1495 char *where;
1496 unsigned long insn;
a161fe53 1497 long value = *valP;
252b5132 1498 int op_type;
e0c6ed95 1499 int left = 0;
252b5132 1500
94f592af
NC
1501 if (fixP->fx_addsy == (symbolS *) NULL)
1502 fixP->fx_done = 1;
1503
a161fe53
AM
1504 /* We don't actually support subtracting a symbol. */
1505 if (fixP->fx_subsy != (symbolS *) NULL)
4bf09429 1506 as_bad_subtract (fixP);
252b5132 1507
94f592af 1508 op_type = fixP->fx_r_type;
252b5132
RH
1509 if (op_type & 2048)
1510 {
1511 op_type -= 2048;
1512 if (op_type & 1024)
1513 {
1514 op_type -= 1024;
94f592af 1515 fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
252b5132
RH
1516 left = 1;
1517 }
1518 else if (op_type & 4096)
1519 {
1520 op_type -= 4096;
94f592af 1521 fixP->fx_r_type = BFD_RELOC_D10V_18;
252b5132
RH
1522 }
1523 else
94f592af 1524 fixP->fx_r_type =
e0c6ed95 1525 get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
252b5132
RH
1526 }
1527
1528 /* Fetch the instruction, insert the fully resolved operand
1529 value, and stuff the instruction back again. */
94f592af 1530 where = fixP->fx_frag->fr_literal + fixP->fx_where;
252b5132
RH
1531 insn = bfd_getb32 ((unsigned char *) where);
1532
94f592af 1533 switch (fixP->fx_r_type)
252b5132
RH
1534 {
1535 case BFD_RELOC_D10V_10_PCREL_L:
1536 case BFD_RELOC_D10V_10_PCREL_R:
1537 case BFD_RELOC_D10V_18_PCREL:
fbdbf472
TR
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
e97b3f28 1542 && S_IS_EXTERNAL (fixP->fx_addsy) )
8ade06a8
TR
1543 {
1544 segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
1545 segment_info_type *segf = seg_info(fseg);
fbdbf472
TR
1546
1547 if ( segf && segf->sym != fixP->fx_addsy)
1548 value = 0;
8ade06a8 1549 }
1a0670f3 1550 /* Fall through. */
252b5132 1551 case BFD_RELOC_D10V_18:
e0c6ed95 1552 /* Instruction addresses are always right-shifted by 2. */
252b5132 1553 value >>= AT_WORD_RIGHT_SHIFT;
94f592af 1554 if (fixP->fx_size == 2)
252b5132
RH
1555 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1556 else
1557 {
1558 struct d10v_opcode *rep, *repi;
1559
629310ab
ML
1560 rep = (struct d10v_opcode *) str_hash_find (d10v_hash, "rep");
1561 repi = (struct d10v_opcode *) str_hash_find (d10v_hash, "repi");
252b5132 1562 if ((insn & FM11) == FM11
b34976b6 1563 && ((repi != NULL
fbdbf472 1564 && (insn & repi->mask) == (unsigned) repi->opcode)
b34976b6 1565 || (rep != NULL
fbdbf472 1566 && (insn & rep->mask) == (unsigned) rep->opcode))
252b5132
RH
1567 && value < 4)
1568 as_fatal
1569 (_("line %d: rep or repi must include at least 4 instructions"),
94f592af 1570 fixP->fx_line);
e0c6ed95 1571 insn =
94f592af 1572 d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP);
e0c6ed95 1573 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
252b5132
RH
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;
7553c869
AM
1582 case BFD_RELOC_8:
1583 *where = value;
1584 break;
252b5132
RH
1585
1586 case BFD_RELOC_VTABLE_INHERIT:
1587 case BFD_RELOC_VTABLE_ENTRY:
94f592af
NC
1588 fixP->fx_done = 0;
1589 return;
252b5132
RH
1590
1591 default:
e0c6ed95 1592 as_fatal (_("line %d: unknown relocation type: 0x%x"),
94f592af 1593 fixP->fx_line, fixP->fx_r_type);
252b5132 1594 }
252b5132
RH
1595}
1596
bccba5f0
NC
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
e0c6ed95
AM
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
0a44c2b1
DL
1604 NOTE: accesses a global, etype.
1605 NOTE: invoked by various macros such as md_cleanup: see. */
e0c6ed95 1606
252b5132 1607int
ea1562b3 1608d10v_cleanup (void)
252b5132
RH
1609{
1610 segT seg;
1611 subsegT subseg;
1612
bccba5f0
NC
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))
252b5132
RH
1622 {
1623 seg = now_seg;
1624 subseg = now_subseg;
bccba5f0 1625
252b5132
RH
1626 if (prev_seg)
1627 subseg_set (prev_seg, prev_subseg);
bccba5f0 1628
252b5132
RH
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
800f6ec8
AM
1636void
1637d10v_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
fbdbf472
TR
1645/* Like normal .word, except support @word.
1646 Clobbers input_line_pointer, checks end-of-line. */
e0c6ed95 1647
252b5132 1648static void
ea1562b3 1649d10v_dot_word (int dummy ATTRIBUTE_UNUSED)
252b5132
RH
1650{
1651 expressionS exp;
252b5132 1652 char *p;
252b5132
RH
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;
e0c6ed95 1667
252b5132 1668 p = frag_more (2);
e0c6ed95 1669 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
252b5132
RH
1670 &exp, 0, BFD_RELOC_D10V_18);
1671 }
1672 else
1673 emit_expr (&exp, 2);
1674 }
1675 while (*input_line_pointer++ == ',');
1676
e0c6ed95 1677 input_line_pointer--; /* Put terminator back into stream. */
252b5132
RH
1678 demand_empty_rest_of_line ();
1679}
1680
e0c6ed95
AM
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. */
252b5132 1687
fbdbf472
TR
1688/* Operands that begin with '#' should fall through to here.
1689 From expr.c. */
252b5132 1690
e0c6ed95 1691void
ea1562b3 1692md_operand (expressionS *expressionP)
252b5132 1693{
0f94f4c8 1694 if (*input_line_pointer == '#' && ! do_not_ignore_hash)
252b5132
RH
1695 {
1696 input_line_pointer++;
1697 expression (expressionP);
1698 }
1699}
1700
5b7c81bd 1701bool
ea1562b3 1702d10v_fix_adjustable (fixS *fixP)
252b5132 1703{
e0c6ed95 1704 /* We need the symbol name for the VTABLE entries. */
252b5132
RH
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}
ea1562b3
NC
1711
1712/* The target specific pseudo-ops which we support. */
1713const pseudo_typeS md_pseudo_table[] =
1714{
1715 { "word", d10v_dot_word, 2 },
1716 { NULL, NULL, 0 }
1717};
1718
1719void
1720md_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)
c5d07591 1761 as_fatal (_("can't find previous opcode "));
ea1562b3
NC
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)
c5d07591
NC
1771 etype = extype;
1772 else
1773 as_bad (_("could not assemble: %s"), str);
1774 return;
ea1562b3
NC
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