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