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