* config/tc-d10v.c (find_opcode): Reject non-SP operand if
[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               || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1281             {
1282               as_bad (_("bad opcode or operands"));
1283               return 0;
1284             }
1285         }
1286
1287       if (myops[opnum].X_op == O_constant
1288           || (myops[opnum].X_op == O_symbol
1289               && S_IS_DEFINED (myops[opnum].X_add_symbol)
1290               && (S_GET_SEGMENT (myops[opnum].X_add_symbol) == now_seg)))
1291         {
1292           for (i = 0; opcode->operands[i + 1]; i++)
1293             {
1294               int bits = d10v_operands[next_opcode->operands[opnum]].bits;
1295               int flags = d10v_operands[next_opcode->operands[opnum]].flags;
1296               if (flags & OPERAND_ADDR)
1297                 bits += 2;
1298
1299               if (myops[opnum].X_op == O_constant)
1300                 {
1301                   if (!check_range (myops[opnum].X_add_number, bits, flags))
1302                     return next_opcode;
1303                 }
1304               else
1305                 {
1306                   fragS *sym_frag;
1307                   fragS *f;
1308                   unsigned long current_position;
1309                   unsigned long symbol_position;
1310                   unsigned long value;
1311                   boolean found_symbol;
1312
1313                   /* Calculate the address of the current instruction
1314                      and the address of the symbol.  Do this by summing
1315                      the offsets of previous frags until we reach the
1316                      frag containing the symbol, and the current frag.  */
1317                   sym_frag = symbol_get_frag (myops[opnum].X_add_symbol);
1318                   found_symbol = false;
1319
1320                   current_position =
1321                     obstack_next_free (&frchain_now->frch_obstack)
1322                     - frag_now->fr_literal;
1323                   symbol_position = S_GET_VALUE (myops[opnum].X_add_symbol);
1324
1325                   for (f = frchain_now->frch_root; f; f = f->fr_next)
1326                     {
1327                       current_position += f->fr_fix + f->fr_offset;
1328
1329                       if (f == sym_frag)
1330                         found_symbol = true;
1331
1332                       if (! found_symbol)
1333                         symbol_position += f->fr_fix + f->fr_offset;
1334                     }
1335
1336                   value = symbol_position;
1337
1338                   if (flags & OPERAND_ADDR)
1339                     value -= current_position;
1340
1341                   if (AT_WORD_P (&myops[opnum]))
1342                     {
1343                       if (bits > 4)
1344                         {
1345                           bits += 2;
1346                           if (!check_range (value, bits, flags))
1347                             return next_opcode;
1348                         }
1349                     }
1350                   else if (!check_range (value, bits, flags))
1351                     return next_opcode;
1352                 }
1353               next_opcode++;
1354             }
1355           as_fatal (_("value out of range"));
1356         }
1357       else
1358         {
1359           /* Not a constant, so use a long instruction.  */
1360           return opcode + 2;
1361         }
1362     }
1363   else
1364     {
1365       match = 0;
1366       /* Now search the opcode table table for one with operands
1367          that matches what we've got.  */
1368       while (!match)
1369         {
1370           match = 1;
1371           for (i = 0; opcode->operands[i]; i++)
1372             {
1373               int flags = d10v_operands[opcode->operands[i]].flags;
1374               int X_op = myops[i].X_op;
1375               int num = myops[i].X_add_number;
1376
1377               if (X_op == 0)
1378                 {
1379                   match = 0;
1380                   break;
1381                 }
1382
1383               if (flags & OPERAND_REG)
1384                 {
1385                   if ((X_op != O_register)
1386                       || (num & ~flags
1387                           & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1
1388                              | OPERAND_FFLAG | OPERAND_CFLAG
1389                              | OPERAND_CONTROL))
1390                       || ((flags & OPERAND_SP) && ! (num & OPERAND_SP)))
1391                     {
1392                       match = 0;
1393                       break;
1394                     }
1395                 }
1396
1397               if (((flags & OPERAND_MINUS)   && ((X_op != O_absent) || (num != OPERAND_MINUS))) ||
1398                   ((flags & OPERAND_PLUS)    && ((X_op != O_absent) || (num != OPERAND_PLUS))) ||
1399                   ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) ||
1400                   ((flags & OPERAND_ATPAR)   && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
1401                   ((flags & OPERAND_ATSIGN)  && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR)))))
1402                 {
1403                   match = 0;
1404                   break;
1405                 }
1406
1407               /* Unfortunatly, for the indirect operand in
1408                  instructions such as ``ldb r1, @(c,r14)'' this
1409                  function can be passed X_op == O_register (because
1410                  'c' is a valid register name).  However we cannot
1411                  just ignore the case when X_op == O_register but
1412                  flags & OPERAND_REG is null, so we check to see if a
1413                  symbol of the same name as the register exists.  If
1414                  the symbol does exist, then the parser was unable to
1415                  distinguish the two cases and we fix things here.
1416                  (Ref: PR14826)  */
1417
1418               if (!(flags & OPERAND_REG) && (X_op == O_register))
1419                 {
1420                   symbolS *sym = find_symbol_matching_register (&myops[i]);
1421
1422                   if (sym != NULL)
1423                     {
1424                       myops[i].X_op = X_op = O_symbol;
1425                       myops[i].X_add_symbol = sym;
1426                     }
1427                   else
1428                     as_bad
1429                       (_("illegal operand - register name found where none expected"));
1430                 }
1431             }
1432
1433           /* We're only done if the operands matched so far AND there
1434              are no more to check.  */
1435           if (match && myops[i].X_op == 0)
1436             break;
1437           else
1438             match = 0;
1439
1440           next_opcode = opcode + 1;
1441
1442           if (next_opcode->opcode == 0)
1443             break;
1444
1445           if (strcmp (next_opcode->name, opcode->name))
1446             break;
1447
1448           opcode = next_opcode;
1449         }
1450     }
1451
1452   if (!match)
1453     {
1454       as_bad (_("bad opcode or operands"));
1455       return (0);
1456     }
1457
1458   /* Check that all registers that are required to be even are.
1459      Also, if any operands were marked as registers, but were really symbols,
1460      fix that here.  */
1461   for (i = 0; opcode->operands[i]; i++)
1462     {
1463       if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) &&
1464           (myops[i].X_add_number & 1))
1465         as_fatal (_("Register number must be EVEN"));
1466       if (myops[i].X_op == O_register)
1467         {
1468           if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG))
1469             {
1470               myops[i].X_op = O_symbol;
1471               myops[i].X_add_symbol =
1472                 symbol_find_or_make ((char *) myops[i].X_op_symbol);
1473               myops[i].X_add_number = 0;
1474               myops[i].X_op_symbol = NULL;
1475             }
1476         }
1477     }
1478   return opcode;
1479 }
1480
1481 /* If while processing a fixup, a reloc really needs to be created.
1482    Then it is done here.  */
1483
1484 arelent *
1485 tc_gen_reloc (seg, fixp)
1486      asection *seg ATTRIBUTE_UNUSED;
1487      fixS *fixp;
1488 {
1489   arelent *reloc;
1490   reloc = (arelent *) xmalloc (sizeof (arelent));
1491   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1492   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1493   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1494   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1495   if (reloc->howto == (reloc_howto_type *) NULL)
1496     {
1497       as_bad_where (fixp->fx_file, fixp->fx_line,
1498                     _("reloc %d not supported by object file format"),
1499                     (int) fixp->fx_r_type);
1500       return NULL;
1501     }
1502
1503   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1504       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1505     reloc->address = fixp->fx_offset;
1506
1507   reloc->addend = fixp->fx_addnumber;
1508
1509   return reloc;
1510 }
1511
1512 int
1513 md_estimate_size_before_relax (fragp, seg)
1514      fragS *fragp ATTRIBUTE_UNUSED;
1515      asection *seg ATTRIBUTE_UNUSED;
1516 {
1517   abort ();
1518   return 0;
1519 }
1520
1521 long
1522 md_pcrel_from_section (fixp, sec)
1523      fixS *fixp;
1524      segT sec;
1525 {
1526   if (fixp->fx_addsy != (symbolS *) NULL
1527       && (!S_IS_DEFINED (fixp->fx_addsy)
1528           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1529     return 0;
1530   return fixp->fx_frag->fr_address + fixp->fx_where;
1531 }
1532
1533 void
1534 md_apply_fix3 (fixP, valP, seg)
1535      fixS *fixP;
1536      valueT * valP;
1537      segT seg ATTRIBUTE_UNUSED;
1538 {
1539   char *where;
1540   unsigned long insn;
1541   long value = * (long *) valP;
1542   int op_type;
1543   int left = 0;
1544
1545   if (fixP->fx_addsy == (symbolS *) NULL)
1546     fixP->fx_done = 1;
1547
1548   else if (fixP->fx_pcrel)
1549     ;
1550
1551   else
1552     {
1553       value = fixP->fx_offset;
1554
1555       if (fixP->fx_subsy != (symbolS *) NULL)
1556         {
1557           if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)
1558             value -= S_GET_VALUE (fixP->fx_subsy);
1559           else
1560             {
1561               /* We don't actually support subtracting a symbol.  */
1562               as_bad_where (fixP->fx_file, fixP->fx_line,
1563                             _("expression too complex"));
1564             }
1565         }
1566     }
1567
1568   op_type = fixP->fx_r_type;
1569   if (op_type & 2048)
1570     {
1571       op_type -= 2048;
1572       if (op_type & 1024)
1573         {
1574           op_type -= 1024;
1575           fixP->fx_r_type = BFD_RELOC_D10V_10_PCREL_L;
1576           left = 1;
1577         }
1578       else if (op_type & 4096)
1579         {
1580           op_type -= 4096;
1581           fixP->fx_r_type = BFD_RELOC_D10V_18;
1582         }
1583       else
1584         fixP->fx_r_type =
1585           get_reloc ((struct d10v_operand *) &d10v_operands[op_type]);
1586     }
1587
1588   /* Fetch the instruction, insert the fully resolved operand
1589      value, and stuff the instruction back again.  */
1590   where = fixP->fx_frag->fr_literal + fixP->fx_where;
1591   insn = bfd_getb32 ((unsigned char *) where);
1592
1593   switch (fixP->fx_r_type)
1594     {
1595     case BFD_RELOC_D10V_10_PCREL_L:
1596     case BFD_RELOC_D10V_10_PCREL_R:
1597     case BFD_RELOC_D10V_18_PCREL:
1598     case BFD_RELOC_D10V_18:
1599       /* Instruction addresses are always right-shifted by 2.  */
1600       value >>= AT_WORD_RIGHT_SHIFT;
1601       if (fixP->fx_size == 2)
1602         bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1603       else
1604         {
1605           struct d10v_opcode *rep, *repi;
1606
1607           rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep");
1608           repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi");
1609           if ((insn & FM11) == FM11
1610               && (  (repi != NULL && (insn & repi->mask) == (unsigned) repi->opcode)
1611                   || (rep != NULL && (insn & rep->mask) == (unsigned) rep->opcode))
1612               && value < 4)
1613             as_fatal
1614               (_("line %d: rep or repi must include at least 4 instructions"),
1615                fixP->fx_line);
1616           insn =
1617             d10v_insert_operand (insn, op_type, (offsetT) value, left, fixP);
1618           bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1619         }
1620       break;
1621     case BFD_RELOC_32:
1622       bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1623       break;
1624     case BFD_RELOC_16:
1625       bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1626       break;
1627
1628     case BFD_RELOC_VTABLE_INHERIT:
1629     case BFD_RELOC_VTABLE_ENTRY:
1630       fixP->fx_done = 0;
1631       return;
1632
1633     default:
1634       as_fatal (_("line %d: unknown relocation type: 0x%x"),
1635                 fixP->fx_line, fixP->fx_r_type);
1636     }
1637 }
1638
1639 /* d10v_cleanup() is called after the assembler has finished parsing
1640    the input file, when a label is read from the input file, or when a
1641    stab directive is output.  Because the D10V assembler sometimes
1642    saves short instructions to see if it can package them with the
1643    next instruction, there may be a short instruction that still needs
1644    to be written.
1645
1646    NOTE: accesses a global, etype.
1647    NOTE: invoked by various macros such as md_cleanup: see.  */
1648
1649 int
1650 d10v_cleanup ()
1651 {
1652   segT seg;
1653   subsegT subseg;
1654
1655   /* If cleanup was invoked because the assembler encountered, e.g., a
1656      user label, we write out the pending instruction, if any.  If it
1657      was invoked because the assembler is outputting a piece of line
1658      debugging information, though, we write out the pending
1659      instruction only if the --no-gstabs-packing command line switch
1660      has been specified.  */
1661   if (prev_opcode
1662       && etype == PACK_UNSPEC
1663       && (! outputting_stabs_line_debug || ! flag_allow_gstabs_packing))
1664     {
1665       seg = now_seg;
1666       subseg = now_subseg;
1667
1668       if (prev_seg)
1669         subseg_set (prev_seg, prev_subseg);
1670
1671       write_1_short (prev_opcode, prev_insn, fixups->next);
1672
1673       subseg_set (seg, subseg);
1674       prev_opcode = NULL;
1675     }
1676   return 1;
1677 }
1678
1679 /* Like normal .word, except support @word.  */
1680 /* Clobbers input_line_pointer, checks end-of-line.  */
1681
1682 static void
1683 d10v_dot_word (dummy)
1684      int dummy ATTRIBUTE_UNUSED;
1685 {
1686   expressionS exp;
1687   char *p;
1688
1689   if (is_it_end_of_statement ())
1690     {
1691       demand_empty_rest_of_line ();
1692       return;
1693     }
1694
1695   do
1696     {
1697       expression (&exp);
1698       if (!strncasecmp (input_line_pointer, "@word", 5))
1699         {
1700           exp.X_add_number = 0;
1701           input_line_pointer += 5;
1702
1703           p = frag_more (2);
1704           fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
1705                        &exp, 0, BFD_RELOC_D10V_18);
1706         }
1707       else
1708         emit_expr (&exp, 2);
1709     }
1710   while (*input_line_pointer++ == ',');
1711
1712   input_line_pointer--;         /* Put terminator back into stream.  */
1713   demand_empty_rest_of_line ();
1714 }
1715
1716 /* Mitsubishi asked that we support some old syntax that apparently
1717    had immediate operands starting with '#'.  This is in some of their
1718    sample code but is not documented (although it appears in some
1719    examples in their assembler manual). For now, we'll solve this
1720    compatibility problem by simply ignoring any '#' at the beginning
1721    of an operand.  */
1722
1723 /* Operands that begin with '#' should fall through to here.  */
1724 /* From expr.c.  */
1725
1726 void
1727 md_operand (expressionP)
1728      expressionS *expressionP;
1729 {
1730   if (*input_line_pointer == '#' && ! do_not_ignore_hash)
1731     {
1732       input_line_pointer++;
1733       expression (expressionP);
1734     }
1735 }
1736
1737 boolean
1738 d10v_fix_adjustable (fixP)
1739      fixS *fixP;
1740 {
1741   if (fixP->fx_addsy == NULL)
1742     return 1;
1743
1744   /* Prevent all adjustments to global symbols.  */
1745   if (S_IS_EXTERN (fixP->fx_addsy))
1746     return 0;
1747   if (S_IS_WEAK (fixP->fx_addsy))
1748     return 0;
1749
1750   /* We need the symbol name for the VTABLE entries.  */
1751   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1752       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1753     return 0;
1754
1755   return 1;
1756 }
1757
1758 int
1759 d10v_force_relocation (fixp)
1760      fixS *fixp;
1761 {
1762   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1763       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1764     return 1;
1765
1766   return 0;
1767 }