* binutils-all/objdump.exp (cpus_expected): Add ms1.
[deliverable/binutils-gdb.git] / gas / config / tc-d30v.c
CommitLineData
252b5132 1/* tc-d30v.c -- Assembler code for the Mitsubishi D30V
aa820537
AM
2 Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008,
3 2009 Free Software Foundation, Inc.
252b5132
RH
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
ec2655a6 9 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
4b4da160
NC
19 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
252b5132 21
252b5132 22#include "as.h"
3882b010 23#include "safe-ctype.h"
2fd5405a 24#include "subsegs.h"
252b5132
RH
25#include "opcode/d30v.h"
26
ea1562b3
NC
27const char comment_chars[] = ";";
28const char line_comment_chars[] = "#";
252b5132 29const char line_separator_chars[] = "";
ea1562b3
NC
30const char *md_shortopts = "OnNcC";
31const char EXP_CHARS[] = "eE";
32const char FLT_CHARS[] = "dD";
252b5132 33
ba09cd8d
DN
34#if HAVE_LIMITS_H
35#include <limits.h>
36#endif
37
38#ifndef CHAR_BIT
39#define CHAR_BIT 8
40#endif
41
252b5132
RH
42#define NOP_MULTIPLY 1
43#define NOP_ALL 2
44static int warn_nops = 0;
45static int Optimizing = 0;
46static int warn_register_name_conflicts = 1;
47
48#define FORCE_SHORT 1
49#define FORCE_LONG 2
50
51/* EXEC types. */
52typedef enum _exec_type
53{
ea1562b3
NC
54 EXEC_UNKNOWN, /* No order specified. */
55 EXEC_PARALLEL, /* Done in parallel (FM=00). */
56 EXEC_SEQ, /* Sequential (FM=01). */
57 EXEC_REVSEQ /* Reverse sequential (FM=10). */
252b5132
RH
58} exec_type_enum;
59
2fd5405a 60/* Fixups. */
ea1562b3
NC
61#define MAX_INSN_FIXUPS 5
62
252b5132
RH
63struct d30v_fixup
64{
65 expressionS exp;
66 int operand;
67 int pcrel;
68 int size;
69 bfd_reloc_code_real_type reloc;
70};
71
72typedef struct _fixups
73{
74 int fc;
75 struct d30v_fixup fix[MAX_INSN_FIXUPS];
76 struct _fixups *next;
77} Fixups;
78
79static Fixups FixUps[2];
80static Fixups *fixups;
81
82/* Whether current and previous instruction are word multiply insns. */
83static int cur_mul32_p = 0;
84static int prev_mul32_p = 0;
85
86/* The flag_explicitly_parallel is true iff the instruction being assembled
87 has been explicitly written as a parallel short-instruction pair by the
2fd5405a 88 human programmer. It is used in parallel_ok () to distinguish between
252b5132
RH
89 those dangerous parallelizations attempted by the human, which are to be
90 allowed, and those attempted by the assembler, which are not. It is set
2fd5405a
NC
91 from md_assemble (). */
92static int flag_explicitly_parallel = 0;
252b5132
RH
93static int flag_xp_state = 0;
94
95/* Whether current and previous left sub-instruction disables
96 execution of right sub-instruction. */
97static int cur_left_kills_right_p = 0;
98static int prev_left_kills_right_p = 0;
99
100/* The known current alignment of the current section. */
101static int d30v_current_align;
102static segT d30v_current_align_seg;
103
104/* The last seen label in the current section. This is used to auto-align
2d2255b5 105 labels preceding instructions. */
252b5132
RH
106static symbolS *d30v_last_label;
107
2fd5405a 108/* Two nops. */
252b5132
RH
109#define NOP_LEFT ((long long) NOP << 32)
110#define NOP_RIGHT ((long long) NOP)
111#define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT)
112
2fd5405a
NC
113struct option md_longopts[] =
114{
252b5132
RH
115 {NULL, no_argument, NULL, 0}
116};
252b5132 117
2fd5405a 118size_t md_longopts_size = sizeof (md_longopts);
252b5132 119
252b5132
RH
120/* Opcode hash table. */
121static struct hash_control *d30v_hash;
122
2fd5405a
NC
123/* Do a binary search of the pre_defined_registers array to see if
124 NAME is a valid regiter name. Return the register number from the
125 array on success, or -1 on failure. */
252b5132
RH
126
127static int
ea1562b3 128reg_name_search (char *name)
252b5132
RH
129{
130 int middle, low, high;
131 int cmp;
132
133 low = 0;
134 high = reg_name_cnt () - 1;
135
136 do
137 {
138 middle = (low + high) / 2;
139 cmp = strcasecmp (name, pre_defined_registers[middle].name);
140 if (cmp < 0)
141 high = middle - 1;
142 else if (cmp > 0)
143 low = middle + 1;
144 else
145 {
146 if (symbol_find (name) != NULL)
147 {
148 if (warn_register_name_conflicts)
149 as_warn (_("Register name %s conflicts with symbol of the same name"),
150 name);
151 }
2fd5405a 152
252b5132
RH
153 return pre_defined_registers[middle].value;
154 }
155 }
156 while (low <= high);
2fd5405a 157
252b5132
RH
158 return -1;
159}
160
2fd5405a
NC
161/* Check the string at input_line_pointer to see if it is a valid
162 register name. */
252b5132
RH
163
164static int
ea1562b3 165register_name (expressionS *expressionP)
252b5132
RH
166{
167 int reg_number;
168 char c, *p = input_line_pointer;
2fd5405a
NC
169
170 while (*p && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
252b5132
RH
171 p++;
172
173 c = *p;
174 if (c)
175 *p++ = 0;
176
2fd5405a 177 /* Look to see if it's in the register table. */
252b5132 178 reg_number = reg_name_search (input_line_pointer);
2fd5405a 179 if (reg_number >= 0)
252b5132
RH
180 {
181 expressionP->X_op = O_register;
2fd5405a
NC
182 /* Temporarily store a pointer to the string here. */
183 expressionP->X_op_symbol = (symbolS *) input_line_pointer;
252b5132
RH
184 expressionP->X_add_number = reg_number;
185 input_line_pointer = p;
186 return 1;
187 }
188 if (c)
2fd5405a 189 *(p - 1) = c;
252b5132
RH
190 return 0;
191}
192
252b5132 193static int
ea1562b3 194check_range (unsigned long num, int bits, int flags)
252b5132
RH
195{
196 long min, max;
252b5132 197
bf80011a
RH
198 /* Don't bother checking 32-bit values. */
199 if (bits == 32)
200 {
2fd5405a 201 if (sizeof (unsigned long) * CHAR_BIT == 32)
cc8a6dd0 202 return 0;
bf80011a
RH
203
204 /* We don't record signed or unsigned for 32-bit quantities.
205 Allow either. */
2fd5405a
NC
206 min = -((unsigned long) 1 << (bits - 1));
207 max = ((unsigned long) 1 << bits) - 1;
30cdfbed 208 return (long) num < min || (long) num > max;
bf80011a 209 }
252b5132
RH
210
211 if (flags & OPERAND_SHIFT)
212 {
2fd5405a 213 /* We know that all shifts are right by three bits. */
30cdfbed 214 num >>= 3;
2fd5405a 215
252b5132 216 if (flags & OPERAND_SIGNED)
30cdfbed
AM
217 {
218 unsigned long sign_bit = ((unsigned long) -1L >> 4) + 1;
219 num = (num ^ sign_bit) - sign_bit;
220 }
252b5132
RH
221 }
222
223 if (flags & OPERAND_SIGNED)
224 {
2fd5405a
NC
225 max = ((unsigned long) 1 << (bits - 1)) - 1;
226 min = - ((unsigned long) 1 << (bits - 1));
30cdfbed 227 return (long) num > max || (long) num < min;
252b5132
RH
228 }
229 else
230 {
2fd5405a 231 max = ((unsigned long) 1 << bits) - 1;
30cdfbed 232 return num > (unsigned long) max;
252b5132 233 }
252b5132
RH
234}
235
252b5132 236void
ea1562b3 237md_show_usage (FILE *stream)
252b5132
RH
238{
239 fprintf (stream, _("\nD30V options:\n\
240-O Make adjacent short instructions parallel if possible.\n\
241-n Warn about all NOPs inserted by the assembler.\n\
242-N Warn about NOPs inserted after word multiplies.\n\
243-c Warn about symbols whoes names match register names.\n\
244-C Opposite of -C. -c is the default.\n"));
245}
246
247int
ea1562b3 248md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
252b5132
RH
249{
250 switch (c)
251 {
2fd5405a 252 /* Optimize. Will attempt to parallelize operations. */
252b5132
RH
253 case 'O':
254 Optimizing = 1;
255 break;
256
257 /* Warn about all NOPS that the assembler inserts. */
258 case 'n':
259 warn_nops = NOP_ALL;
260 break;
261
262 /* Warn about the NOPS that the assembler inserts because of the
263 multiply hazard. */
264 case 'N':
265 warn_nops = NOP_MULTIPLY;
266 break;
267
268 case 'c':
269 warn_register_name_conflicts = 1;
270 break;
271
272 case 'C':
273 warn_register_name_conflicts = 0;
274 break;
2fd5405a 275
252b5132
RH
276 default:
277 return 0;
278 }
279 return 1;
280}
281
282symbolS *
ea1562b3 283md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
252b5132
RH
284{
285 return 0;
286}
287
252b5132 288char *
ea1562b3 289md_atof (int type, char *litP, int *sizeP)
252b5132 290{
499ac353 291 return ieee_md_atof (type, litP, sizeP, TRUE);
252b5132
RH
292}
293
294void
ea1562b3
NC
295md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
296 asection *sec ATTRIBUTE_UNUSED,
297 fragS *fragP ATTRIBUTE_UNUSED)
252b5132
RH
298{
299 abort ();
300}
301
302valueT
ea1562b3 303md_section_align (asection *seg, valueT addr)
252b5132
RH
304{
305 int align = bfd_get_section_alignment (stdoutput, seg);
306 return ((addr + (1 << align) - 1) & (-1 << align));
307}
308
252b5132 309void
ea1562b3 310md_begin (void)
252b5132 311{
2fd5405a 312 struct d30v_opcode *opcode;
252b5132
RH
313 d30v_hash = hash_new ();
314
2fd5405a
NC
315 /* Insert opcode names into a hash table. */
316 for (opcode = (struct d30v_opcode *) d30v_opcode_table; opcode->name; opcode++)
252b5132
RH
317 hash_insert (d30v_hash, opcode->name, (char *) opcode);
318
319 fixups = &FixUps[0];
320 FixUps[0].next = &FixUps[1];
321 FixUps[1].next = &FixUps[0];
322
323 d30v_current_align_seg = now_seg;
324}
325
2fd5405a
NC
326/* Remove the postincrement or postdecrement operator ( '+' or '-' )
327 from an expression. */
252b5132 328
2fd5405a 329static int
ea1562b3 330postfix (char *p)
252b5132 331{
2fd5405a 332 while (*p != '-' && *p != '+')
252b5132 333 {
2fd5405a 334 if (*p == 0 || *p == '\n' || *p == '\r' || *p == ' ' || *p == ',')
252b5132
RH
335 break;
336 p++;
337 }
338
2fd5405a 339 if (*p == '-')
252b5132
RH
340 {
341 *p = ' ';
2fd5405a 342 return -1;
252b5132 343 }
81d4177b 344
2fd5405a 345 if (*p == '+')
252b5132
RH
346 {
347 *p = ' ';
2fd5405a 348 return 1;
252b5132
RH
349 }
350
2fd5405a 351 return 0;
252b5132
RH
352}
353
2fd5405a 354static bfd_reloc_code_real_type
9c95b521 355get_reloc (const struct d30v_operand *op, int rel_flag)
252b5132
RH
356{
357 switch (op->bits)
358 {
359 case 6:
360 if (op->flags & OPERAND_SHIFT)
361 return BFD_RELOC_D30V_9_PCREL;
362 else
363 return BFD_RELOC_D30V_6;
364 break;
365 case 12:
366 if (!(op->flags & OPERAND_SHIFT))
367 as_warn (_("unexpected 12-bit reloc type"));
368 if (rel_flag == RELOC_PCREL)
369 return BFD_RELOC_D30V_15_PCREL;
370 else
371 return BFD_RELOC_D30V_15;
372 case 18:
373 if (!(op->flags & OPERAND_SHIFT))
374 as_warn (_("unexpected 18-bit reloc type"));
375 if (rel_flag == RELOC_PCREL)
376 return BFD_RELOC_D30V_21_PCREL;
377 else
378 return BFD_RELOC_D30V_21;
379 case 32:
380 if (rel_flag == RELOC_PCREL)
381 return BFD_RELOC_D30V_32_PCREL;
382 else
383 return BFD_RELOC_D30V_32;
384 default:
385 return 0;
386 }
387}
388
2fd5405a 389/* Parse a string of operands and return an array of expressions. */
252b5132
RH
390
391static int
ea1562b3 392get_operands (expressionS exp[], int cmp_hack)
252b5132
RH
393{
394 char *p = input_line_pointer;
395 int numops = 0;
396 int post = 0;
397
398 if (cmp_hack)
399 {
400 exp[numops].X_op = O_absent;
401 exp[numops++].X_add_number = cmp_hack - 1;
402 }
403
2fd5405a 404 while (*p)
252b5132 405 {
2fd5405a 406 while (*p == ' ' || *p == '\t' || *p == ',')
252b5132 407 p++;
81d4177b 408
2fd5405a
NC
409 if (*p == 0 || *p == '\n' || *p == '\r')
410 break;
411
412 if (*p == '@')
252b5132
RH
413 {
414 p++;
415 exp[numops].X_op = O_absent;
2fd5405a 416 if (*p == '(')
252b5132
RH
417 {
418 p++;
419 exp[numops].X_add_number = OPERAND_ATPAR;
420 post = postfix (p);
421 }
2fd5405a 422 else if (*p == '-')
252b5132
RH
423 {
424 p++;
425 exp[numops].X_add_number = OPERAND_ATMINUS;
426 }
427 else
428 {
429 exp[numops].X_add_number = OPERAND_ATSIGN;
430 post = postfix (p);
431 }
432 numops++;
433 continue;
434 }
435
2fd5405a 436 if (*p == ')')
252b5132 437 {
2fd5405a 438 /* Just skip the trailing paren. */
252b5132
RH
439 p++;
440 continue;
441 }
442
443 input_line_pointer = p;
444
2fd5405a 445 /* Check to see if it might be a register name. */
252b5132
RH
446 if (!register_name (&exp[numops]))
447 {
2fd5405a 448 /* Parse as an expression. */
252b5132
RH
449 expression (&exp[numops]);
450 }
451
2fd5405a 452 if (exp[numops].X_op == O_illegal)
252b5132 453 as_bad (_("illegal operand"));
2fd5405a 454 else if (exp[numops].X_op == O_absent)
252b5132
RH
455 as_bad (_("missing operand"));
456
457 numops++;
458 p = input_line_pointer;
459
2fd5405a 460 switch (post)
252b5132 461 {
2fd5405a
NC
462 case -1:
463 /* Postdecrement mode. */
252b5132
RH
464 exp[numops].X_op = O_absent;
465 exp[numops++].X_add_number = OPERAND_MINUS;
466 break;
2fd5405a
NC
467 case 1:
468 /* Postincrement mode. */
252b5132
RH
469 exp[numops].X_op = O_absent;
470 exp[numops++].X_add_number = OPERAND_PLUS;
471 break;
472 }
473 post = 0;
474 }
475
476 exp[numops].X_op = 0;
81d4177b 477
2fd5405a 478 return numops;
252b5132
RH
479}
480
2fd5405a
NC
481/* Generate the instruction.
482 It does everything but write the FM bits. */
252b5132
RH
483
484static long long
ea1562b3 485build_insn (struct d30v_insn *opcode, expressionS *opers)
252b5132
RH
486{
487 int i, length, bits, shift, flags;
2fd5405a 488 unsigned long number, id = 0;
252b5132
RH
489 long long insn;
490 struct d30v_opcode *op = opcode->op;
491 struct d30v_format *form = opcode->form;
492
2fd5405a
NC
493 insn =
494 opcode->ecc << 28 | op->op1 << 25 | op->op2 << 20 | form->modifier << 18;
252b5132 495
2fd5405a
NC
496 for (i = 0; form->operands[i]; i++)
497 {
252b5132
RH
498 flags = d30v_operand_table[form->operands[i]].flags;
499
2fd5405a
NC
500 /* Must be a register or number. */
501 if (!(flags & OPERAND_REG) && !(flags & OPERAND_NUM)
502 && !(flags & OPERAND_NAME) && !(flags & OPERAND_SPECIAL))
252b5132
RH
503 continue;
504
505 bits = d30v_operand_table[form->operands[i]].bits;
506 if (flags & OPERAND_SHIFT)
507 bits += 3;
508
509 length = d30v_operand_table[form->operands[i]].length;
510 shift = 12 - d30v_operand_table[form->operands[i]].position;
511 if (opers[i].X_op != O_symbol)
512 number = opers[i].X_add_number;
513 else
514 number = 0;
515 if (flags & OPERAND_REG)
516 {
2fd5405a 517 /* Check for mvfsys or mvtsys control registers. */
252b5132
RH
518 if (flags & OPERAND_CONTROL && (number & 0x7f) > MAX_CONTROL_REG)
519 {
2fd5405a 520 /* PSWL or PSWH. */
252b5132
RH
521 id = (number & 0x7f) - MAX_CONTROL_REG;
522 number = 0;
523 }
524 else if (number & OPERAND_FLAG)
ea1562b3
NC
525 /* NUMBER is a flag register. */
526 id = 3;
527
252b5132
RH
528 number &= 0x7F;
529 }
530 else if (flags & OPERAND_SPECIAL)
ea1562b3 531 number = id;
252b5132 532
2fd5405a
NC
533 if (opers[i].X_op != O_register && opers[i].X_op != O_constant
534 && !(flags & OPERAND_NAME))
252b5132 535 {
2fd5405a 536 /* Now create a fixup. */
252b5132
RH
537 if (fixups->fc >= MAX_INSN_FIXUPS)
538 as_fatal (_("too many fixups"));
539
2fd5405a 540 fixups->fix[fixups->fc].reloc =
9c95b521 541 get_reloc (d30v_operand_table + form->operands[i], op->reloc_flag);
252b5132
RH
542 fixups->fix[fixups->fc].size = 4;
543 fixups->fix[fixups->fc].exp = opers[i];
544 fixups->fix[fixups->fc].operand = form->operands[i];
545 if (fixups->fix[fixups->fc].reloc == BFD_RELOC_D30V_9_PCREL)
546 fixups->fix[fixups->fc].pcrel = RELOC_PCREL;
547 else
548 fixups->fix[fixups->fc].pcrel = op->reloc_flag;
549 (fixups->fc)++;
550 }
551
2fd5405a 552 /* Truncate to the proper number of bits. */
252b5132 553 if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
ebf19f1b 554 as_bad (_("operand out of range: %ld"), number);
252b5132
RH
555 if (bits < 31)
556 number &= 0x7FFFFFFF >> (31 - bits);
557 if (flags & OPERAND_SHIFT)
558 number >>= 3;
559 if (bits == 32)
560 {
2fd5405a 561 /* It's a LONG instruction. */
ea1562b3
NC
562 insn |= ((number & 0xffffffff) >> 26); /* Top 6 bits. */
563 insn <<= 32; /* Shift the first word over. */
564 insn |= ((number & 0x03FC0000) << 2); /* Next 8 bits. */
565 insn |= number & 0x0003FFFF; /* Bottom 18 bits. */
252b5132
RH
566 }
567 else
568 insn |= number << shift;
569 }
81d4177b 570
252b5132
RH
571 return insn;
572}
573
ea1562b3
NC
574static void
575d30v_number_to_chars (char *buf, /* Return 'nbytes' of chars here. */
576 long long value, /* The value of the bits. */
577 int n) /* Number of bytes in the output. */
578{
579 while (n--)
580 {
581 buf[n] = value & 0xff;
582 value >>= 8;
583 }
584}
585
2fd5405a 586/* Write out a long form instruction. */
252b5132 587
252b5132 588static void
ea1562b3
NC
589write_long (struct d30v_insn *opcode ATTRIBUTE_UNUSED,
590 long long insn,
591 Fixups *fx)
252b5132
RH
592{
593 int i, where;
594 char *f = frag_more (8);
595
596 insn |= FM11;
597 d30v_number_to_chars (f, insn, 8);
598
2fd5405a 599 for (i = 0; i < fx->fc; i++)
252b5132
RH
600 {
601 if (fx->fix[i].reloc)
2fd5405a
NC
602 {
603 where = f - frag_now->fr_literal;
ea1562b3
NC
604 fix_new_exp (frag_now, where, fx->fix[i].size, &(fx->fix[i].exp),
605 fx->fix[i].pcrel, fx->fix[i].reloc);
252b5132
RH
606 }
607 }
81d4177b 608
252b5132
RH
609 fx->fc = 0;
610}
611
252b5132 612/* Write out a short form instruction by itself. */
2fd5405a 613
252b5132 614static void
ea1562b3
NC
615write_1_short (struct d30v_insn *opcode,
616 long long insn,
617 Fixups *fx,
618 int use_sequential)
252b5132
RH
619{
620 char *f = frag_more (8);
621 int i, where;
622
623 if (warn_nops == NOP_ALL)
624 as_warn (_("%s NOP inserted"), use_sequential ?
625 _("sequential") : _("parallel"));
626
2fd5405a 627 /* The other container needs to be NOP. */
252b5132
RH
628 if (use_sequential)
629 {
630 /* Use a sequential NOP rather than a parallel one,
631 as the current instruction is a FLAG_MUL32 type one
632 and the next instruction is a load. */
2fd5405a 633
252b5132 634 /* According to 4.3.1: for FM=01, sub-instructions performed
2fd5405a 635 only by IU cannot be encoded in L-container. */
252b5132 636 if (opcode->op->unit == IU)
2fd5405a
NC
637 /* Right then left. */
638 insn |= FM10 | NOP_LEFT;
252b5132 639 else
2fd5405a
NC
640 /* Left then right. */
641 insn = FM01 | (insn << 32) | NOP_RIGHT;
252b5132
RH
642 }
643 else
644 {
645 /* According to 4.3.1: for FM=00, sub-instructions performed
2fd5405a 646 only by IU cannot be encoded in L-container. */
252b5132 647 if (opcode->op->unit == IU)
2fd5405a
NC
648 /* Right container. */
649 insn |= FM00 | NOP_LEFT;
252b5132 650 else
2fd5405a
NC
651 /* Left container. */
652 insn = FM00 | (insn << 32) | NOP_RIGHT;
252b5132
RH
653 }
654
655 d30v_number_to_chars (f, insn, 8);
656
2fd5405a 657 for (i = 0; i < fx->fc; i++)
252b5132
RH
658 {
659 if (fx->fix[i].reloc)
2fd5405a
NC
660 {
661 where = f - frag_now->fr_literal;
252b5132 662 fix_new_exp (frag_now,
2fd5405a 663 where,
252b5132
RH
664 fx->fix[i].size,
665 &(fx->fix[i].exp),
666 fx->fix[i].pcrel,
667 fx->fix[i].reloc);
668 }
669 }
81d4177b 670
252b5132
RH
671 fx->fc = 0;
672}
673
2fd5405a
NC
674/* Check 2 instructions and determine if they can be safely
675 executed in parallel. Return 1 if they can be. */
252b5132 676
252b5132 677static int
ea1562b3
NC
678parallel_ok (struct d30v_insn *op1,
679 unsigned long insn1,
680 struct d30v_insn *op2,
681 unsigned long insn2,
682 exec_type_enum exec_type)
252b5132
RH
683{
684 int i, j, shift, regno, bits, ecc;
685 unsigned long flags, mask, flags_set1, flags_set2, flags_used1, flags_used2;
686 unsigned long ins, mod_reg[2][3], used_reg[2][3], flag_reg[2];
687 struct d30v_format *f;
688 struct d30v_opcode *op;
689
2fd5405a 690 /* Section 4.3: Both instructions must not be IU or MU only. */
252b5132
RH
691 if ((op1->op->unit == IU && op2->op->unit == IU)
692 || (op1->op->unit == MU && op2->op->unit == MU))
693 return 0;
694
2fd5405a 695 /* First instruction must not be a jump to safely optimize, unless this
252b5132
RH
696 is an explicit parallel operation. */
697 if (exec_type != EXEC_PARALLEL
698 && (op1->op->flags_used & (FLAG_JMP | FLAG_JSR)))
699 return 0;
700
701 /* If one instruction is /TX or /XT and the other is /FX or /XF respectively,
702 then it is safe to allow the two to be done as parallel ops, since only
703 one will ever be executed at a time. */
704 if ((op1->ecc == ECC_TX && op2->ecc == ECC_FX)
705 || (op1->ecc == ECC_FX && op2->ecc == ECC_TX)
706 || (op1->ecc == ECC_XT && op2->ecc == ECC_XF)
707 || (op1->ecc == ECC_XF && op2->ecc == ECC_XT))
2fd5405a 708 return 1;
252b5132
RH
709
710 /* [0] r0-r31
711 [1] r32-r63
2fd5405a 712 [2] a0, a1, flag registers. */
252b5132
RH
713 for (j = 0; j < 2; j++)
714 {
715 if (j == 0)
716 {
717 f = op1->form;
718 op = op1->op;
719 ecc = op1->ecc;
720 ins = insn1;
721 }
722 else
723 {
724 f = op2->form;
725 op = op2->op;
726 ecc = op2->ecc;
727 ins = insn2;
728 }
81d4177b 729
252b5132
RH
730 flag_reg[j] = 0;
731 mod_reg[j][0] = mod_reg[j][1] = 0;
732 used_reg[j][0] = used_reg[j][1] = 0;
733
734 if (flag_explicitly_parallel)
735 {
736 /* For human specified parallel instructions we have been asked
737 to ignore the possibility that both instructions could modify
738 bits in the PSW, so we initialise the mod & used arrays to 0.
739 We have been asked, however, to refuse to allow parallel
740 instructions which explicitly set the same flag register,
741 eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test
742 for the use of a flag register and set a bit in the mod or used
743 array appropriately. */
252b5132
RH
744 mod_reg[j][2] = 0;
745 used_reg[j][2] = 0;
746 }
747 else
748 {
749 mod_reg[j][2] = (op->flags_set & FLAG_ALL);
750 used_reg[j][2] = (op->flags_used & FLAG_ALL);
751 }
2fd5405a
NC
752
753 /* BSR/JSR always sets R62. */
252b5132 754 if (op->flags_used & FLAG_JSR)
2fd5405a 755 mod_reg[j][1] = (1L << (62 - 32));
252b5132 756
2fd5405a 757 /* Conditional execution affects the flags_used. */
252b5132
RH
758 switch (ecc)
759 {
760 case ECC_TX:
761 case ECC_FX:
762 used_reg[j][2] |= flag_reg[j] = FLAG_0;
763 break;
764
765 case ECC_XT:
766 case ECC_XF:
767 used_reg[j][2] |= flag_reg[j] = FLAG_1;
768 break;
769
770 case ECC_TT:
771 case ECC_TF:
772 used_reg[j][2] |= flag_reg[j] = (FLAG_0 | FLAG_1);
773 break;
774 }
775
776 for (i = 0; f->operands[i]; i++)
777 {
778 flags = d30v_operand_table[f->operands[i]].flags;
779 shift = 12 - d30v_operand_table[f->operands[i]].position;
780 bits = d30v_operand_table[f->operands[i]].bits;
781 if (bits == 32)
782 mask = 0xffffffff;
783 else
784 mask = 0x7FFFFFFF >> (31 - bits);
785
786 if ((flags & OPERAND_PLUS) || (flags & OPERAND_MINUS))
787 {
2fd5405a
NC
788 /* This is a post-increment or post-decrement.
789 The previous register needs to be marked as modified. */
790 shift = 12 - d30v_operand_table[f->operands[i - 1]].position;
252b5132
RH
791 regno = (ins >> shift) & 0x3f;
792 if (regno >= 32)
793 mod_reg[j][1] |= 1L << (regno - 32);
794 else
795 mod_reg[j][0] |= 1L << regno;
796 }
797 else if (flags & OPERAND_REG)
798 {
799 regno = (ins >> shift) & mask;
2fd5405a
NC
800 /* The memory write functions don't have a destination
801 register. */
252b5132
RH
802 if ((flags & OPERAND_DEST) && !(op->flags_set & FLAG_MEM))
803 {
2fd5405a 804 /* MODIFIED registers and flags. */
252b5132
RH
805 if (flags & OPERAND_ACC)
806 {
807 if (regno == 0)
808 mod_reg[j][2] |= FLAG_A0;
809 else if (regno == 1)
810 mod_reg[j][2] |= FLAG_A1;
811 else
812 abort ();
813 }
814 else if (flags & OPERAND_FLAG)
815 mod_reg[j][2] |= 1L << regno;
816 else if (!(flags & OPERAND_CONTROL))
817 {
818 int r, z;
819
2fd5405a
NC
820 /* Need to check if there are two destination
821 registers, for example ld2w. */
252b5132
RH
822 if (flags & OPERAND_2REG)
823 z = 1;
824 else
825 z = 0;
826
827 for (r = regno; r <= regno + z; r++)
2fd5405a 828 {
252b5132
RH
829 if (r >= 32)
830 mod_reg[j][1] |= 1L << (r - 32);
831 else
832 mod_reg[j][0] |= 1L << r;
833 }
834 }
835 }
836 else
837 {
2fd5405a 838 /* USED, but not modified registers and flags. */
252b5132
RH
839 if (flags & OPERAND_ACC)
840 {
841 if (regno == 0)
842 used_reg[j][2] |= FLAG_A0;
843 else if (regno == 1)
844 used_reg[j][2] |= FLAG_A1;
845 else
846 abort ();
847 }
848 else if (flags & OPERAND_FLAG)
849 used_reg[j][2] |= 1L << regno;
850 else if (!(flags & OPERAND_CONTROL))
851 {
852 int r, z;
853
2fd5405a
NC
854 /* Need to check if there are two source
855 registers, for example st2w. */
252b5132
RH
856 if (flags & OPERAND_2REG)
857 z = 1;
858 else
859 z = 0;
860
861 for (r = regno; r <= regno + z; r++)
2fd5405a 862 {
252b5132
RH
863 if (r >= 32)
864 used_reg[j][1] |= 1L << (r - 32);
865 else
866 used_reg[j][0] |= 1L << r;
867 }
868 }
869 }
870 }
871 }
872 }
2fd5405a 873
252b5132
RH
874 flags_set1 = op1->op->flags_set;
875 flags_set2 = op2->op->flags_set;
876 flags_used1 = op1->op->flags_used;
877 flags_used2 = op2->op->flags_used;
878
25f2196d
CC
879 /* Check for illegal combinations with ADDppp/SUBppp. */
880 if (((flags_set1 & FLAG_NOT_WITH_ADDSUBppp) != 0
252b5132 881 && (flags_used2 & FLAG_ADDSUBppp) != 0)
25f2196d 882 || ((flags_set2 & FLAG_NOT_WITH_ADDSUBppp) != 0
252b5132
RH
883 && (flags_used1 & FLAG_ADDSUBppp) != 0))
884 return 0;
885
886 /* Load instruction combined with half-word multiply is illegal. */
887 if (((flags_used1 & FLAG_MEM) != 0 && (flags_used2 & FLAG_MUL16))
888 || ((flags_used2 & FLAG_MEM) != 0 && (flags_used1 & FLAG_MUL16)))
889 return 0;
890
891 /* Specifically allow add || add by removing carry, overflow bits dependency.
892 This is safe, even if an addc follows since the IU takes the argument in
893 the right container, and it writes its results last.
894 However, don't paralellize add followed by addc or sub followed by
895 subb. */
252b5132
RH
896 if (mod_reg[0][2] == FLAG_CVVA && mod_reg[1][2] == FLAG_CVVA
897 && (used_reg[0][2] & ~flag_reg[0]) == 0
898 && (used_reg[1][2] & ~flag_reg[1]) == 0
899 && op1->op->unit == EITHER && op2->op->unit == EITHER)
900 {
901 mod_reg[0][2] = mod_reg[1][2] = 0;
902 }
903
904 for (j = 0; j < 3; j++)
905 {
906 /* If the second instruction depends on the first, we obviously
907 cannot parallelize. Note, the mod flag implies use, so
908 check that as well. */
2fd5405a 909 /* If flag_explicitly_parallel is set, then the case of the
252b5132
RH
910 second instruction using a register the first instruction
911 modifies is assumed to be okay; we trust the human. We
912 don't trust the human if both instructions modify the same
913 register but we do trust the human if they modify the same
2fd5405a 914 flags. */
252b5132
RH
915 /* We have now been requested not to trust the human if the
916 instructions modify the same flag registers either. */
917 if (flag_explicitly_parallel)
918 {
919 if ((mod_reg[0][j] & mod_reg[1][j]) != 0)
920 return 0;
921 }
922 else
cc8a6dd0 923 if ((mod_reg[0][j] & (mod_reg[1][j] | used_reg[1][j])) != 0)
252b5132
RH
924 return 0;
925 }
926
927 return 1;
928}
929
ea1562b3
NC
930/* Write out a short form instruction if possible.
931 Return number of instructions not written out. */
252b5132 932
ea1562b3
NC
933static int
934write_2_short (struct d30v_insn *opcode1,
935 long long insn1,
936 struct d30v_insn *opcode2,
937 long long insn2,
938 exec_type_enum exec_type,
939 Fixups *fx)
252b5132 940{
ea1562b3
NC
941 long long insn = NOP2;
942 char *f;
943 int i, j, where;
252b5132 944
ea1562b3
NC
945 if (exec_type == EXEC_SEQ
946 && (opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR))
947 && ((opcode1->op->flags_used & FLAG_DELAY) == 0)
948 && ((opcode1->ecc == ECC_AL) || ! Optimizing))
949 {
950 /* Unconditional, non-delayed branches kill instructions in
951 the right bin. Conditional branches don't always but if
952 we are not optimizing, then we have been asked to produce
953 an error about such constructs. For the purposes of this
954 test, subroutine calls are considered to be branches. */
955 write_1_short (opcode1, insn1, fx->next, FALSE);
956 return 1;
957 }
252b5132 958
ea1562b3
NC
959 /* Note: we do not have to worry about subroutine calls occurring
960 in the right hand container. The return address is always
961 aligned to the next 64 bit boundary, be that 64 or 32 bit away. */
962 switch (exec_type)
252b5132 963 {
ea1562b3
NC
964 case EXEC_UNKNOWN: /* Order not specified. */
965 if (Optimizing
966 && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)
967 && ! ( (opcode1->op->unit == EITHER_BUT_PREFER_MU
968 || opcode1->op->unit == MU)
969 &&
970 ( opcode2->op->unit == EITHER_BUT_PREFER_MU
971 || opcode2->op->unit == MU)))
252b5132 972 {
ea1562b3
NC
973 /* Parallel. */
974 exec_type = EXEC_PARALLEL;
975
976 if (opcode1->op->unit == IU
977 || opcode2->op->unit == MU
978 || opcode2->op->unit == EITHER_BUT_PREFER_MU)
979 insn = FM00 | (insn2 << 32) | insn1;
252b5132
RH
980 else
981 {
ea1562b3
NC
982 insn = FM00 | (insn1 << 32) | insn2;
983 fx = fx->next;
252b5132
RH
984 }
985 }
ea1562b3
NC
986 else if ((opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR)
987 && ((opcode1->op->flags_used & FLAG_DELAY) == 0))
988 || opcode1->op->flags_used & FLAG_RP)
989 {
990 /* We must emit (non-delayed) branch type instructions
991 on their own with nothing in the right container. */
992 /* We must treat repeat instructions likewise, since the
993 following instruction has to be separate from the repeat
994 in order to be repeated. */
995 write_1_short (opcode1, insn1, fx->next, FALSE);
996 return 1;
997 }
998 else if (prev_left_kills_right_p)
999 {
1000 /* The left instruction kils the right slot, so we
1001 must leave it empty. */
1002 write_1_short (opcode1, insn1, fx->next, FALSE);
1003 return 1;
1004 }
1005 else if (opcode1->op->unit == IU)
1006 {
1007 if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1008 {
1009 /* Case 103810 is a request from Mitsubishi that opcodes
1010 with EITHER_BUT_PREFER_MU should not be executed in
1011 reverse sequential order. */
1012 write_1_short (opcode1, insn1, fx->next, FALSE);
1013 return 1;
1014 }
81d4177b 1015
ea1562b3
NC
1016 /* Reverse sequential. */
1017 insn = FM10 | (insn2 << 32) | insn1;
1018 exec_type = EXEC_REVSEQ;
1019 }
1020 else
252b5132 1021 {
ea1562b3
NC
1022 /* Sequential. */
1023 insn = FM01 | (insn1 << 32) | insn2;
1024 fx = fx->next;
1025 exec_type = EXEC_SEQ;
1026 }
1027 break;
2fd5405a 1028
ea1562b3
NC
1029 case EXEC_PARALLEL: /* Parallel. */
1030 flag_explicitly_parallel = flag_xp_state;
1031 if (! parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
1032 as_bad (_("Instructions may not be executed in parallel"));
1033 else if (opcode1->op->unit == IU)
1034 {
1035 if (opcode2->op->unit == IU)
1036 as_bad (_("Two IU instructions may not be executed in parallel"));
1037 as_warn (_("Swapping instruction order"));
1038 insn = FM00 | (insn2 << 32) | insn1;
1039 }
1040 else if (opcode2->op->unit == MU)
1041 {
1042 if (opcode1->op->unit == MU)
1043 as_bad (_("Two MU instructions may not be executed in parallel"));
1044 else if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
1045 as_warn (_("Executing %s in IU may not work"), opcode1->op->name);
1046 as_warn (_("Swapping instruction order"));
1047 insn = FM00 | (insn2 << 32) | insn1;
1048 }
1049 else
1050 {
1051 if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1052 as_warn (_("Executing %s in IU may not work in parallel execution"),
1053 opcode2->op->name);
2fd5405a 1054
ea1562b3
NC
1055 insn = FM00 | (insn1 << 32) | insn2;
1056 fx = fx->next;
252b5132 1057 }
ea1562b3
NC
1058 flag_explicitly_parallel = 0;
1059 break;
252b5132 1060
ea1562b3
NC
1061 case EXEC_SEQ: /* Sequential. */
1062 if (opcode1->op->unit == IU)
1063 as_bad (_("IU instruction may not be in the left container"));
1064 if (prev_left_kills_right_p)
1065 as_bad (_("special left instruction `%s' kills instruction "
1066 "`%s' in right container"),
1067 opcode1->op->name, opcode2->op->name);
1068 insn = FM01 | (insn1 << 32) | insn2;
1069 fx = fx->next;
1070 break;
252b5132 1071
ea1562b3
NC
1072 case EXEC_REVSEQ: /* Reverse sequential. */
1073 if (opcode2->op->unit == MU)
1074 as_bad (_("MU instruction may not be in the right container"));
1075 if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
1076 as_warn (_("Executing %s in reverse serial with %s may not work"),
1077 opcode1->op->name, opcode2->op->name);
1078 else if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1079 as_warn (_("Executing %s in IU in reverse serial may not work"),
1080 opcode2->op->name);
1081 insn = FM10 | (insn1 << 32) | insn2;
1082 fx = fx->next;
1083 break;
1084
1085 default:
1086 as_fatal (_("unknown execution type passed to write_2_short()"));
252b5132
RH
1087 }
1088
ea1562b3
NC
1089 f = frag_more (8);
1090 d30v_number_to_chars (f, insn, 8);
1091
1092 /* If the previous instruction was a 32-bit multiply but it is put into a
1093 parallel container, mark the current instruction as being a 32-bit
1094 multiply. */
1095 if (prev_mul32_p && exec_type == EXEC_PARALLEL)
1096 cur_mul32_p = 1;
1097
1098 for (j = 0; j < 2; j++)
252b5132 1099 {
ea1562b3 1100 for (i = 0; i < fx->fc; i++)
252b5132 1101 {
ea1562b3 1102 if (fx->fix[i].reloc)
252b5132 1103 {
ea1562b3 1104 where = (f - frag_now->fr_literal) + 4 * j;
2fd5405a 1105
ea1562b3
NC
1106 fix_new_exp (frag_now,
1107 where,
1108 fx->fix[i].size,
1109 &(fx->fix[i].exp),
1110 fx->fix[i].pcrel,
1111 fx->fix[i].reloc);
252b5132 1112 }
252b5132 1113 }
ea1562b3
NC
1114
1115 fx->fc = 0;
1116 fx = fx->next;
252b5132 1117 }
2fd5405a 1118
ea1562b3
NC
1119 return 0;
1120}
252b5132 1121
ea1562b3
NC
1122/* Get a pointer to an entry in the format table.
1123 It must look at all formats for an opcode and use the operands
1124 to choose the correct one. Return NULL on error. */
1125
1126static struct d30v_format *
1127find_format (struct d30v_opcode *opcode,
1128 expressionS myops[],
1129 int fsize,
1130 int cmp_hack)
1131{
1132 int numops, match, index, i = 0, j, k;
1133 struct d30v_format *fm;
1134
1135 if (opcode == NULL)
1136 return NULL;
1137
1138 /* Get all the operands and save them as expressions. */
1139 numops = get_operands (myops, cmp_hack);
1140
1141 while ((index = opcode->format[i++]) != 0)
252b5132 1142 {
ea1562b3
NC
1143 if (fsize == FORCE_SHORT && index >= LONG)
1144 continue;
2fd5405a 1145
ea1562b3
NC
1146 if (fsize == FORCE_LONG && index < LONG)
1147 continue;
1148
1149 fm = (struct d30v_format *) &d30v_format_table[index];
1150 k = index;
1151 while (fm->form == index)
1152 {
1153 match = 1;
1154 /* Now check the operands for compatibility. */
1155 for (j = 0; match && fm->operands[j]; j++)
1156 {
1157 int flags = d30v_operand_table[fm->operands[j]].flags;
1158 int bits = d30v_operand_table[fm->operands[j]].bits;
1159 int X_op = myops[j].X_op;
1160 int num = myops[j].X_add_number;
1161
1162 if (flags & OPERAND_SPECIAL)
1163 break;
1164 else if (X_op == O_illegal)
1165 match = 0;
1166 else if (flags & OPERAND_REG)
1167 {
1168 if (X_op != O_register
1169 || ((flags & OPERAND_ACC) && !(num & OPERAND_ACC))
1170 || (!(flags & OPERAND_ACC) && (num & OPERAND_ACC))
1171 || ((flags & OPERAND_FLAG) && !(num & OPERAND_FLAG))
1172 || (!(flags & (OPERAND_FLAG | OPERAND_CONTROL)) && (num & OPERAND_FLAG))
1173 || ((flags & OPERAND_CONTROL)
1174 && !(num & (OPERAND_CONTROL | OPERAND_FLAG))))
1175 match = 0;
1176 }
1177 else if (((flags & OPERAND_MINUS)
1178 && (X_op != O_absent || num != OPERAND_MINUS))
1179 || ((flags & OPERAND_PLUS)
1180 && (X_op != O_absent || num != OPERAND_PLUS))
1181 || ((flags & OPERAND_ATMINUS)
1182 && (X_op != O_absent || num != OPERAND_ATMINUS))
1183 || ((flags & OPERAND_ATPAR)
1184 && (X_op != O_absent || num != OPERAND_ATPAR))
1185 || ((flags & OPERAND_ATSIGN)
1186 && (X_op != O_absent || num != OPERAND_ATSIGN)))
1187 match = 0;
1188 else if (flags & OPERAND_NUM)
1189 {
1190 /* A number can be a constant or symbol expression. */
1191
1192 /* If we have found a register name, but that name
1193 also matches a symbol, then re-parse the name as
1194 an expression. */
1195 if (X_op == O_register
1196 && symbol_find ((char *) myops[j].X_op_symbol))
1197 {
1198 input_line_pointer = (char *) myops[j].X_op_symbol;
1199 expression (&myops[j]);
1200 }
1201
1202 /* Turn an expression into a symbol for later resolution. */
1203 if (X_op != O_absent && X_op != O_constant
1204 && X_op != O_symbol && X_op != O_register
1205 && X_op != O_big)
1206 {
1207 symbolS *sym = make_expr_symbol (&myops[j]);
1208 myops[j].X_op = X_op = O_symbol;
1209 myops[j].X_add_symbol = sym;
1210 myops[j].X_add_number = num = 0;
1211 }
1212
1213 if (fm->form >= LONG)
1214 {
1215 /* If we're testing for a LONG format, either fits. */
1216 if (X_op != O_constant && X_op != O_symbol)
1217 match = 0;
1218 }
1219 else if (fm->form < LONG
1220 && ((fsize == FORCE_SHORT && X_op == O_symbol)
1221 || (fm->form == SHORT_D2 && j == 0)))
1222 match = 1;
1223
1224 /* This is the tricky part. Will the constant or symbol
1225 fit into the space in the current format? */
1226 else if (X_op == O_constant)
1227 {
1228 if (check_range (num, bits, flags))
1229 match = 0;
1230 }
1231 else if (X_op == O_symbol
1232 && S_IS_DEFINED (myops[j].X_add_symbol)
1233 && S_GET_SEGMENT (myops[j].X_add_symbol) == now_seg
1234 && opcode->reloc_flag == RELOC_PCREL)
1235 {
1236 /* If the symbol is defined, see if the value will fit
1237 into the form we're considering. */
1238 fragS *f;
1239 long value;
1240
1241 /* Calculate the current address by running through the
1242 previous frags and adding our current offset. */
1243 value = 0;
1244 for (f = frchain_now->frch_root; f; f = f->fr_next)
1245 value += f->fr_fix + f->fr_offset;
1246 value = (S_GET_VALUE (myops[j].X_add_symbol) - value
1247 - (obstack_next_free (&frchain_now->frch_obstack)
1248 - frag_now->fr_literal));
1249 if (check_range (value, bits, flags))
1250 match = 0;
1251 }
1252 else
1253 match = 0;
1254 }
1255 }
1256 /* We're only done if the operands matched so far AND there
1257 are no more to check. */
1258 if (match && myops[j].X_op == 0)
1259 {
1260 /* Final check - issue a warning if an odd numbered register
1261 is used as the first register in an instruction that reads
1262 or writes 2 registers. */
1263
1264 for (j = 0; fm->operands[j]; j++)
1265 if (myops[j].X_op == O_register
1266 && (myops[j].X_add_number & 1)
1267 && (d30v_operand_table[fm->operands[j]].flags & OPERAND_2REG))
1268 as_warn (_("Odd numbered register used as target of multi-register instruction"));
1269
1270 return fm;
1271 }
1272 fm = (struct d30v_format *) &d30v_format_table[++k];
1273 }
252b5132 1274 }
ea1562b3 1275 return NULL;
252b5132
RH
1276}
1277
2fd5405a
NC
1278/* Assemble a single instruction and return an opcode.
1279 Return -1 (an invalid opcode) on error. */
252b5132
RH
1280
1281#define NAME_BUF_LEN 20
1282
1283static long long
ea1562b3
NC
1284do_assemble (char *str,
1285 struct d30v_insn *opcode,
1286 int shortp,
1287 int is_parallel)
252b5132 1288{
2132e3a3
AM
1289 char *op_start;
1290 char *save;
1291 char *op_end;
2fd5405a
NC
1292 char name[NAME_BUF_LEN];
1293 int cmp_hack;
1294 int nlen = 0;
1295 int fsize = (shortp ? FORCE_SHORT : 0);
1296 expressionS myops[6];
1297 long long insn;
1298
1299 /* Drop leading whitespace. */
1300 while (*str == ' ')
1301 str++;
1302
1303 /* Find the opcode end. */
2132e3a3 1304 for (op_start = op_end = str;
2fd5405a 1305 *op_end
252b5132 1306 && nlen < (NAME_BUF_LEN - 1)
2fd5405a 1307 && *op_end != '/'
2132e3a3 1308 && !is_end_of_line[(unsigned char) *op_end] && *op_end != ' ';
252b5132
RH
1309 op_end++)
1310 {
3882b010 1311 name[nlen] = TOLOWER (op_start[nlen]);
252b5132
RH
1312 nlen++;
1313 }
1314
1315 if (nlen == 0)
1316 return -1;
1317
1318 name[nlen] = 0;
1319
2fd5405a 1320 /* If there is an execution condition code, handle it. */
252b5132
RH
1321 if (*op_end == '/')
1322 {
1323 int i = 0;
2fd5405a 1324 while ((i < ECC_MAX) && strncasecmp (d30v_ecc_names[i], op_end + 1, 2))
252b5132 1325 i++;
2fd5405a 1326
252b5132
RH
1327 if (i == ECC_MAX)
1328 {
1329 char tmp[4];
1330 strncpy (tmp, op_end + 1, 2);
1331 tmp[2] = 0;
2fd5405a 1332 as_bad (_("unknown condition code: %s"), tmp);
252b5132
RH
1333 return -1;
1334 }
252b5132
RH
1335 opcode->ecc = i;
1336 op_end += 3;
1337 }
1338 else
1339 opcode->ecc = ECC_AL;
252b5132 1340
2fd5405a 1341 /* CMP and CMPU change their name based on condition codes. */
252b5132
RH
1342 if (!strncmp (name, "cmp", 3))
1343 {
2fd5405a
NC
1344 int p, i;
1345 char **str = (char **) d30v_cc_names;
252b5132
RH
1346 if (name[3] == 'u')
1347 p = 4;
1348 else
1349 p = 3;
1350
2fd5405a 1351 for (i = 1; *str && strncmp (*str, &name[p], 2); i++, str++)
252b5132
RH
1352 ;
1353
2fd5405a 1354 /* cmpu only supports some condition codes. */
252b5132
RH
1355 if (p == 4)
1356 {
1357 if (i < 3 || i > 6)
1358 {
2fd5405a
NC
1359 name[p + 2] = 0;
1360 as_bad (_("cmpu doesn't support condition code %s"), &name[p]);
252b5132
RH
1361 }
1362 }
1363
1364 if (!*str)
1365 {
2fd5405a
NC
1366 name[p + 2] = 0;
1367 as_bad (_("unknown condition code: %s"), &name[p]);
252b5132 1368 }
2fd5405a 1369
252b5132
RH
1370 cmp_hack = i;
1371 name[p] = 0;
1372 }
1373 else
1374 cmp_hack = 0;
252b5132 1375
2fd5405a
NC
1376 /* Need to look for .s or .l. */
1377 if (name[nlen - 2] == '.')
252b5132 1378 {
2fd5405a 1379 switch (name[nlen - 1])
252b5132
RH
1380 {
1381 case 's':
1382 fsize = FORCE_SHORT;
1383 break;
1384 case 'l':
1385 fsize = FORCE_LONG;
1386 break;
1387 }
2fd5405a 1388 name[nlen - 2] = 0;
252b5132
RH
1389 }
1390
2fd5405a
NC
1391 /* Find the first opcode with the proper name. */
1392 opcode->op = (struct d30v_opcode *) hash_find (d30v_hash, name);
252b5132
RH
1393 if (opcode->op == NULL)
1394 {
2fd5405a 1395 as_bad (_("unknown opcode: %s"), name);
252b5132
RH
1396 return -1;
1397 }
1398
1399 save = input_line_pointer;
1400 input_line_pointer = op_end;
1401 while (!(opcode->form = find_format (opcode->op, myops, fsize, cmp_hack)))
1402 {
1403 opcode->op++;
1404 if (opcode->op->name == NULL || strcmp (opcode->op->name, name))
1405 {
2fd5405a
NC
1406 as_bad (_("operands for opcode `%s' do not match any valid format"),
1407 name);
252b5132
RH
1408 return -1;
1409 }
1410 }
1411 input_line_pointer = save;
1412
2fd5405a 1413 insn = build_insn (opcode, myops);
252b5132 1414
2d2255b5 1415 /* Propagate multiply status. */
252b5132
RH
1416 if (insn != -1)
1417 {
1418 if (is_parallel && prev_mul32_p)
1419 cur_mul32_p = 1;
1420 else
1421 {
1422 prev_mul32_p = cur_mul32_p;
1423 cur_mul32_p = (opcode->op->flags_used & FLAG_MUL32) != 0;
1424 }
1425 }
1426
2fd5405a 1427 /* Propagate left_kills_right status. */
252b5132
RH
1428 if (insn != -1)
1429 {
1430 prev_left_kills_right_p = cur_left_kills_right_p;
1431
1432 if (opcode->op->flags_set & FLAG_LKR)
1433 {
1434 cur_left_kills_right_p = 1;
2fd5405a 1435
252b5132
RH
1436 if (strcmp (opcode->op->name, "mvtsys") == 0)
1437 {
2fd5405a
NC
1438 /* Left kills right for only mvtsys only for
1439 PSW/PSWH/PSWL/flags target. */
252b5132
RH
1440 if ((myops[0].X_op == O_register) &&
1441 ((myops[0].X_add_number == OPERAND_CONTROL) || /* psw */
1442 (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+2) || /* pswh */
1443 (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+1) || /* pswl */
1444 (myops[0].X_add_number == OPERAND_FLAG+0) || /* f0 */
1445 (myops[0].X_add_number == OPERAND_FLAG+1) || /* f1 */
1446 (myops[0].X_add_number == OPERAND_FLAG+2) || /* f2 */
1447 (myops[0].X_add_number == OPERAND_FLAG+3) || /* f3 */
1448 (myops[0].X_add_number == OPERAND_FLAG+4) || /* f4 */
1449 (myops[0].X_add_number == OPERAND_FLAG+5) || /* f5 */
1450 (myops[0].X_add_number == OPERAND_FLAG+6) || /* f6 */
1451 (myops[0].X_add_number == OPERAND_FLAG+7))) /* f7 */
1452 {
1453 cur_left_kills_right_p = 1;
1454 }
1455 else
1456 {
2fd5405a
NC
1457 /* Other mvtsys target registers don't kill right
1458 instruction. */
252b5132
RH
1459 cur_left_kills_right_p = 0;
1460 }
1461 } /* mvtsys */
1462 }
1463 else
1464 cur_left_kills_right_p = 0;
1465 }
1466
1467 return insn;
1468}
1469
ea1562b3
NC
1470/* Called internally to handle all alignment needs. This takes care
1471 of eliding calls to frag_align if'n the cached current alignment
1472 says we've already got it, as well as taking care of the auto-aligning
1473 labels wrt code. */
252b5132 1474
ea1562b3
NC
1475static void
1476d30v_align (int n, char *pfill, symbolS *label)
252b5132 1477{
ea1562b3
NC
1478 /* The front end is prone to changing segments out from under us
1479 temporarily when -g is in effect. */
1480 int switched_seg_p = (d30v_current_align_seg != now_seg);
2fd5405a 1481
ea1562b3
NC
1482 /* Do not assume that if 'd30v_current_align >= n' and
1483 '! switched_seg_p' that it is safe to avoid performing
1484 this alignment request. The alignment of the current frag
1485 can be changed under our feet, for example by a .ascii
1486 directive in the source code. cf testsuite/gas/d30v/reloc.s */
1487 d30v_cleanup (FALSE);
252b5132 1488
ea1562b3 1489 if (pfill == NULL)
252b5132 1490 {
ea1562b3
NC
1491 if (n > 2
1492 && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
1493 {
1494 static char const nop[4] = { 0x00, 0xf0, 0x00, 0x00 };
252b5132 1495
ea1562b3
NC
1496 /* First, make sure we're on a four-byte boundary, in case
1497 someone has been putting .byte values the text section. */
1498 if (d30v_current_align < 2 || switched_seg_p)
1499 frag_align (2, 0, 0);
1500 frag_align_pattern (n, nop, sizeof nop, 0);
1501 }
1502 else
1503 frag_align (n, 0, 0);
1504 }
1505 else
1506 frag_align (n, *pfill, 0);
252b5132 1507
ea1562b3
NC
1508 if (!switched_seg_p)
1509 d30v_current_align = n;
2fd5405a 1510
ea1562b3
NC
1511 if (label != NULL)
1512 {
1513 symbolS *sym;
1514 int label_seen = FALSE;
1515 struct frag *old_frag;
1516 valueT old_value;
1517 valueT new_value;
252b5132 1518
9c2799c2 1519 gas_assert (S_GET_SEGMENT (label) == now_seg);
2fd5405a 1520
ea1562b3
NC
1521 old_frag = symbol_get_frag (label);
1522 old_value = S_GET_VALUE (label);
1523 new_value = (valueT) frag_now_fix ();
252b5132 1524
ea1562b3
NC
1525 /* It is possible to have more than one label at a particular
1526 address, especially if debugging is enabled, so we must
1527 take care to adjust all the labels at this address in this
1528 fragment. To save time we search from the end of the symbol
1529 list, backwards, since the symbols we are interested in are
1530 almost certainly the ones that were most recently added.
1531 Also to save time we stop searching once we have seen at least
1532 one matching label, and we encounter a label that is no longer
1533 in the target fragment. Note, this search is guaranteed to
1534 find at least one match when sym == label, so no special case
1535 code is necessary. */
1536 for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
1537 {
1538 if (symbol_get_frag (sym) == old_frag
1539 && S_GET_VALUE (sym) == old_value)
1540 {
1541 label_seen = TRUE;
1542 symbol_set_frag (sym, frag_now);
1543 S_SET_VALUE (sym, new_value);
1544 }
1545 else if (label_seen && symbol_get_frag (sym) != old_frag)
1546 break;
1547 }
1548 }
2fd5405a 1549
ea1562b3
NC
1550 record_alignment (now_seg, n);
1551}
252b5132 1552
ea1562b3
NC
1553/* This is the main entry point for the machine-dependent assembler.
1554 STR points to a machine-dependent instruction. This function is
1555 supposed to emit the frags/bytes it assembles to. For the D30V, it
1556 mostly handles the special VLIW parsing and packing and leaves the
1557 difficult stuff to do_assemble (). */
1558
1559static long long prev_insn = -1;
1560static struct d30v_insn prev_opcode;
1561static subsegT prev_subseg;
1562static segT prev_seg = 0;
1563
1564void
1565md_assemble (char *str)
1566{
1567 struct d30v_insn opcode;
1568 long long insn;
1569 /* Execution type; parallel, etc. */
1570 exec_type_enum extype = EXEC_UNKNOWN;
1571 /* Saved extype. Used for multiline instructions. */
1572 static exec_type_enum etype = EXEC_UNKNOWN;
1573 char *str2;
1574
1575 if ((prev_insn != -1) && prev_seg
1576 && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1577 d30v_cleanup (FALSE);
1578
1579 if (d30v_current_align < 3)
1580 d30v_align (3, NULL, d30v_last_label);
1581 else if (d30v_current_align > 3)
1582 d30v_current_align = 3;
1583 d30v_last_label = NULL;
1584
1585 flag_explicitly_parallel = 0;
1586 flag_xp_state = 0;
1587 if (etype == EXEC_UNKNOWN)
1588 {
1589 /* Look for the special multiple instruction separators. */
1590 str2 = strstr (str, "||");
1591 if (str2)
1592 {
1593 extype = EXEC_PARALLEL;
1594 flag_xp_state = 1;
1595 }
1596 else
1597 {
1598 str2 = strstr (str, "->");
1599 if (str2)
1600 extype = EXEC_SEQ;
1601 else
1602 {
1603 str2 = strstr (str, "<-");
1604 if (str2)
1605 extype = EXEC_REVSEQ;
1606 }
1607 }
1608
1609 /* STR2 points to the separator, if one. */
1610 if (str2)
1611 {
1612 *str2 = 0;
1613
1614 /* If two instructions are present and we already have one saved,
1615 then first write it out. */
1616 d30v_cleanup (FALSE);
1617
1618 /* Assemble first instruction and save it. */
1619 prev_insn = do_assemble (str, &prev_opcode, 1, 0);
1620 if (prev_insn == -1)
1621 as_bad (_("Cannot assemble instruction"));
1622 if (prev_opcode.form != NULL && prev_opcode.form->form >= LONG)
1623 as_bad (_("First opcode is long. Unable to mix instructions as specified."));
1624 fixups = fixups->next;
1625 str = str2 + 2;
1626 prev_seg = now_seg;
1627 prev_subseg = now_subseg;
1628 }
1629 }
1630
1631 insn = do_assemble (str, &opcode,
1632 (extype != EXEC_UNKNOWN || etype != EXEC_UNKNOWN),
1633 extype == EXEC_PARALLEL);
1634 if (insn == -1)
1635 {
1636 if (extype != EXEC_UNKNOWN)
1637 etype = extype;
1638 as_bad (_("Cannot assemble instruction"));
1639 return;
1640 }
1641
1642 if (etype != EXEC_UNKNOWN)
1643 {
1644 extype = etype;
1645 etype = EXEC_UNKNOWN;
1646 }
1647
1648 /* Word multiply instructions must not be followed by either a load or a
1649 16-bit multiply instruction in the next cycle. */
1650 if ( (extype != EXEC_REVSEQ)
1651 && prev_mul32_p
1652 && (opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1653 {
1654 /* However, load and multiply should able to be combined in a parallel
1655 operation, so check for that first. */
1656 if (prev_insn != -1
1657 && (opcode.op->flags_used & FLAG_MEM)
1658 && opcode.form->form < LONG
1659 && (extype == EXEC_PARALLEL || (Optimizing && extype == EXEC_UNKNOWN))
1660 && parallel_ok (&prev_opcode, (long) prev_insn,
1661 &opcode, (long) insn, extype)
1662 && write_2_short (&prev_opcode, (long) prev_insn,
1663 &opcode, (long) insn, extype, fixups) == 0)
1664 {
1665 /* No instructions saved. */
1666 prev_insn = -1;
1667 return;
1668 }
1669 else
1670 {
1671 /* Can't parallelize, flush previous instruction and emit a
1672 word of NOPS, unless the previous instruction is a NOP,
1673 in which case just flush it, as this will generate a word
1674 of NOPs for us. */
1675
1676 if (prev_insn != -1 && (strcmp (prev_opcode.op->name, "nop") == 0))
1677 d30v_cleanup (FALSE);
1678 else
1679 {
1680 char *f;
1681
1682 if (prev_insn != -1)
1683 d30v_cleanup (TRUE);
1684 else
1685 {
1686 f = frag_more (8);
1687 d30v_number_to_chars (f, NOP2, 8);
1688
1689 if (warn_nops == NOP_ALL || warn_nops == NOP_MULTIPLY)
1690 {
1691 if (opcode.op->flags_used & FLAG_MEM)
1692 as_warn (_("word of NOPs added between word multiply and load"));
1693 else
1694 as_warn (_("word of NOPs added between word multiply and 16-bit multiply"));
252b5132 1695 }
252b5132
RH
1696 }
1697 }
252b5132 1698
ea1562b3
NC
1699 extype = EXEC_UNKNOWN;
1700 }
1701 }
1702 else if ( (extype == EXEC_REVSEQ)
1703 && cur_mul32_p
1704 && (prev_opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1705 {
1706 /* Can't parallelize, flush current instruction and add a
1707 sequential NOP. */
1708 write_1_short (&opcode, (long) insn, fixups->next->next, TRUE);
1709
1710 /* Make the previous instruction the current one. */
1711 extype = EXEC_UNKNOWN;
1712 insn = prev_insn;
1713 now_seg = prev_seg;
1714 now_subseg = prev_subseg;
1715 prev_insn = -1;
1716 cur_mul32_p = prev_mul32_p;
1717 prev_mul32_p = 0;
1718 memcpy (&opcode, &prev_opcode, sizeof (prev_opcode));
1719 }
1720
1721 /* If this is a long instruction, write it and any previous short
1722 instruction. */
1723 if (opcode.form->form >= LONG)
1724 {
1725 if (extype != EXEC_UNKNOWN)
1726 as_bad (_("Instruction uses long version, so it cannot be mixed as specified"));
1727 d30v_cleanup (FALSE);
1728 write_long (&opcode, insn, fixups);
1729 prev_insn = -1;
1730 }
1731 else if ((prev_insn != -1)
1732 && (write_2_short
1733 (&prev_opcode, (long) prev_insn, &opcode,
1734 (long) insn, extype, fixups) == 0))
1735 {
1736 /* No instructions saved. */
1737 prev_insn = -1;
1738 }
1739 else
1740 {
1741 if (extype != EXEC_UNKNOWN)
1742 as_bad (_("Unable to mix instructions as specified"));
1743
1744 /* Save off last instruction so it may be packed on next pass. */
1745 memcpy (&prev_opcode, &opcode, sizeof (prev_opcode));
1746 prev_insn = insn;
1747 prev_seg = now_seg;
1748 prev_subseg = now_subseg;
1749 fixups = fixups->next;
1750 prev_mul32_p = cur_mul32_p;
1751 }
1752}
1753
1754/* If while processing a fixup, a reloc really needs to be created,
1755 then it is done here. */
1756
1757arelent *
1758tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1759{
1760 arelent *reloc;
1761 reloc = xmalloc (sizeof (arelent));
1762 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1763 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1764 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1765 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1766 if (reloc->howto == NULL)
1767 {
1768 as_bad_where (fixp->fx_file, fixp->fx_line,
1769 _("reloc %d not supported by object file format"),
1770 (int) fixp->fx_r_type);
1771 return NULL;
1772 }
1773
1774 reloc->addend = 0;
1775 return reloc;
1776}
1777
1778int
1779md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1780 asection *seg ATTRIBUTE_UNUSED)
1781{
1782 abort ();
1783 return 0;
1784}
1785
1786long
1787md_pcrel_from_section (fixS *fixp, segT sec)
1788{
1789 if (fixp->fx_addsy != (symbolS *) NULL
1790 && (!S_IS_DEFINED (fixp->fx_addsy)
1791 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1792 return 0;
1793 return fixp->fx_frag->fr_address + fixp->fx_where;
1794}
1795
1796/* Called after the assembler has finished parsing the input file or
1797 after a label is defined. Because the D30V assembler sometimes
1798 saves short instructions to see if it can package them with the
1799 next instruction, there may be a short instruction that still needs
1800 written. */
1801
1802int
1803d30v_cleanup (int use_sequential)
1804{
1805 segT seg;
1806 subsegT subseg;
1807
1808 if (prev_insn != -1)
1809 {
1810 seg = now_seg;
1811 subseg = now_subseg;
1812 subseg_set (prev_seg, prev_subseg);
1813 write_1_short (&prev_opcode, (long) prev_insn, fixups->next,
1814 use_sequential);
1815 subseg_set (seg, subseg);
1816 prev_insn = -1;
1817 if (use_sequential)
1818 prev_mul32_p = FALSE;
1819 }
1820
1821 return 1;
1822}
1823
1824/* This function is called at the start of every line. It checks to
1825 see if the first character is a '.', which indicates the start of a
1826 pseudo-op. If it is, then write out any unwritten instructions. */
1827
1828void
1829d30v_start_line (void)
1830{
1831 char *c = input_line_pointer;
1832
1833 while (ISSPACE (*c))
1834 c++;
1835
1836 if (*c == '.')
1837 d30v_cleanup (FALSE);
1838}
1839
1840static void
1841check_size (long value, int bits, char *file, int line)
1842{
1843 int tmp, max;
1844
1845 if (value < 0)
1846 tmp = ~value;
1847 else
1848 tmp = value;
1849
1850 max = (1 << (bits - 1)) - 1;
2fd5405a 1851
ea1562b3
NC
1852 if (tmp > max)
1853 as_bad_where (file, line, _("value too large to fit in %d bits"), bits);
252b5132
RH
1854}
1855
ea1562b3 1856/* d30v_frob_label() is called when after a label is recognized. */
2fd5405a 1857
ea1562b3
NC
1858void
1859d30v_frob_label (symbolS *lab)
252b5132 1860{
ea1562b3
NC
1861 /* Emit any pending instructions. */
1862 d30v_cleanup (FALSE);
a161fe53 1863
ea1562b3
NC
1864 /* Update the label's address with the current output pointer. */
1865 symbol_set_frag (lab, frag_now);
1866 S_SET_VALUE (lab, (valueT) frag_now_fix ());
252b5132 1867
ea1562b3
NC
1868 /* Record this label for future adjustment after we find out what
1869 kind of data it references, and the required alignment therewith. */
1870 d30v_last_label = lab;
2fd5405a 1871}
252b5132 1872
ea1562b3
NC
1873/* Hook into cons for capturing alignment changes. */
1874
1875void
1876d30v_cons_align (int size)
252b5132 1877{
ea1562b3
NC
1878 int log_size;
1879
1880 log_size = 0;
1881 while ((size >>= 1) != 0)
1882 ++log_size;
1883
1884 if (d30v_current_align < log_size)
1885 d30v_align (log_size, (char *) NULL, NULL);
1886 else if (d30v_current_align > log_size)
1887 d30v_current_align = log_size;
1888 d30v_last_label = NULL;
252b5132
RH
1889}
1890
94f592af 1891void
55cf6793 1892md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 1893{
2fd5405a 1894 char *where;
252b5132 1895 unsigned long insn, insn2;
a161fe53 1896 long value = *valP;
94f592af
NC
1897
1898 if (fixP->fx_addsy == (symbolS *) NULL)
1899 fixP->fx_done = 1;
1900
a161fe53
AM
1901 /* We don't support subtracting a symbol. */
1902 if (fixP->fx_subsy != (symbolS *) NULL)
1903 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
2fd5405a 1904
252b5132
RH
1905 /* Fetch the instruction, insert the fully resolved operand
1906 value, and stuff the instruction back again. */
94f592af 1907 where = fixP->fx_frag->fr_literal + fixP->fx_where;
252b5132 1908 insn = bfd_getb32 ((unsigned char *) where);
2fd5405a 1909
94f592af 1910 switch (fixP->fx_r_type)
252b5132
RH
1911 {
1912 case BFD_RELOC_8: /* Check for a bad .byte directive. */
94f592af 1913 if (fixP->fx_addsy != NULL)
252b5132 1914 as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
94f592af 1915 fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
252b5132 1916 else if (((unsigned)value) > 0xff)
ebf19f1b 1917 as_bad (_("line %d: unable to place value %lx into a byte"),
94f592af 1918 fixP->fx_line, value);
252b5132 1919 else
2fd5405a 1920 *(unsigned char *) where = value;
252b5132 1921 break;
2fd5405a 1922
252b5132 1923 case BFD_RELOC_16: /* Check for a bad .short directive. */
94f592af 1924 if (fixP->fx_addsy != NULL)
252b5132 1925 as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
94f592af 1926 fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
252b5132 1927 else if (((unsigned)value) > 0xffff)
ebf19f1b 1928 as_bad (_("line %d: unable to place value %lx into a short"),
94f592af 1929 fixP->fx_line, value);
252b5132
RH
1930 else
1931 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1932 break;
2fd5405a 1933
252b5132 1934 case BFD_RELOC_64: /* Check for a bad .quad directive. */
94f592af 1935 if (fixP->fx_addsy != NULL)
252b5132 1936 as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
94f592af 1937 fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
252b5132
RH
1938 else
1939 {
1940 bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1941 bfd_putb32 (0, ((unsigned char *) where) + 4);
1942 }
1943 break;
2fd5405a 1944
252b5132 1945 case BFD_RELOC_D30V_6:
94f592af 1946 check_size (value, 6, fixP->fx_file, fixP->fx_line);
252b5132
RH
1947 insn |= value & 0x3F;
1948 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1949 break;
1950
1951 case BFD_RELOC_D30V_9_PCREL:
94f592af 1952 if (fixP->fx_where & 0x7)
252b5132 1953 {
94f592af 1954 if (fixP->fx_done)
252b5132
RH
1955 value += 4;
1956 else
94f592af 1957 fixP->fx_r_type = BFD_RELOC_D30V_9_PCREL_R;
252b5132 1958 }
94f592af 1959 check_size (value, 9, fixP->fx_file, fixP->fx_line);
252b5132
RH
1960 insn |= ((value >> 3) & 0x3F) << 12;
1961 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1962 break;
1963
1964 case BFD_RELOC_D30V_15:
94f592af 1965 check_size (value, 15, fixP->fx_file, fixP->fx_line);
252b5132
RH
1966 insn |= (value >> 3) & 0xFFF;
1967 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1968 break;
1969
1970 case BFD_RELOC_D30V_15_PCREL:
94f592af 1971 if (fixP->fx_where & 0x7)
252b5132 1972 {
94f592af 1973 if (fixP->fx_done)
252b5132
RH
1974 value += 4;
1975 else
94f592af 1976 fixP->fx_r_type = BFD_RELOC_D30V_15_PCREL_R;
252b5132 1977 }
94f592af 1978 check_size (value, 15, fixP->fx_file, fixP->fx_line);
252b5132
RH
1979 insn |= (value >> 3) & 0xFFF;
1980 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1981 break;
1982
1983 case BFD_RELOC_D30V_21:
94f592af 1984 check_size (value, 21, fixP->fx_file, fixP->fx_line);
252b5132
RH
1985 insn |= (value >> 3) & 0x3FFFF;
1986 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1987 break;
1988
1989 case BFD_RELOC_D30V_21_PCREL:
94f592af 1990 if (fixP->fx_where & 0x7)
252b5132 1991 {
94f592af 1992 if (fixP->fx_done)
252b5132
RH
1993 value += 4;
1994 else
94f592af 1995 fixP->fx_r_type = BFD_RELOC_D30V_21_PCREL_R;
252b5132 1996 }
94f592af 1997 check_size (value, 21, fixP->fx_file, fixP->fx_line);
252b5132
RH
1998 insn |= (value >> 3) & 0x3FFFF;
1999 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2000 break;
2001
2002 case BFD_RELOC_D30V_32:
2003 insn2 = bfd_getb32 ((unsigned char *) where + 4);
2fd5405a
NC
2004 insn |= (value >> 26) & 0x3F; /* Top 6 bits. */
2005 insn2 |= ((value & 0x03FC0000) << 2); /* Next 8 bits. */
2006 insn2 |= value & 0x0003FFFF; /* Bottom 18 bits. */
252b5132
RH
2007 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2008 bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
2009 break;
2010
2011 case BFD_RELOC_D30V_32_PCREL:
2012 insn2 = bfd_getb32 ((unsigned char *) where + 4);
81d4177b
KH
2013 insn |= (value >> 26) & 0x3F; /* Top 6 bits. */
2014 insn2 |= ((value & 0x03FC0000) << 2); /* Next 8 bits. */
2015 insn2 |= value & 0x0003FFFF; /* Bottom 18 bits. */
252b5132
RH
2016 bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2017 bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
2018 break;
2019
2020 case BFD_RELOC_32:
2021 bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
2022 break;
2023
2024 default:
2025 as_bad (_("line %d: unknown relocation type: 0x%x"),
94f592af 2026 fixP->fx_line, fixP->fx_r_type);
252b5132 2027 }
252b5132
RH
2028}
2029
252b5132
RH
2030/* Handle the .align pseudo-op. This aligns to a power of two. We
2031 hook here to latch the current alignment. */
2032
2033static void
ea1562b3 2034s_d30v_align (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
2035{
2036 int align;
2037 char fill, *pfill = NULL;
2038 long max_alignment = 15;
2039
2040 align = get_absolute_expression ();
2041 if (align > max_alignment)
2042 {
2043 align = max_alignment;
2044 as_warn (_("Alignment too large: %d assumed"), align);
2045 }
2046 else if (align < 0)
2047 {
2048 as_warn (_("Alignment negative: 0 assumed"));
2049 align = 0;
2050 }
2051
2052 if (*input_line_pointer == ',')
2053 {
2054 input_line_pointer++;
2055 fill = get_absolute_expression ();
2056 pfill = &fill;
2057 }
2058
2059 d30v_last_label = NULL;
2060 d30v_align (align, pfill, NULL);
2061
2062 demand_empty_rest_of_line ();
2063}
2064
2065/* Handle the .text pseudo-op. This is like the usual one, but it
2066 clears the saved last label and resets known alignment. */
2067
2068static void
ea1562b3 2069s_d30v_text (int i)
252b5132
RH
2070
2071{
2072 s_text (i);
2073 d30v_last_label = NULL;
2074 d30v_current_align = 0;
2075 d30v_current_align_seg = now_seg;
2076}
2077
2078/* Handle the .data pseudo-op. This is like the usual one, but it
2079 clears the saved last label and resets known alignment. */
2080
2081static void
ea1562b3 2082s_d30v_data (int i)
252b5132
RH
2083{
2084 s_data (i);
2085 d30v_last_label = NULL;
2086 d30v_current_align = 0;
2087 d30v_current_align_seg = now_seg;
2088}
2089
2090/* Handle the .section pseudo-op. This is like the usual one, but it
2091 clears the saved last label and resets known alignment. */
2092
2093static void
ea1562b3 2094s_d30v_section (int ignore)
252b5132
RH
2095{
2096 obj_elf_section (ignore);
2097 d30v_last_label = NULL;
2098 d30v_current_align = 0;
2099 d30v_current_align_seg = now_seg;
2100}
ea1562b3
NC
2101
2102/* The target specific pseudo-ops which we support. */
2103const pseudo_typeS md_pseudo_table[] =
2104{
2105 { "word", cons, 4 },
2106 { "hword", cons, 2 },
2107 { "align", s_d30v_align, 0 },
2108 { "text", s_d30v_text, 0 },
2109 { "data", s_d30v_data, 0 },
2110 { "section", s_d30v_section, 0 },
2111 { "section.s", s_d30v_section, 0 },
2112 { "sect", s_d30v_section, 0 },
2113 { "sect.s", s_d30v_section, 0 },
2114 { NULL, NULL, 0 }
2115};
This page took 0.542285 seconds and 4 git commands to generate.