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