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