Add -Wshadow to the gcc command line options used when compiling the binutils.
[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
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 && nlen < 20 && !is_end_of_line[*op_end] && *op_end != ' ';
1424        op_end++)
1425     {
1426       name[nlen] = TOLOWER (op_start[nlen]);
1427       nlen++;
1428     }
1429   name[nlen] = 0;
1430
1431   if (nlen == 0)
1432     return -1;
1433
1434   /* Find the first opcode with the proper name.  */
1435   *opcode = (struct d10v_opcode *) hash_find (d10v_hash, name);
1436   if (*opcode == NULL)
1437     return -1;
1438
1439   save = input_line_pointer;
1440   input_line_pointer = (char *) op_end;
1441   *opcode = find_opcode (*opcode, myops);
1442   if (*opcode == 0)
1443     return -1;
1444   input_line_pointer = save;
1445
1446   return build_insn ((*opcode), myops, 0);
1447 }
1448
1449 /* If while processing a fixup, a reloc really needs to be created.
1450    Then it is done here.  */
1451
1452 arelent *
1453 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1454 {
1455   arelent *reloc;
1456   reloc = xmalloc (sizeof (arelent));
1457   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1458   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1459   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1460   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1461   if (reloc->howto == (reloc_howto_type *) NULL)
1462     {
1463       as_bad_where (fixp->fx_file, fixp->fx_line,
1464                     _("reloc %d not supported by object file format"),
1465                     (int) fixp->fx_r_type);
1466       return NULL;
1467     }
1468
1469   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1470     reloc->address = fixp->fx_offset;
1471
1472   reloc->addend = 0;
1473
1474   return reloc;
1475 }
1476
1477 int
1478 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1479                                asection *seg ATTRIBUTE_UNUSED)
1480 {
1481   abort ();
1482   return 0;
1483 }
1484
1485 long
1486 md_pcrel_from_section (fixS *fixp, segT sec)
1487 {
1488   if (fixp->fx_addsy != (symbolS *) NULL
1489       && (!S_IS_DEFINED (fixp->fx_addsy)
1490           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1491     return 0;
1492   return fixp->fx_frag->fr_address + fixp->fx_where;
1493 }
1494
1495 void
1496 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1497 {
1498   char *where;
1499   unsigned long insn;
1500   long value = *valP;
1501   int op_type;
1502   int left = 0;
1503
1504   if (fixP->fx_addsy == (symbolS *) NULL)
1505     fixP->fx_done = 1;
1506
1507   /* We don't actually support subtracting a symbol.  */
1508   if (fixP->fx_subsy != (symbolS *) NULL)
1509     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1510
1511   op_type = fixP->fx_r_type;
1512   if (op_type & 2048)
1513     {
1514       op_type -= 2048;
1515       if (op_type & 1024)
1516         {
1517           op_type -= 1024;
1518           fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1519           left = 1;
1520         }
1521       else if (op_type & 4096)
1522         {
1523           op_type -= 4096;
1524           fixP->fx_r_type = BFD_RELOC_D10V_18;
1525         }
1526       else
1527         fixP->fx_r_type =
1528           get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
1529     }
1530
1531   /* Fetch the instruction, insert the fully resolved operand
1532      value, and stuff the instruction back again.  */
1533   where = fixP->fx_frag->fr_literal + fixP->fx_where;
1534   insn = bfd_getb32 ((unsigned char *) where);
1535
1536   switch (fixP->fx_r_type)
1537     {
1538     case BFD_RELOC_D10V_10_PCREL_L:
1539     case BFD_RELOC_D10V_10_PCREL_R:
1540     case BFD_RELOC_D10V_18_PCREL:
1541       /* If the fix is relative to a global symbol, not a section
1542          symbol, then ignore the offset.
1543          XXX - Do we have to worry about branches to a symbol + offset ?  */
1544       if (fixP->fx_addsy != NULL
1545           && S_IS_EXTERNAL (fixP->fx_addsy) )
1546         {
1547           segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
1548           segment_info_type *segf = seg_info(fseg);
1549
1550           if ( segf && segf->sym != fixP->fx_addsy)
1551             value = 0;
1552         }
1553       /* Drop through.  */
1554     case BFD_RELOC_D10V_18:
1555       /* Instruction addresses are always right-shifted by 2.  */
1556       value >>= AT_WORD_RIGHT_SHIFT;
1557       if (fixP->fx_size == 2)
1558         bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1559       else
1560         {
1561           struct d10v_opcode *rep, *repi;
1562
1563           rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep");
1564           repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi");
1565           if ((insn & FM11) == FM11
1566               && ((repi != NULL
1567                    && (insn & repi->mask) == (unsigned) repi->opcode)
1568                   || (rep != NULL
1569                       && (insn & rep->mask) == (unsigned) rep->opcode))
1570               && value < 4)
1571             as_fatal
1572               (_("line %d: rep or repi must include at least 4 instructions"),
1573                fixP->fx_line);
1574           insn =
1575             d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP);
1576           bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1577         }
1578       break;
1579     case BFD_RELOC_32:
1580       bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1581       break;
1582     case BFD_RELOC_16:
1583       bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1584       break;
1585
1586     case BFD_RELOC_VTABLE_INHERIT:
1587     case BFD_RELOC_VTABLE_ENTRY:
1588       fixP->fx_done = 0;
1589       return;
1590
1591     default:
1592       as_fatal (_("line %d: unknown relocation type: 0x%x"),
1593                 fixP->fx_line, fixP->fx_r_type);
1594     }
1595 }
1596
1597 /* d10v_cleanup() is called after the assembler has finished parsing
1598    the input file, when a label is read from the input file, or when a
1599    stab directive is output.  Because the D10V assembler sometimes
1600    saves short instructions to see if it can package them with the
1601    next instruction, there may be a short instruction that still needs
1602    to be written.
1603
1604    NOTE: accesses a global, etype.
1605    NOTE: invoked by various macros such as md_cleanup: see.  */
1606
1607 int
1608 d10v_cleanup (void)
1609 {
1610   segT seg;
1611   subsegT subseg;
1612
1613   /* If cleanup was invoked because the assembler encountered, e.g., a
1614      user label, we write out the pending instruction, if any.  If it
1615      was invoked because the assembler is outputting a piece of line
1616      debugging information, though, we write out the pending
1617      instruction only if the --no-gstabs-packing command line switch
1618      has been specified.  */
1619   if (prev_opcode
1620       && etype == PACK_UNSPEC
1621       && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing))
1622     {
1623       seg = now_seg;
1624       subseg = now_subseg;
1625
1626       if (prev_seg)
1627         subseg_set (prev_seg, prev_subseg);
1628
1629       write_1_short (prev_opcode, prev_insn, fixups->next);
1630       subseg_set (seg, subseg);
1631       prev_opcode = NULL;
1632     }
1633   return 1;
1634 }
1635
1636 void
1637 d10v_frob_label (symbolS *lab)
1638 {
1639   d10v_cleanup ();
1640   symbol_set_frag (lab, frag_now);
1641   S_SET_VALUE (lab, (valueT) frag_now_fix ());
1642   dwarf2_emit_label (lab);
1643 }
1644
1645 /* Like normal .word, except support @word.
1646    Clobbers input_line_pointer, checks end-of-line.  */
1647
1648 static void
1649 d10v_dot_word (int dummy ATTRIBUTE_UNUSED)
1650 {
1651   expressionS exp;
1652   char *p;
1653
1654   if (is_it_end_of_statement ())
1655     {
1656       demand_empty_rest_of_line ();
1657       return;
1658     }
1659
1660   do
1661     {
1662       expression (&exp);
1663       if (!strncasecmp (input_line_pointer, "@word", 5))
1664         {
1665           exp.X_add_number = 0;
1666           input_line_pointer += 5;
1667
1668           p = frag_more (2);
1669           fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1670                        &exp, 0, BFD_RELOC_D10V_18);
1671         }
1672       else
1673         emit_expr (&exp, 2);
1674     }
1675   while (*input_line_pointer++ == ',');
1676
1677   input_line_pointer--;         /* Put terminator back into stream.  */
1678   demand_empty_rest_of_line ();
1679 }
1680
1681 /* Mitsubishi asked that we support some old syntax that apparently
1682    had immediate operands starting with '#'.  This is in some of their
1683    sample code but is not documented (although it appears in some
1684    examples in their assembler manual). For now, we'll solve this
1685    compatibility problem by simply ignoring any '#' at the beginning
1686    of an operand.  */
1687
1688 /* Operands that begin with '#' should fall through to here.
1689    From expr.c.  */
1690
1691 void
1692 md_operand (expressionS *expressionP)
1693 {
1694   if (*input_line_pointer == '#' && ! do_not_ignore_hash)
1695     {
1696       input_line_pointer++;
1697       expression (expressionP);
1698     }
1699 }
1700
1701 bfd_boolean
1702 d10v_fix_adjustable (fixS *fixP)
1703 {
1704   /* We need the symbol name for the VTABLE entries.  */
1705   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1706       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1707     return 0;
1708
1709   return 1;
1710 }
1711
1712 /* The target specific pseudo-ops which we support.  */
1713 const pseudo_typeS md_pseudo_table[] =
1714 {
1715   { "word",     d10v_dot_word,  2 },
1716   { NULL,       NULL,           0 }
1717 };
1718
1719 void
1720 md_assemble (char *str)
1721 {
1722   /* etype is saved extype.  For multi-line instructions.  */
1723   packing_type extype = PACK_UNSPEC;            /* Parallel, etc.  */
1724   struct d10v_opcode *opcode;
1725   unsigned long insn;
1726   char *str2;
1727
1728   if (etype == PACK_UNSPEC)
1729     {
1730       /* Look for the special multiple instruction separators.  */
1731       str2 = strstr (str, "||");
1732       if (str2)
1733         extype = PACK_PARALLEL;
1734       else
1735         {
1736           str2 = strstr (str, "->");
1737           if (str2)
1738             extype = PACK_LEFT_RIGHT;
1739           else
1740             {
1741               str2 = strstr (str, "<-");
1742               if (str2)
1743                 extype = PACK_RIGHT_LEFT;
1744             }
1745         }
1746
1747       /* str2 points to the separator, if there is one.  */
1748       if (str2)
1749         {
1750           *str2 = 0;
1751
1752           /* If two instructions are present and we already have one saved,
1753              then first write out the saved one.  */
1754           d10v_cleanup ();
1755
1756           /* Assemble first instruction and save it.  */
1757           prev_insn = do_assemble (str, &prev_opcode);
1758           prev_seg = now_seg;
1759           prev_subseg = now_subseg;
1760           if (prev_insn == (unsigned long) -1)
1761             as_fatal (_("can't find previous opcode "));
1762           fixups = fixups->next;
1763           str = str2 + 2;
1764         }
1765     }
1766
1767   insn = do_assemble (str, &opcode);
1768   if (insn == (unsigned long) -1)
1769     {
1770       if (extype != PACK_UNSPEC)
1771         etype = extype;
1772       else
1773         as_bad (_("could not assemble: %s"), str);
1774       return;
1775     }
1776
1777   if (etype != PACK_UNSPEC)
1778     {
1779       extype = etype;
1780       etype = PACK_UNSPEC;
1781     }
1782
1783   /* If this is a long instruction, write it and any previous short
1784      instruction.  */
1785   if (opcode->format & LONG_OPCODE)
1786     {
1787       if (extype != PACK_UNSPEC)
1788         as_fatal (_("Unable to mix instructions as specified"));
1789       d10v_cleanup ();
1790       write_long (insn, fixups);
1791       prev_opcode = NULL;
1792       return;
1793     }
1794
1795   if (prev_opcode
1796       && prev_seg
1797       && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1798     d10v_cleanup ();
1799
1800   if (prev_opcode
1801       && (0 == write_2_short (prev_opcode, prev_insn, opcode, insn, extype,
1802                               fixups)))
1803     {
1804       /* No instructions saved.  */
1805       prev_opcode = NULL;
1806     }
1807   else
1808     {
1809       if (extype != PACK_UNSPEC)
1810         as_fatal (_("Unable to mix instructions as specified"));
1811       /* Save last instruction so it may be packed on next pass.  */
1812       prev_opcode = opcode;
1813       prev_insn = insn;
1814       prev_seg = now_seg;
1815       prev_subseg = now_subseg;
1816       fixups = fixups->next;
1817     }
1818 }
1819