gas/
[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               int flags = d10v_operands[next_opcode->operands[opnum]].flags;
1205               if (flags & OPERAND_ADDR)
1206                 bits += 2;
1207
1208               if (myops[opnum].X_op == O_constant)
1209                 {
1210                   if (!check_range (myops[opnum].X_add_number, bits, flags))
1211                     break;
1212                 }
1213               else
1214                 {
1215                   fragS *sym_frag;
1216                   fragS *f;
1217                   unsigned long current_position;
1218                   unsigned long symbol_position;
1219                   unsigned long value;
1220                   bfd_boolean found_symbol;
1221
1222                   /* Calculate the address of the current instruction
1223                      and the address of the symbol.  Do this by summing
1224                      the offsets of previous frags until we reach the
1225                      frag containing the symbol, and the current frag.  */
1226                   sym_frag = symbol_get_frag (myops[opnum].X_add_symbol);
1227                   found_symbol = FALSE;
1228
1229                   current_position =
1230                     obstack_next_free (&frchain_now->frch_obstack)
1231                     - frag_now->fr_literal;
1232                   symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol);
1233
1234                   for (f = frchain_now->frch_root; f; f = f->fr_next)
1235                     {
1236                       current_position += f->fr_fix + f->fr_offset;
1237
1238                       if (f == sym_frag)
1239                         found_symbol = TRUE;
1240
1241                       if (! found_symbol)
1242                         symbol_position += f->fr_fix + f->fr_offset;
1243                     }
1244
1245                   value = symbol_position;
1246
1247                   if (flags & OPERAND_ADDR)
1248                     value -= current_position;
1249
1250                   if (AT_WORD_P (&myops[opnum]))
1251                     {
1252                       if (bits > 4)
1253                         {
1254                           bits += 2;
1255                           if (!check_range (value, bits, flags))
1256                             break;
1257                         }
1258                     }
1259                   else if (!check_range (value, bits, flags))
1260                     break;
1261                 }
1262               next_opcode++;
1263             }
1264
1265           if (opcode->operands [i + 1] == 0)
1266             as_fatal (_("value out of range"));
1267           else
1268             opcode = next_opcode;
1269         }
1270       else
1271         /* Not a constant, so use a long instruction.  */
1272         opcode += 2;
1273     }
1274
1275   match = 0;
1276
1277   /* Now search the opcode table table for one with operands
1278      that matches what we've got.  */
1279   while (!match)
1280     {
1281       match = 1;
1282       for (i = 0; opcode->operands[i]; i++)
1283         {
1284           int flags = d10v_operands[opcode->operands[i]].flags;
1285           int X_op = myops[i].X_op;
1286           int num = myops[i].X_add_number;
1287
1288           if (X_op == 0)
1289             {
1290               match = 0;
1291               break;
1292             }
1293
1294           if (flags & OPERAND_REG)
1295             {
1296               if ((X_op != O_register)
1297                   || (num & ~flags
1298                       & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1299                          | OPERAND_FFLAG | OPERAND_CFLAG
1300                          | OPERAND_CONTROL))
1301                   || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1302                 {
1303                   match = 0;
1304                   break;
1305                 }
1306             }
1307
1308           if (((flags & OPERAND_MINUS)   && ((X_op != O_absent) || (num != OPERAND_MINUS))) ||
1309               ((flags & OPERAND_PLUS)    && ((X_op != O_absent) || (num != OPERAND_PLUS))) ||
1310               ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) ||
1311               ((flags & OPERAND_ATPAR)   && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
1312               ((flags & OPERAND_ATSIGN)  && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR)))))
1313             {
1314               match = 0;
1315               break;
1316             }
1317
1318           /* Unfortunately, for the indirect operand in instructions such
1319              as ``ldb r1, @(c,r14)'' this function can be passed
1320              X_op == O_register (because 'c' is a valid register name).
1321              However we cannot just ignore the case when X_op == O_register
1322              but flags & OPERAND_REG is null, so we check to see if a symbol
1323              of the same name as the register exists.  If the symbol does
1324              exist, then the parser was unable to distinguish the two cases
1325              and we fix things here. (Ref: PR14826)  */
1326
1327           if (!(flags & OPERAND_REG) && (X_op == O_register))
1328             {
1329               symbolS * sym;
1330
1331               sym = find_symbol_matching_register (& myops[i]);
1332
1333               if (sym != NULL)
1334                 {
1335                   myops[i].X_op = X_op = O_symbol;
1336                   myops[i].X_add_symbol = sym;
1337                 }
1338               else
1339                 as_bad
1340                   (_("illegal operand - register name found where none expected"));
1341             }
1342         }
1343
1344       /* We're only done if the operands matched so far AND there
1345              are no more to check.  */
1346       if (match && myops[i].X_op == 0)
1347         break;
1348       else
1349         match = 0;
1350
1351       next_opcode = opcode + 1;
1352
1353       if (next_opcode->opcode == 0)
1354         break;
1355
1356       if (strcmp (next_opcode->name, opcode->name))
1357         break;
1358
1359       opcode = next_opcode;
1360     }
1361
1362   if (!match)
1363     {
1364       as_bad (_("bad opcode or operands"));
1365       return 0;
1366     }
1367
1368   /* Check that all registers that are required to be even are.
1369      Also, if any operands were marked as registers, but were really symbols,
1370      fix that here.  */
1371   for (i = 0; opcode->operands[i]; i++)
1372     {
1373       if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
1374           (myops[i].X_add_number & 1))
1375         as_fatal (_("Register number must be EVEN"));
1376       if ((d10v_operands[opcode->operands[i]].flags & OPERAND_NOSP)
1377           && (myops[i].X_add_number & OPERAND_SP))
1378         as_bad (_("Unsupported use of sp"));
1379       if (myops[i].X_op == O_register)
1380         {
1381           if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
1382             {
1383               myops[i].X_op = O_symbol;
1384               myops[i].X_add_symbol =
1385                 symbol_find_or_make ((char *) myops[i].X_op_symbol);
1386               myops[i].X_add_number = 0;
1387               myops[i].X_op_symbol = NULL;
1388             }
1389         }
1390       if ((d10v_operands[opcode->operands[i]].flags & OPERAND_CONTROL)
1391           && (myops[i].X_add_number == OPERAND_CONTROL + 4
1392               || myops[i].X_add_number == OPERAND_CONTROL + 5
1393               || myops[i].X_add_number == OPERAND_CONTROL + 6
1394               || myops[i].X_add_number == OPERAND_CONTROL + 12
1395               || myops[i].X_add_number == OPERAND_CONTROL + 13
1396               || myops[i].X_add_number == OPERAND_CONTROL + 15))
1397         as_warn (_("cr%ld is a reserved control register"),
1398                  myops[i].X_add_number - OPERAND_CONTROL);
1399     }
1400   return opcode;
1401 }
1402
1403 /* Assemble a single instruction.
1404    Return an opcode, or -1 (an invalid opcode) on error.  */
1405
1406 static unsigned long
1407 do_assemble (char *str, struct d10v_opcode **opcode)
1408 {
1409   unsigned char *op_start, *op_end;
1410   char *save;
1411   char name[20];
1412   int nlen = 0;
1413   expressionS myops[6];
1414
1415   /* Drop leading whitespace.  */
1416   while (*str == ' ')
1417     str++;
1418
1419   /* Find the opcode end.  */
1420   for (op_start = op_end = (unsigned char *) str;
1421        *op_end && nlen < 20 && !is_end_of_line[*op_end] && *op_end != ' ';
1422        op_end++)
1423     {
1424       name[nlen] = TOLOWER (op_start[nlen]);
1425       nlen++;
1426     }
1427   name[nlen] = 0;
1428
1429   if (nlen == 0)
1430     return -1;
1431
1432   /* Find the first opcode with the proper name.  */
1433   *opcode = (struct d10v_opcode *) hash_find (d10v_hash, name);
1434   if (*opcode == NULL)
1435     return -1;
1436
1437   save = input_line_pointer;
1438   input_line_pointer = (char *) op_end;
1439   *opcode = find_opcode (*opcode, myops);
1440   if (*opcode == 0)
1441     return -1;
1442   input_line_pointer = save;
1443
1444   return build_insn ((*opcode), myops, 0);
1445 }
1446
1447 /* If while processing a fixup, a reloc really needs to be created.
1448    Then it is done here.  */
1449
1450 arelent *
1451 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1452 {
1453   arelent *reloc;
1454   reloc = xmalloc (sizeof (arelent));
1455   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1456   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1457   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1458   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1459   if (reloc->howto == (reloc_howto_type *) NULL)
1460     {
1461       as_bad_where (fixp->fx_file, fixp->fx_line,
1462                     _("reloc %d not supported by object file format"),
1463                     (int) fixp->fx_r_type);
1464       return NULL;
1465     }
1466
1467   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1468     reloc->address = fixp->fx_offset;
1469
1470   reloc->addend = 0;
1471
1472   return reloc;
1473 }
1474
1475 int
1476 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1477                                asection *seg ATTRIBUTE_UNUSED)
1478 {
1479   abort ();
1480   return 0;
1481 }
1482
1483 long
1484 md_pcrel_from_section (fixS *fixp, segT sec)
1485 {
1486   if (fixp->fx_addsy != (symbolS *) NULL
1487       && (!S_IS_DEFINED (fixp->fx_addsy)
1488           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1489     return 0;
1490   return fixp->fx_frag->fr_address + fixp->fx_where;
1491 }
1492
1493 void
1494 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1495 {
1496   char *where;
1497   unsigned long insn;
1498   long value = *valP;
1499   int op_type;
1500   int left = 0;
1501
1502   if (fixP->fx_addsy == (symbolS *) NULL)
1503     fixP->fx_done = 1;
1504
1505   /* We don't actually support subtracting a symbol.  */
1506   if (fixP->fx_subsy != (symbolS *) NULL)
1507     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1508
1509   op_type = fixP->fx_r_type;
1510   if (op_type & 2048)
1511     {
1512       op_type -= 2048;
1513       if (op_type & 1024)
1514         {
1515           op_type -= 1024;
1516           fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1517           left = 1;
1518         }
1519       else if (op_type & 4096)
1520         {
1521           op_type -= 4096;
1522           fixP->fx_r_type = BFD_RELOC_D10V_18;
1523         }
1524       else
1525         fixP->fx_r_type =
1526           get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
1527     }
1528
1529   /* Fetch the instruction, insert the fully resolved operand
1530      value, and stuff the instruction back again.  */
1531   where = fixP->fx_frag->fr_literal + fixP->fx_where;
1532   insn = bfd_getb32 ((unsigned char *) where);
1533
1534   switch (fixP->fx_r_type)
1535     {
1536     case BFD_RELOC_D10V_10_PCREL_L:
1537     case BFD_RELOC_D10V_10_PCREL_R:
1538     case BFD_RELOC_D10V_18_PCREL:
1539       /* If the fix is relative to a global symbol, not a section
1540          symbol, then ignore the offset.
1541          XXX - Do we have to worry about branches to a symbol + offset ?  */
1542       if (fixP->fx_addsy != NULL
1543           && S_IS_EXTERNAL (fixP->fx_addsy) )
1544         {
1545           segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
1546           segment_info_type *segf = seg_info(fseg);
1547
1548           if ( segf && segf->sym != fixP->fx_addsy)
1549             value = 0;
1550         }
1551       /* Drop through.  */
1552     case BFD_RELOC_D10V_18:
1553       /* Instruction addresses are always right-shifted by 2.  */
1554       value >>= AT_WORD_RIGHT_SHIFT;
1555       if (fixP->fx_size == 2)
1556         bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1557       else
1558         {
1559           struct d10v_opcode *rep, *repi;
1560
1561           rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep");
1562           repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi");
1563           if ((insn & FM11) == FM11
1564               && ((repi != NULL
1565                    && (insn & repi->mask) == (unsigned) repi->opcode)
1566                   || (rep != NULL
1567                       && (insn & rep->mask) == (unsigned) rep->opcode))
1568               && value < 4)
1569             as_fatal
1570               (_("line %d: rep or repi must include at least 4 instructions"),
1571                fixP->fx_line);
1572           insn =
1573             d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP);
1574           bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1575         }
1576       break;
1577     case BFD_RELOC_32:
1578       bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1579       break;
1580     case BFD_RELOC_16:
1581       bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1582       break;
1583
1584     case BFD_RELOC_VTABLE_INHERIT:
1585     case BFD_RELOC_VTABLE_ENTRY:
1586       fixP->fx_done = 0;
1587       return;
1588
1589     default:
1590       as_fatal (_("line %d: unknown relocation type: 0x%x"),
1591                 fixP->fx_line, fixP->fx_r_type);
1592     }
1593 }
1594
1595 /* d10v_cleanup() is called after the assembler has finished parsing
1596    the input file, when a label is read from the input file, or when a
1597    stab directive is output.  Because the D10V assembler sometimes
1598    saves short instructions to see if it can package them with the
1599    next instruction, there may be a short instruction that still needs
1600    to be written.
1601
1602    NOTE: accesses a global, etype.
1603    NOTE: invoked by various macros such as md_cleanup: see.  */
1604
1605 int
1606 d10v_cleanup (void)
1607 {
1608   segT seg;
1609   subsegT subseg;
1610
1611   /* If cleanup was invoked because the assembler encountered, e.g., a
1612      user label, we write out the pending instruction, if any.  If it
1613      was invoked because the assembler is outputting a piece of line
1614      debugging information, though, we write out the pending
1615      instruction only if the --no-gstabs-packing command line switch
1616      has been specified.  */
1617   if (prev_opcode
1618       && etype == PACK_UNSPEC
1619       && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing))
1620     {
1621       seg = now_seg;
1622       subseg = now_subseg;
1623
1624       if (prev_seg)
1625         subseg_set (prev_seg, prev_subseg);
1626
1627       write_1_short (prev_opcode, prev_insn, fixups->next);
1628       subseg_set (seg, subseg);
1629       prev_opcode = NULL;
1630     }
1631   return 1;
1632 }
1633
1634 void
1635 d10v_frob_label (symbolS *lab)
1636 {
1637   d10v_cleanup ();
1638   symbol_set_frag (lab, frag_now);
1639   S_SET_VALUE (lab, (valueT) frag_now_fix ());
1640   dwarf2_emit_label (lab);
1641 }
1642
1643 /* Like normal .word, except support @word.
1644    Clobbers input_line_pointer, checks end-of-line.  */
1645
1646 static void
1647 d10v_dot_word (int dummy ATTRIBUTE_UNUSED)
1648 {
1649   expressionS exp;
1650   char *p;
1651
1652   if (is_it_end_of_statement ())
1653     {
1654       demand_empty_rest_of_line ();
1655       return;
1656     }
1657
1658   do
1659     {
1660       expression (&exp);
1661       if (!strncasecmp (input_line_pointer, "@word", 5))
1662         {
1663           exp.X_add_number = 0;
1664           input_line_pointer += 5;
1665
1666           p = frag_more (2);
1667           fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1668                        &exp, 0, BFD_RELOC_D10V_18);
1669         }
1670       else
1671         emit_expr (&exp, 2);
1672     }
1673   while (*input_line_pointer++ == ',');
1674
1675   input_line_pointer--;         /* Put terminator back into stream.  */
1676   demand_empty_rest_of_line ();
1677 }
1678
1679 /* Mitsubishi asked that we support some old syntax that apparently
1680    had immediate operands starting with '#'.  This is in some of their
1681    sample code but is not documented (although it appears in some
1682    examples in their assembler manual). For now, we'll solve this
1683    compatibility problem by simply ignoring any '#' at the beginning
1684    of an operand.  */
1685
1686 /* Operands that begin with '#' should fall through to here.
1687    From expr.c.  */
1688
1689 void
1690 md_operand (expressionS *expressionP)
1691 {
1692   if (*input_line_pointer == '#' && ! do_not_ignore_hash)
1693     {
1694       input_line_pointer++;
1695       expression (expressionP);
1696     }
1697 }
1698
1699 bfd_boolean
1700 d10v_fix_adjustable (fixS *fixP)
1701 {
1702   /* We need the symbol name for the VTABLE entries.  */
1703   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1704       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1705     return 0;
1706
1707   return 1;
1708 }
1709
1710 /* The target specific pseudo-ops which we support.  */
1711 const pseudo_typeS md_pseudo_table[] =
1712 {
1713   { "word",     d10v_dot_word,  2 },
1714   { NULL,       NULL,           0 }
1715 };
1716
1717 void
1718 md_assemble (char *str)
1719 {
1720   /* etype is saved extype.  For multi-line instructions.  */
1721   packing_type extype = PACK_UNSPEC;            /* Parallel, etc.  */
1722   struct d10v_opcode *opcode;
1723   unsigned long insn;
1724   char *str2;
1725
1726   if (etype == PACK_UNSPEC)
1727     {
1728       /* Look for the special multiple instruction separators.  */
1729       str2 = strstr (str, "||");
1730       if (str2)
1731         extype = PACK_PARALLEL;
1732       else
1733         {
1734           str2 = strstr (str, "->");
1735           if (str2)
1736             extype = PACK_LEFT_RIGHT;
1737           else
1738             {
1739               str2 = strstr (str, "<-");
1740               if (str2)
1741                 extype = PACK_RIGHT_LEFT;
1742             }
1743         }
1744
1745       /* str2 points to the separator, if there is one.  */
1746       if (str2)
1747         {
1748           *str2 = 0;
1749
1750           /* If two instructions are present and we already have one saved,
1751              then first write out the saved one.  */
1752           d10v_cleanup ();
1753
1754           /* Assemble first instruction and save it.  */
1755           prev_insn = do_assemble (str, &prev_opcode);
1756           prev_seg = now_seg;
1757           prev_subseg = now_subseg;
1758           if (prev_insn == (unsigned long) -1)
1759             as_fatal (_("can't find previous opcode "));
1760           fixups = fixups->next;
1761           str = str2 + 2;
1762         }
1763     }
1764
1765   insn = do_assemble (str, &opcode);
1766   if (insn == (unsigned long) -1)
1767     {
1768       if (extype != PACK_UNSPEC)
1769         etype = extype;
1770       else
1771         as_bad (_("could not assemble: %s"), str);
1772       return;
1773     }
1774
1775   if (etype != PACK_UNSPEC)
1776     {
1777       extype = etype;
1778       etype = PACK_UNSPEC;
1779     }
1780
1781   /* If this is a long instruction, write it and any previous short
1782      instruction.  */
1783   if (opcode->format & LONG_OPCODE)
1784     {
1785       if (extype != PACK_UNSPEC)
1786         as_fatal (_("Unable to mix instructions as specified"));
1787       d10v_cleanup ();
1788       write_long (insn, fixups);
1789       prev_opcode = NULL;
1790       return;
1791     }
1792
1793   if (prev_opcode
1794       && prev_seg
1795       && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1796     d10v_cleanup ();
1797
1798   if (prev_opcode
1799       && (0 == write_2_short (prev_opcode, prev_insn, opcode, insn, extype,
1800                               fixups)))
1801     {
1802       /* No instructions saved.  */
1803       prev_opcode = NULL;
1804     }
1805   else
1806     {
1807       if (extype != PACK_UNSPEC)
1808         as_fatal (_("Unable to mix instructions as specified"));
1809       /* Save last instruction so it may be packed on next pass.  */
1810       prev_opcode = opcode;
1811       prev_insn = insn;
1812       prev_seg = now_seg;
1813       prev_subseg = now_subseg;
1814       fixups = fixups->next;
1815     }
1816 }
1817