Remove duplicate definitions of the md_atof() function
[platform/upstream/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, 2006, 2007
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 3, 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, 51 Franklin Street - Fifth Floor,
20    Boston, MA 02110-1301, USA.  */
21
22 #include "as.h"
23 #include "safe-ctype.h"
24 #include "subsegs.h"
25 #include "opcode/d10v.h"
26 #include "elf/ppc.h"
27
28 const char comment_chars[]        = ";";
29 const char line_comment_chars[]   = "#";
30 const char line_separator_chars[] = "";
31 const char *md_shortopts          = "O";
32 const char EXP_CHARS[]            = "eE";
33 const char FLT_CHARS[]            = "dD";
34
35 int 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
46 struct d10v_fixup
47 {
48   expressionS exp;
49   int operand;
50   int pcrel;
51   int size;
52   bfd_reloc_code_real_type reloc;
53 };
54
55 typedef struct _fixups
56 {
57   int fc;
58   struct d10v_fixup fix[MAX_INSN_FIXUPS];
59   struct _fixups *next;
60 } Fixups;
61
62 static Fixups FixUps[2];
63 static Fixups *fixups;
64
65 static int do_not_ignore_hash = 0;
66
67 typedef 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)     /* "<-"  */
72 static packing_type etype = PACK_UNSPEC; /* Used by d10v_cleanup.  */
73
74 /* TRUE if instruction swapping warnings should be inhibited.
75    --nowarnswap.  */
76 static 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.  */
80 static bfd_boolean flag_allow_gstabs_packing = 1;
81
82 /* Local functions.  */
83
84 enum options
85 {
86   OPTION_NOWARNSWAP = OPTION_MD_BASE,
87   OPTION_GSTABSPACKING,
88   OPTION_NOGSTABSPACKING
89 };
90
91 struct 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
101 size_t md_longopts_size = sizeof (md_longopts);
102
103 /* Opcode hash table.  */
104 static 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
110 static int
111 reg_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
137 static int
138 register_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
167 static int
168 check_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
213 void
214 md_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
224 int
225 md_parse_option (int c, 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
248 symbolS *
249 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
250 {
251   return 0;
252 }
253
254 char *
255 md_atof (int type, char *litP, int *sizeP)
256 {
257   return ieee_md_atof (type, litP, sizeP, TRUE);
258 }
259
260 void
261 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
262                  asection *sec ATTRIBUTE_UNUSED,
263                  fragS *fragP ATTRIBUTE_UNUSED)
264 {
265   abort ();
266 }
267
268 valueT
269 md_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
275 void
276 md_begin (void)
277 {
278   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
304 static int
305 postfix (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
328 static bfd_reloc_code_real_type
329 get_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
349 static int
350 get_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
485 static unsigned long
486 d10v_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
514 static unsigned long
515 build_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
607 static void
608 write_long (unsigned long insn, Fixups *fx)
609 {
610   int i, where;
611   char *f = frag_more (4);
612
613   insn |= FM11;
614   number_to_chars_bigendian (f, insn, 4);
615
616   for (i = 0; i < fx->fc; i++)
617     {
618       if (fx->fix[i].reloc)
619         {
620           where = f - frag_now->fr_literal;
621           if (fx->fix[i].size == 2)
622             where += 2;
623
624           if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
625             fx->fix[i].operand |= 4096;
626
627           fix_new_exp (frag_now,
628                        where,
629                        fx->fix[i].size,
630                        &(fx->fix[i].exp),
631                        fx->fix[i].pcrel,
632                        fx->fix[i].operand|2048);
633         }
634     }
635   fx->fc = 0;
636 }
637
638 /* Write out a short form instruction by itself.  */
639
640 static void
641 write_1_short (struct d10v_opcode *opcode,
642                unsigned long insn,
643                Fixups *fx)
644 {
645   char *f = frag_more (4);
646   int i, where;
647
648   if (opcode->exec_type & PARONLY)
649     as_fatal (_("Instruction must be executed in parallel with another instruction."));
650
651   /* The other container needs to be NOP.
652      According to 4.3.1: for FM=00, sub-instructions performed only by IU
653      cannot be encoded in L-container.  */
654   if (opcode->unit == IU)
655     insn |= FM00 | (NOP << 15);         /* Right container.  */
656   else
657     insn = FM00 | (insn << 15) | NOP;   /* Left container.  */
658
659   number_to_chars_bigendian (f, insn, 4);
660   for (i = 0; i < fx->fc; i++)
661     {
662       if (fx->fix[i].reloc)
663         {
664           where = f - frag_now->fr_literal;
665           if (fx->fix[i].size == 2)
666             where += 2;
667
668           if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
669             fx->fix[i].operand |= 4096;
670
671           /* If it's an R reloc, we may have to switch it to L.  */
672           if ((fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R)
673               && (opcode->unit != IU))
674             fx->fix[i].operand |= 1024;
675
676           fix_new_exp (frag_now,
677                        where,
678                        fx->fix[i].size,
679                        &(fx->fix[i].exp),
680                        fx->fix[i].pcrel,
681                        fx->fix[i].operand|2048);
682         }
683     }
684   fx->fc = 0;
685 }
686
687 /* Determine if there are any resource conflicts among two manually
688    parallelized instructions.  Some of this was lifted from parallel_ok.  */
689
690 static void
691 check_resource_conflict (struct d10v_opcode *op1,
692                          unsigned long insn1,
693                          struct d10v_opcode *op2,
694                          unsigned long insn2)
695 {
696   int i, j, flags, mask, shift, regno;
697   unsigned long ins, mod[2];
698   struct d10v_opcode *op;
699
700   if ((op1->exec_type & SEQ)
701       || ! ((op1->exec_type & PAR) || (op1->exec_type & PARONLY)))
702     {
703       as_warn (_("packing conflict: %s must dispatch sequentially"),
704               op1->name);
705       return;
706     }
707
708   if ((op2->exec_type & SEQ)
709       || ! ((op2->exec_type & PAR) || (op2->exec_type & PARONLY)))
710     {
711       as_warn (_("packing conflict: %s must dispatch sequentially"),
712               op2->name);
713       return;
714     }
715
716    /* See if both instructions write to the same resource.
717
718       The idea here is to create two sets of bitmasks (mod and used) which
719       indicate which registers are modified or used by each instruction.
720       The operation can only be done in parallel if neither instruction
721       modifies the same register. Accesses to control registers and memory
722       are treated as accesses to a single register. So if both instructions
723       write memory or if the first instruction writes memory and the second
724       reads, then they cannot be done in parallel. We treat reads to the PSW
725       (which includes C, F0, and F1) in isolation. So simultaneously writing
726       C and F0 in two different sub-instructions is permitted.  */
727
728   /* The bitmasks (mod and used) look like this (bit 31 = MSB).
729      r0-r15       0-15
730      a0-a1        16-17
731      cr (not psw) 18
732      psw(other)   19
733      mem          20
734      psw(C flag)  21
735      psw(F0 flag) 22  */
736
737   for (j = 0; j < 2; j++)
738     {
739       if (j == 0)
740         {
741           op = op1;
742           ins = insn1;
743         }
744       else
745         {
746           op = op2;
747           ins = insn2;
748         }
749       mod[j] = 0;
750       if (op->exec_type & BRANCH_LINK)
751         mod[j] |= 1 << 13;
752
753       for (i = 0; op->operands[i]; i++)
754         {
755           flags = d10v_operands[op->operands[i]].flags;
756           shift = d10v_operands[op->operands[i]].shift;
757           mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
758           if (flags & OPERAND_REG)
759             {
760               regno = (ins >> shift) & mask;
761               if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
762                 regno += 16;
763               else if (flags & OPERAND_CONTROL) /* mvtc or mvfc */
764                 {
765                   if (regno == 0)
766                     regno = 19;
767                   else
768                     regno = 18;
769                 }
770               else if (flags & OPERAND_FFLAG)
771                 regno = 22;
772               else if (flags & OPERAND_CFLAG)
773                 regno = 21;
774
775               if (flags & OPERAND_DEST
776                   /* Auto inc/dec also modifies the register.  */
777                   || (op->operands[i + 1] != 0
778                       && (d10v_operands[op->operands[i + 1]].flags
779                           & (OPERAND_PLUS | OPERAND_MINUS)) != 0))
780                 {
781                   mod[j] |= 1 << regno;
782                   if (flags & OPERAND_EVEN)
783                     mod[j] |= 1 << (regno + 1);
784                 }
785             }
786           else if (flags & OPERAND_ATMINUS)
787             {
788               /* SP implicitly used/modified.  */
789               mod[j] |= 1 << 15;
790             }
791         }
792
793       if (op->exec_type & WMEM)
794         mod[j] |= 1 << 20;
795       else if (op->exec_type & WF0)
796         mod[j] |= 1 << 22;
797       else if (op->exec_type & WCAR)
798         mod[j] |= 1 << 21;
799     }
800
801   if ((mod[0] & mod[1]) == 0)
802     return;
803   else
804     {
805       unsigned long x;
806       x = mod[0] & mod[1];
807
808       for (j = 0; j <= 15; j++)
809         if (x & (1 << j))
810           as_warn (_("resource conflict (R%d)"), j);
811       for (j = 16; j <= 17; j++)
812         if (x & (1 << j))
813           as_warn (_("resource conflict (A%d)"), j - 16);
814       if (x & (1 << 19))
815         as_warn (_("resource conflict (PSW)"));
816       if (x & (1 << 21))
817         as_warn (_("resource conflict (C flag)"));
818       if (x & (1 << 22))
819         as_warn (_("resource conflict (F flag)"));
820     }
821 }
822
823 /* Check 2 instructions and determine if they can be safely
824    executed in parallel.  Return 1 if they can be.  */
825
826 static int
827 parallel_ok (struct d10v_opcode *op1,
828              unsigned long insn1,
829              struct d10v_opcode *op2,
830              unsigned long insn2,
831              packing_type exec_type)
832 {
833   int i, j, flags, mask, shift, regno;
834   unsigned long ins, mod[2], used[2];
835   struct d10v_opcode *op;
836
837   if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0
838       || (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0
839       || (op1->unit == BOTH) || (op2->unit == BOTH)
840       || (op1->unit == IU && op2->unit == IU)
841       || (op1->unit == MU && op2->unit == MU))
842     return 0;
843
844   /* If this is auto parallelization, and the first instruction is a
845      branch or should not be packed, then don't parallelize.  */
846   if (exec_type == PACK_UNSPEC
847       && (op1->exec_type & (ALONE | BRANCH)))
848     return 0;
849
850   /* The idea here is to create two sets of bitmasks (mod and used)
851      which indicate which registers are modified or used by each
852      instruction.  The operation can only be done in parallel if
853      instruction 1 and instruction 2 modify different registers, and
854      the first instruction does not modify registers that the second
855      is using (The second instruction can modify registers that the
856      first is using as they are only written back after the first
857      instruction has completed).  Accesses to control registers, PSW,
858      and memory are treated as accesses to a single register.  So if
859      both instructions write memory or if the first instruction writes
860      memory and the second reads, then they cannot be done in
861      parallel.  Likewise, if the first instruction mucks with the psw
862      and the second reads the PSW (which includes C, F0, and F1), then
863      they cannot operate safely in parallel.  */
864
865   /* The bitmasks (mod and used) look like this (bit 31 = MSB).
866      r0-r15       0-15
867      a0-a1        16-17
868      cr (not psw) 18
869      psw          19
870      mem          20  */
871
872   for (j = 0; j < 2; j++)
873     {
874       if (j == 0)
875         {
876           op = op1;
877           ins = insn1;
878         }
879       else
880         {
881           op = op2;
882           ins = insn2;
883         }
884       mod[j] = used[j] = 0;
885       if (op->exec_type & BRANCH_LINK)
886         mod[j] |= 1 << 13;
887
888       for (i = 0; op->operands[i]; i++)
889         {
890           flags = d10v_operands[op->operands[i]].flags;
891           shift = d10v_operands[op->operands[i]].shift;
892           mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits);
893           if (flags & OPERAND_REG)
894             {
895               regno = (ins >> shift) & mask;
896               if (flags & (OPERAND_ACC0 | OPERAND_ACC1))
897                 regno += 16;
898               else if (flags & OPERAND_CONTROL) /* mvtc or mvfc.  */
899                 {
900                   if (regno == 0)
901                     regno = 19;
902                   else
903                     regno = 18;
904                 }
905               else if (flags & (OPERAND_FFLAG | OPERAND_CFLAG))
906                 regno = 19;
907
908               if (flags & OPERAND_DEST)
909                 {
910                   mod[j] |= 1 << regno;
911                   if (flags & OPERAND_EVEN)
912                     mod[j] |= 1 << (regno + 1);
913                 }
914               else
915                 {
916                   used[j] |= 1 << regno;
917                   if (flags & OPERAND_EVEN)
918                     used[j] |= 1 << (regno + 1);
919
920                   /* Auto inc/dec also modifies the register.  */
921                   if (op->operands[i + 1] != 0
922                       && (d10v_operands[op->operands[i + 1]].flags
923                           & (OPERAND_PLUS | OPERAND_MINUS)) != 0)
924                     mod[j] |= 1 << regno;
925                 }
926             }
927           else if (flags & OPERAND_ATMINUS)
928             {
929               /* SP implicitly used/modified.  */
930               mod[j] |= 1 << 15;
931               used[j] |= 1 << 15;
932             }
933         }
934       if (op->exec_type & RMEM)
935         used[j] |= 1 << 20;
936       else if (op->exec_type & WMEM)
937         mod[j] |= 1 << 20;
938       else if (op->exec_type & RF0)
939         used[j] |= 1 << 19;
940       else if (op->exec_type & WF0)
941         mod[j] |= 1 << 19;
942       else if (op->exec_type & WCAR)
943         mod[j] |= 1 << 19;
944     }
945   if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0)
946     return 1;
947   return 0;
948 }
949
950 /* Expects two short instructions.
951    If possible, writes out both as a single packed instruction.
952    Otherwise, writes out the first one, packed with a NOP.
953    Returns number of instructions not written out.  */
954
955 static int
956 write_2_short (struct d10v_opcode *opcode1,
957                unsigned long insn1,
958                struct d10v_opcode *opcode2,
959                unsigned long insn2,
960                packing_type exec_type,
961                Fixups *fx)
962 {
963   unsigned long insn;
964   char *f;
965   int i, j, where;
966
967   if ((exec_type != PACK_PARALLEL)
968       && ((opcode1->exec_type & PARONLY) || (opcode2->exec_type & PARONLY)))
969     as_fatal (_("Instruction must be executed in parallel"));
970
971   if ((opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE))
972     as_fatal (_("Long instructions may not be combined."));
973
974   switch (exec_type)
975     {
976     case PACK_UNSPEC:   /* Order not specified.  */
977       if (opcode1->exec_type & ALONE)
978         {
979           /* Case of a short branch on a separate GAS line.  Pack with NOP.  */
980           write_1_short (opcode1, insn1, fx->next);
981           return 1;
982         }
983       if (Optimizing
984           && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
985         {
986           /* Parallel.  */
987           if (opcode1->unit == IU)
988             insn = FM00 | (insn2 << 15) | insn1;
989           else if (opcode2->unit == MU)
990             insn = FM00 | (insn2 << 15) | insn1;
991           else
992             insn = FM00 | (insn1 << 15) | insn2;
993         }
994       else if (opcode1->unit == IU)
995         /* Reverse sequential with IU opcode1 on right and done first.  */
996         insn = FM10 | (insn2 << 15) | insn1;
997       else
998         /* Sequential with non-IU opcode1 on left and done first.  */
999         insn = FM01 | (insn1 << 15) | insn2;
1000       break;
1001
1002     case PACK_PARALLEL:
1003       if (opcode1->exec_type & SEQ || opcode2->exec_type & SEQ)
1004         as_fatal
1005           (_("One of these instructions may not be executed in parallel."));
1006       if (opcode1->unit == IU)
1007         {
1008           if (opcode2->unit == IU)
1009             as_fatal (_("Two IU instructions may not be executed in parallel"));
1010           if (!flag_warn_suppress_instructionswap)
1011             as_warn (_("Swapping instruction order"));
1012           insn = FM00 | (insn2 << 15) | insn1;
1013         }
1014       else if (opcode2->unit == MU)
1015         {
1016           if (opcode1->unit == MU)
1017             as_fatal (_("Two MU instructions may not be executed in parallel"));
1018           if (!flag_warn_suppress_instructionswap)
1019             as_warn (_("Swapping instruction order"));
1020           insn = FM00 | (insn2 << 15) | insn1;
1021         }
1022       else
1023         insn = FM00 | (insn1 << 15) | insn2;
1024       check_resource_conflict (opcode1, insn1, opcode2, insn2);
1025       break;
1026
1027     case PACK_LEFT_RIGHT:
1028       if (opcode1->unit != IU)
1029         insn = FM01 | (insn1 << 15) | insn2;
1030       else if (opcode2->unit == MU || opcode2->unit == EITHER)
1031         {
1032           if (!flag_warn_suppress_instructionswap)
1033             as_warn (_("Swapping instruction order"));
1034           insn = FM10 | (insn2 << 15) | insn1;
1035         }
1036       else
1037         as_fatal (_("IU instruction may not be in the left container"));
1038       if (opcode1->exec_type & ALONE)
1039         as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1040       break;
1041
1042     case PACK_RIGHT_LEFT:
1043       if (opcode2->unit != MU)
1044         insn = FM10 | (insn1 << 15) | insn2;
1045       else if (opcode1->unit == IU || opcode1->unit == EITHER)
1046         {
1047           if (!flag_warn_suppress_instructionswap)
1048             as_warn (_("Swapping instruction order"));
1049           insn = FM01 | (insn2 << 15) | insn1;
1050         }
1051       else
1052         as_fatal (_("MU instruction may not be in the right container"));
1053       if (opcode2->exec_type & ALONE)
1054         as_warn (_("Instruction in R container is squashed by flow control instruction in L container."));
1055       break;
1056
1057     default:
1058       as_fatal (_("unknown execution type passed to write_2_short()"));
1059     }
1060
1061   f = frag_more (4);
1062   number_to_chars_bigendian (f, insn, 4);
1063
1064   /* Process fixup chains.  fx refers to insn2 when j == 0, and to
1065      insn1 when j == 1.  Yes, it's reversed.  */
1066
1067   for (j = 0; j < 2; j++)
1068     {
1069       for (i = 0; i < fx->fc; i++)
1070         {
1071           if (fx->fix[i].reloc)
1072             {
1073               where = f - frag_now->fr_literal;
1074               if (fx->fix[i].size == 2)
1075                 where += 2;
1076
1077               if (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R
1078                   /* A BFD_RELOC_D10V_10_PCREL_R relocation applied to
1079                      the instruction in the L container has to be
1080                      adjusted to BDF_RELOC_D10V_10_PCREL_L.  When
1081                      j==0, we're processing insn2's operands, so we
1082                      want to mark the operand if insn2 is *not* in the
1083                      R container.  When j==1, we're processing insn1's
1084                      operands, so we want to mark the operand if insn2
1085                      *is* in the R container.  Note that, if two
1086                      instructions are identical, we're never going to
1087                      swap them, so the test is safe.  */
1088                   && j == ((insn & 0x7fff) == insn2))
1089                 fx->fix[i].operand |= 1024;
1090
1091               if (fx->fix[i].reloc == BFD_RELOC_D10V_18)
1092                 fx->fix[i].operand |= 4096;
1093
1094               fix_new_exp (frag_now,
1095                            where,
1096                            fx->fix[i].size,
1097                            &(fx->fix[i].exp),
1098                            fx->fix[i].pcrel,
1099                            fx->fix[i].operand|2048);
1100             }
1101         }
1102       fx->fc = 0;
1103       fx = fx->next;
1104     }
1105   return 0;
1106 }
1107
1108 /* This is the main entry point for the machine-dependent assembler.
1109    str points to a machine-dependent instruction.  This function is
1110    supposed to emit the frags/bytes it assembles to.  For the D10V, it
1111    mostly handles the special VLIW parsing and packing and leaves the
1112    difficult stuff to do_assemble().  */
1113
1114 static unsigned long prev_insn;
1115 static struct d10v_opcode *prev_opcode = 0;
1116 static subsegT prev_subseg;
1117 static segT prev_seg = 0;;
1118
1119 /* Find the symbol which has the same name as the register in exp.  */
1120
1121 static symbolS *
1122 find_symbol_matching_register (expressionS *exp)
1123 {
1124   int i;
1125
1126   if (exp->X_op != O_register)
1127     return NULL;
1128
1129   /* Find the name of the register.  */
1130   for (i = d10v_reg_name_cnt (); i--;)
1131     if (d10v_predefined_registers[i].value == exp->X_add_number)
1132       break;
1133
1134   if (i < 0)
1135     abort ();
1136
1137   /* Now see if a symbol has been defined with the same name.  */
1138   return symbol_find (d10v_predefined_registers[i].name);
1139 }
1140
1141 /* Get a pointer to an entry in the opcode table.
1142    The function must look at all opcodes with the same name and use
1143    the operands to choose the correct opcode.  */
1144
1145 static struct d10v_opcode *
1146 find_opcode (struct d10v_opcode *opcode, expressionS myops[])
1147 {
1148   int i, match;
1149   struct d10v_opcode *next_opcode;
1150
1151   /* Get all the operands and save them as expressions.  */
1152   get_operands (myops);
1153
1154   /* Now see if the operand is a fake.  If so, find the correct size
1155      instruction, if possible.  */
1156   if (opcode->format == OPCODE_FAKE)
1157     {
1158       int opnum = opcode->operands[0];
1159       int flags;
1160
1161       if (myops[opnum].X_op == O_register)
1162         {
1163           myops[opnum].X_op = O_symbol;
1164           myops[opnum].X_add_symbol =
1165             symbol_find_or_make ((char *) myops[opnum].X_op_symbol);
1166           myops[opnum].X_add_number = 0;
1167           myops[opnum].X_op_symbol = NULL;
1168         }
1169
1170       next_opcode = opcode + 1;
1171
1172       /* If the first operand is supposed to be a register, make sure
1173          we got a valid one.  */
1174       flags = d10v_operands[next_opcode->operands[0]].flags;
1175       if (flags & OPERAND_REG)
1176         {
1177           int X_op = myops[0].X_op;
1178           int num = myops[0].X_add_number;
1179
1180           if (X_op != O_register
1181               || (num & ~flags
1182                   & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1183                      | OPERAND_FFLAG | OPERAND_CFLAG | OPERAND_CONTROL))
1184               || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1185             {
1186               as_bad (_("bad opcode or operands"));
1187               return 0;
1188             }
1189         }
1190
1191       if (myops[opnum].X_op == O_constant
1192           || (myops[opnum].X_op == O_symbol
1193               && S_IS_DEFINED (myops[opnum].X_add_symbol)
1194               && (S_GET_SEGMENT (myops[opnum].X_add_symbol) == now_seg)))
1195         {
1196           for (i = 0; opcode->operands[i + 1]; i++)
1197             {
1198               int bits = d10v_operands[next_opcode->operands[opnum]].bits;
1199               int flags = d10v_operands[next_opcode->operands[opnum]].flags;
1200               if (flags & OPERAND_ADDR)
1201                 bits += 2;
1202
1203               if (myops[opnum].X_op == O_constant)
1204                 {
1205                   if (!check_range (myops[opnum].X_add_number, bits, flags))
1206                     break;
1207                 }
1208               else
1209                 {
1210                   fragS *sym_frag;
1211                   fragS *f;
1212                   unsigned long current_position;
1213                   unsigned long symbol_position;
1214                   unsigned long value;
1215                   bfd_boolean found_symbol;
1216
1217                   /* Calculate the address of the current instruction
1218                      and the address of the symbol.  Do this by summing
1219                      the offsets of previous frags until we reach the
1220                      frag containing the symbol, and the current frag.  */
1221                   sym_frag = symbol_get_frag (myops[opnum].X_add_symbol);
1222                   found_symbol = FALSE;
1223
1224                   current_position =
1225                     obstack_next_free (&frchain_now->frch_obstack)
1226                     - frag_now->fr_literal;
1227                   symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol);
1228
1229                   for (f = frchain_now->frch_root; f; f = f->fr_next)
1230                     {
1231                       current_position += f->fr_fix + f->fr_offset;
1232
1233                       if (f == sym_frag)
1234                         found_symbol = TRUE;
1235
1236                       if (! found_symbol)
1237                         symbol_position += f->fr_fix + f->fr_offset;
1238                     }
1239
1240                   value = symbol_position;
1241
1242                   if (flags & OPERAND_ADDR)
1243                     value -= current_position;
1244
1245                   if (AT_WORD_P (&myops[opnum]))
1246                     {
1247                       if (bits > 4)
1248                         {
1249                           bits += 2;
1250                           if (!check_range (value, bits, flags))
1251                             break;
1252                         }
1253                     }
1254                   else if (!check_range (value, bits, flags))
1255                     break;
1256                 }
1257               next_opcode++;
1258             }
1259
1260           if (opcode->operands [i + 1] == 0)
1261             as_fatal (_("value out of range"));
1262           else
1263             opcode = next_opcode;
1264         }
1265       else
1266         /* Not a constant, so use a long instruction.  */
1267         opcode += 2;
1268     }
1269
1270   match = 0;
1271
1272   /* Now search the opcode table table for one with operands
1273      that matches what we've got.  */
1274   while (!match)
1275     {
1276       match = 1;
1277       for (i = 0; opcode->operands[i]; i++)
1278         {
1279           int flags = d10v_operands[opcode->operands[i]].flags;
1280           int X_op = myops[i].X_op;
1281           int num = myops[i].X_add_number;
1282
1283           if (X_op == 0)
1284             {
1285               match = 0;
1286               break;
1287             }
1288
1289           if (flags & OPERAND_REG)
1290             {
1291               if ((X_op != O_register)
1292                   || (num & ~flags
1293                       & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1294                          | OPERAND_FFLAG | OPERAND_CFLAG
1295                          | OPERAND_CONTROL))
1296                   || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1297                 {
1298                   match = 0;
1299                   break;
1300                 }
1301             }
1302
1303           if (((flags & OPERAND_MINUS)   && ((X_op != O_absent) || (num != OPERAND_MINUS))) ||
1304               ((flags & OPERAND_PLUS)    && ((X_op != O_absent) || (num != OPERAND_PLUS))) ||
1305               ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) ||
1306               ((flags & OPERAND_ATPAR)   && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
1307               ((flags & OPERAND_ATSIGN)  && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR)))))
1308             {
1309               match = 0;
1310               break;
1311             }
1312
1313           /* Unfortunately, for the indirect operand in instructions such
1314              as ``ldb r1, @(c,r14)'' this function can be passed
1315              X_op == O_register (because 'c' is a valid register name).
1316              However we cannot just ignore the case when X_op == O_register
1317              but flags & OPERAND_REG is null, so we check to see if a symbol
1318              of the same name as the register exists.  If the symbol does
1319              exist, then the parser was unable to distinguish the two cases
1320              and we fix things here. (Ref: PR14826)  */
1321
1322           if (!(flags & OPERAND_REG) && (X_op == O_register))
1323             {
1324               symbolS * sym;
1325
1326               sym = find_symbol_matching_register (& myops[i]);
1327
1328               if (sym != NULL)
1329                 {
1330                   myops[i].X_op = X_op = O_symbol;
1331                   myops[i].X_add_symbol = sym;
1332                 }
1333               else
1334                 as_bad
1335                   (_("illegal operand - register name found where none expected"));
1336             }
1337         }
1338
1339       /* We're only done if the operands matched so far AND there
1340              are no more to check.  */
1341       if (match && myops[i].X_op == 0)
1342         break;
1343       else
1344         match = 0;
1345
1346       next_opcode = opcode + 1;
1347
1348       if (next_opcode->opcode == 0)
1349         break;
1350
1351       if (strcmp (next_opcode->name, opcode->name))
1352         break;
1353
1354       opcode = next_opcode;
1355     }
1356
1357   if (!match)
1358     {
1359       as_bad (_("bad opcode or operands"));
1360       return 0;
1361     }
1362
1363   /* Check that all registers that are required to be even are.
1364      Also, if any operands were marked as registers, but were really symbols,
1365      fix that here.  */
1366   for (i = 0; opcode->operands[i]; i++)
1367     {
1368       if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
1369           (myops[i].X_add_number & 1))
1370         as_fatal (_("Register number must be EVEN"));
1371       if ((d10v_operands[opcode->operands[i]].flags & OPERAND_NOSP)
1372           && (myops[i].X_add_number & OPERAND_SP))
1373         as_bad (_("Unsupported use of sp"));
1374       if (myops[i].X_op == O_register)
1375         {
1376           if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
1377             {
1378               myops[i].X_op = O_symbol;
1379               myops[i].X_add_symbol =
1380                 symbol_find_or_make ((char *) myops[i].X_op_symbol);
1381               myops[i].X_add_number = 0;
1382               myops[i].X_op_symbol = NULL;
1383             }
1384         }
1385       if ((d10v_operands[opcode->operands[i]].flags & OPERAND_CONTROL)
1386           && (myops[i].X_add_number == OPERAND_CONTROL + 4
1387               || myops[i].X_add_number == OPERAND_CONTROL + 5
1388               || myops[i].X_add_number == OPERAND_CONTROL + 6
1389               || myops[i].X_add_number == OPERAND_CONTROL + 12
1390               || myops[i].X_add_number == OPERAND_CONTROL + 13
1391               || myops[i].X_add_number == OPERAND_CONTROL + 15))
1392         as_warn (_("cr%ld is a reserved control register"),
1393                  myops[i].X_add_number - OPERAND_CONTROL);
1394     }
1395   return opcode;
1396 }
1397
1398 /* Assemble a single instruction.
1399    Return an opcode, or -1 (an invalid opcode) on error.  */
1400
1401 static unsigned long
1402 do_assemble (char *str, struct d10v_opcode **opcode)
1403 {
1404   unsigned char *op_start, *op_end;
1405   char *save;
1406   char name[20];
1407   int nlen = 0;
1408   expressionS myops[6];
1409
1410   /* Drop leading whitespace.  */
1411   while (*str == ' ')
1412     str++;
1413
1414   /* Find the opcode end.  */
1415   for (op_start = op_end = (unsigned char *) str;
1416        *op_end && nlen < 20 && !is_end_of_line[*op_end] && *op_end != ' ';
1417        op_end++)
1418     {
1419       name[nlen] = TOLOWER (op_start[nlen]);
1420       nlen++;
1421     }
1422   name[nlen] = 0;
1423
1424   if (nlen == 0)
1425     return -1;
1426
1427   /* Find the first opcode with the proper name.  */
1428   *opcode = (struct d10v_opcode *) hash_find (d10v_hash, name);
1429   if (*opcode == NULL)
1430     return -1;
1431
1432   save = input_line_pointer;
1433   input_line_pointer = (char *) op_end;
1434   *opcode = find_opcode (*opcode, myops);
1435   if (*opcode == 0)
1436     return -1;
1437   input_line_pointer = save;
1438
1439   return build_insn ((*opcode), myops, 0);
1440 }
1441
1442 /* If while processing a fixup, a reloc really needs to be created.
1443    Then it is done here.  */
1444
1445 arelent *
1446 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1447 {
1448   arelent *reloc;
1449   reloc = xmalloc (sizeof (arelent));
1450   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1451   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1452   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1453   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1454   if (reloc->howto == (reloc_howto_type *) NULL)
1455     {
1456       as_bad_where (fixp->fx_file, fixp->fx_line,
1457                     _("reloc %d not supported by object file format"),
1458                     (int) fixp->fx_r_type);
1459       return NULL;
1460     }
1461
1462   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1463     reloc->address = fixp->fx_offset;
1464
1465   reloc->addend = 0;
1466
1467   return reloc;
1468 }
1469
1470 int
1471 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1472                                asection *seg ATTRIBUTE_UNUSED)
1473 {
1474   abort ();
1475   return 0;
1476 }
1477
1478 long
1479 md_pcrel_from_section (fixS *fixp, segT sec)
1480 {
1481   if (fixp->fx_addsy != (symbolS *) NULL
1482       && (!S_IS_DEFINED (fixp->fx_addsy)
1483           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1484     return 0;
1485   return fixp->fx_frag->fr_address + fixp->fx_where;
1486 }
1487
1488 void
1489 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1490 {
1491   char *where;
1492   unsigned long insn;
1493   long value = *valP;
1494   int op_type;
1495   int left = 0;
1496
1497   if (fixP->fx_addsy == (symbolS *) NULL)
1498     fixP->fx_done = 1;
1499
1500   /* We don't actually support subtracting a symbol.  */
1501   if (fixP->fx_subsy != (symbolS *) NULL)
1502     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1503
1504   op_type = fixP->fx_r_type;
1505   if (op_type & 2048)
1506     {
1507       op_type -= 2048;
1508       if (op_type & 1024)
1509         {
1510           op_type -= 1024;
1511           fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1512           left = 1;
1513         }
1514       else if (op_type & 4096)
1515         {
1516           op_type -= 4096;
1517           fixP->fx_r_type = BFD_RELOC_D10V_18;
1518         }
1519       else
1520         fixP->fx_r_type =
1521           get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
1522     }
1523
1524   /* Fetch the instruction, insert the fully resolved operand
1525      value, and stuff the instruction back again.  */
1526   where = fixP->fx_frag->fr_literal + fixP->fx_where;
1527   insn = bfd_getb32 ((unsigned char *) where);
1528
1529   switch (fixP->fx_r_type)
1530     {
1531     case BFD_RELOC_D10V_10_PCREL_L:
1532     case BFD_RELOC_D10V_10_PCREL_R:
1533     case BFD_RELOC_D10V_18_PCREL:
1534       /* If the fix is relative to a global symbol, not a section
1535          symbol, then ignore the offset.
1536          XXX - Do we have to worry about branches to a symbol + offset ?  */
1537       if (fixP->fx_addsy != NULL
1538           && S_IS_EXTERNAL (fixP->fx_addsy) )
1539         {
1540           segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
1541           segment_info_type *segf = seg_info(fseg);
1542
1543           if ( segf && segf->sym != fixP->fx_addsy)
1544             value = 0;
1545         }
1546       /* Drop through.  */
1547     case BFD_RELOC_D10V_18:
1548       /* Instruction addresses are always right-shifted by 2.  */
1549       value >>= AT_WORD_RIGHT_SHIFT;
1550       if (fixP->fx_size == 2)
1551         bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1552       else
1553         {
1554           struct d10v_opcode *rep, *repi;
1555
1556           rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep");
1557           repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi");
1558           if ((insn & FM11) == FM11
1559               && ((repi != NULL
1560                    && (insn & repi->mask) == (unsigned) repi->opcode)
1561                   || (rep != NULL
1562                       && (insn & rep->mask) == (unsigned) rep->opcode))
1563               && value < 4)
1564             as_fatal
1565               (_("line %d: rep or repi must include at least 4 instructions"),
1566                fixP->fx_line);
1567           insn =
1568             d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP);
1569           bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1570         }
1571       break;
1572     case BFD_RELOC_32:
1573       bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1574       break;
1575     case BFD_RELOC_16:
1576       bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1577       break;
1578
1579     case BFD_RELOC_VTABLE_INHERIT:
1580     case BFD_RELOC_VTABLE_ENTRY:
1581       fixP->fx_done = 0;
1582       return;
1583
1584     default:
1585       as_fatal (_("line %d: unknown relocation type: 0x%x"),
1586                 fixP->fx_line, fixP->fx_r_type);
1587     }
1588 }
1589
1590 /* d10v_cleanup() is called after the assembler has finished parsing
1591    the input file, when a label is read from the input file, or when a
1592    stab directive is output.  Because the D10V assembler sometimes
1593    saves short instructions to see if it can package them with the
1594    next instruction, there may be a short instruction that still needs
1595    to be written.
1596
1597    NOTE: accesses a global, etype.
1598    NOTE: invoked by various macros such as md_cleanup: see.  */
1599
1600 int
1601 d10v_cleanup (void)
1602 {
1603   segT seg;
1604   subsegT subseg;
1605
1606   /* If cleanup was invoked because the assembler encountered, e.g., a
1607      user label, we write out the pending instruction, if any.  If it
1608      was invoked because the assembler is outputting a piece of line
1609      debugging information, though, we write out the pending
1610      instruction only if the --no-gstabs-packing command line switch
1611      has been specified.  */
1612   if (prev_opcode
1613       && etype == PACK_UNSPEC
1614       && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing))
1615     {
1616       seg = now_seg;
1617       subseg = now_subseg;
1618
1619       if (prev_seg)
1620         subseg_set (prev_seg, prev_subseg);
1621
1622       write_1_short (prev_opcode, prev_insn, fixups->next);
1623       subseg_set (seg, subseg);
1624       prev_opcode = NULL;
1625     }
1626   return 1;
1627 }
1628
1629 /* Like normal .word, except support @word.
1630    Clobbers input_line_pointer, checks end-of-line.  */
1631
1632 static void
1633 d10v_dot_word (int dummy ATTRIBUTE_UNUSED)
1634 {
1635   expressionS exp;
1636   char *p;
1637
1638   if (is_it_end_of_statement ())
1639     {
1640       demand_empty_rest_of_line ();
1641       return;
1642     }
1643
1644   do
1645     {
1646       expression (&exp);
1647       if (!strncasecmp (input_line_pointer, "@word", 5))
1648         {
1649           exp.X_add_number = 0;
1650           input_line_pointer += 5;
1651
1652           p = frag_more (2);
1653           fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1654                        &exp, 0, BFD_RELOC_D10V_18);
1655         }
1656       else
1657         emit_expr (&exp, 2);
1658     }
1659   while (*input_line_pointer++ == ',');
1660
1661   input_line_pointer--;         /* Put terminator back into stream.  */
1662   demand_empty_rest_of_line ();
1663 }
1664
1665 /* Mitsubishi asked that we support some old syntax that apparently
1666    had immediate operands starting with '#'.  This is in some of their
1667    sample code but is not documented (although it appears in some
1668    examples in their assembler manual). For now, we'll solve this
1669    compatibility problem by simply ignoring any '#' at the beginning
1670    of an operand.  */
1671
1672 /* Operands that begin with '#' should fall through to here.
1673    From expr.c.  */
1674
1675 void
1676 md_operand (expressionS *expressionP)
1677 {
1678   if (*input_line_pointer == '#' && ! do_not_ignore_hash)
1679     {
1680       input_line_pointer++;
1681       expression (expressionP);
1682     }
1683 }
1684
1685 bfd_boolean
1686 d10v_fix_adjustable (fixS *fixP)
1687 {
1688   /* We need the symbol name for the VTABLE entries.  */
1689   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1690       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1691     return 0;
1692
1693   return 1;
1694 }
1695
1696 /* The target specific pseudo-ops which we support.  */
1697 const pseudo_typeS md_pseudo_table[] =
1698 {
1699   { "word",     d10v_dot_word,  2 },
1700   { NULL,       NULL,           0 }
1701 };
1702
1703 void
1704 md_assemble (char *str)
1705 {
1706   /* etype is saved extype.  For multi-line instructions.  */
1707   packing_type extype = PACK_UNSPEC;            /* Parallel, etc.  */
1708   struct d10v_opcode *opcode;
1709   unsigned long insn;
1710   char *str2;
1711
1712   if (etype == PACK_UNSPEC)
1713     {
1714       /* Look for the special multiple instruction separators.  */
1715       str2 = strstr (str, "||");
1716       if (str2)
1717         extype = PACK_PARALLEL;
1718       else
1719         {
1720           str2 = strstr (str, "->");
1721           if (str2)
1722             extype = PACK_LEFT_RIGHT;
1723           else
1724             {
1725               str2 = strstr (str, "<-");
1726               if (str2)
1727                 extype = PACK_RIGHT_LEFT;
1728             }
1729         }
1730
1731       /* str2 points to the separator, if there is one.  */
1732       if (str2)
1733         {
1734           *str2 = 0;
1735
1736           /* If two instructions are present and we already have one saved,
1737              then first write out the saved one.  */
1738           d10v_cleanup ();
1739
1740           /* Assemble first instruction and save it.  */
1741           prev_insn = do_assemble (str, &prev_opcode);
1742           prev_seg = now_seg;
1743           prev_subseg = now_subseg;
1744           if (prev_insn == (unsigned long) -1)
1745             as_fatal (_("can't find previous opcode "));
1746           fixups = fixups->next;
1747           str = str2 + 2;
1748         }
1749     }
1750
1751   insn = do_assemble (str, &opcode);
1752   if (insn == (unsigned long) -1)
1753     {
1754       if (extype != PACK_UNSPEC)
1755         etype = extype;
1756       else
1757         as_bad (_("could not assemble: %s"), str);
1758       return;
1759     }
1760
1761   if (etype != PACK_UNSPEC)
1762     {
1763       extype = etype;
1764       etype = PACK_UNSPEC;
1765     }
1766
1767   /* If this is a long instruction, write it and any previous short
1768      instruction.  */
1769   if (opcode->format & LONG_OPCODE)
1770     {
1771       if (extype != PACK_UNSPEC)
1772         as_fatal (_("Unable to mix instructions as specified"));
1773       d10v_cleanup ();
1774       write_long (insn, fixups);
1775       prev_opcode = NULL;
1776       return;
1777     }
1778
1779   if (prev_opcode
1780       && prev_seg
1781       && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1782     d10v_cleanup ();
1783
1784   if (prev_opcode
1785       && (0 == write_2_short (prev_opcode, prev_insn, opcode, insn, extype,
1786                               fixups)))
1787     {
1788       /* No instructions saved.  */
1789       prev_opcode = NULL;
1790     }
1791   else
1792     {
1793       if (extype != PACK_UNSPEC)
1794         as_fatal (_("Unable to mix instructions as specified"));
1795       /* Save last instruction so it may be packed on next pass.  */
1796       prev_opcode = opcode;
1797       prev_insn = insn;
1798       prev_seg = now_seg;
1799       prev_subseg = now_subseg;
1800       fixups = fixups->next;
1801     }
1802 }
1803