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