opcodes/
[external/binutils.git] / gas / config / tc-d30v.c
1 /* tc-d30v.c -- Assembler code for the Mitsubishi D30V
2    Copyright 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3
4    This file is part of GAS, the GNU Assembler.
5
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to
18    the Free Software Foundation, 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 #include <stdio.h>
22 #include "as.h"
23 #include "safe-ctype.h"
24 #include "subsegs.h"
25 #include "opcode/d30v.h"
26
27 const char comment_chars[] = ";";
28 const char line_comment_chars[] = "#";
29 const char line_separator_chars[] = "";
30 const char *md_shortopts = "OnNcC";
31 const char EXP_CHARS[] = "eE";
32 const char FLT_CHARS[] = "dD";
33
34 #if HAVE_LIMITS_H
35 #include <limits.h>
36 #endif
37
38 #ifndef CHAR_BIT
39 #define CHAR_BIT 8
40 #endif
41
42 #define NOP_MULTIPLY 1
43 #define NOP_ALL 2
44 static int warn_nops = 0;
45 static int Optimizing = 0;
46 static int warn_register_name_conflicts = 1;
47
48 #define FORCE_SHORT     1
49 #define FORCE_LONG      2
50
51 /* EXEC types.  */
52 typedef enum _exec_type
53 {
54   EXEC_UNKNOWN,                 /* no order specified */
55   EXEC_PARALLEL,                /* done in parallel (FM=00) */
56   EXEC_SEQ,                     /* sequential (FM=01) */
57   EXEC_REVSEQ                   /* reverse sequential (FM=10) */
58 } exec_type_enum;
59
60 /* Fixups.  */
61 #define MAX_INSN_FIXUPS (5)
62 struct d30v_fixup
63 {
64   expressionS exp;
65   int operand;
66   int pcrel;
67   int size;
68   bfd_reloc_code_real_type reloc;
69 };
70
71 typedef struct _fixups
72 {
73   int fc;
74   struct d30v_fixup fix[MAX_INSN_FIXUPS];
75   struct _fixups *next;
76 } Fixups;
77
78 static Fixups FixUps[2];
79 static Fixups *fixups;
80
81 /* Whether current and previous instruction are word multiply insns.  */
82 static int cur_mul32_p = 0;
83 static int prev_mul32_p = 0;
84
85 /*  The flag_explicitly_parallel is true iff the instruction being assembled
86     has been explicitly written as a parallel short-instruction pair by the
87     human programmer.  It is used in parallel_ok () to distinguish between
88     those dangerous parallelizations attempted by the human, which are to be
89     allowed, and those attempted by the assembler, which are not.  It is set
90     from md_assemble ().  */
91 static int flag_explicitly_parallel = 0;
92 static int flag_xp_state = 0;
93
94 /* Whether current and previous left sub-instruction disables
95    execution of right sub-instruction.  */
96 static int cur_left_kills_right_p = 0;
97 static int prev_left_kills_right_p = 0;
98
99 /* The known current alignment of the current section.  */
100 static int d30v_current_align;
101 static segT d30v_current_align_seg;
102
103 /* The last seen label in the current section.  This is used to auto-align
104    labels preceding instructions.  */
105 static symbolS *d30v_last_label;
106
107 /* Two nops.  */
108 #define NOP_LEFT   ((long long) NOP << 32)
109 #define NOP_RIGHT  ((long long) NOP)
110 #define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT)
111
112 /* Local functions.  */
113 static int reg_name_search PARAMS ((char *name));
114 static int register_name PARAMS ((expressionS *expressionP));
115 static int check_range PARAMS ((unsigned long num, int bits, int flags));
116 static int postfix PARAMS ((char *p));
117 static bfd_reloc_code_real_type get_reloc PARAMS ((struct d30v_operand *op, int rel_flag));
118 static int get_operands PARAMS ((expressionS exp[], int cmp_hack));
119 static struct d30v_format *find_format PARAMS ((struct d30v_opcode *opcode,
120                         expressionS ops[],int fsize, int cmp_hack));
121 static long long build_insn PARAMS ((struct d30v_insn *opcode, expressionS *opers));
122 static void write_long PARAMS ((struct d30v_insn *opcode, long long insn, Fixups *fx));
123 static void write_1_short PARAMS ((struct d30v_insn *opcode, long long insn,
124                                    Fixups *fx, int use_sequential));
125 static int write_2_short PARAMS ((struct d30v_insn *opcode1, long long insn1,
126                    struct d30v_insn *opcode2, long long insn2, exec_type_enum exec_type, Fixups *fx));
127 static long long do_assemble PARAMS ((char *str, struct d30v_insn *opcode,
128                                       int shortp, int is_parallel));
129 static int parallel_ok PARAMS ((struct d30v_insn *opcode1, unsigned long insn1,
130                                 struct d30v_insn *opcode2, unsigned long insn2,
131                                 exec_type_enum exec_type));
132 static void d30v_number_to_chars PARAMS ((char *buf, long long value, int nbytes));
133 static void check_size PARAMS ((long value, int bits, char *file, int line));
134 static void d30v_align PARAMS ((int, char *, symbolS *));
135 static void s_d30v_align PARAMS ((int));
136 static void s_d30v_text PARAMS ((int));
137 static void s_d30v_data PARAMS ((int));
138 static void s_d30v_section PARAMS ((int));
139
140 struct option md_longopts[] =
141 {
142   {NULL, no_argument, NULL, 0}
143 };
144
145 size_t md_longopts_size = sizeof (md_longopts);
146
147 /* The target specific pseudo-ops which we support.  */
148 const pseudo_typeS md_pseudo_table[] =
149 {
150   { "word", cons, 4 },
151   { "hword", cons, 2 },
152   { "align", s_d30v_align, 0 },
153   { "text", s_d30v_text, 0 },
154   { "data", s_d30v_data, 0 },
155   { "section", s_d30v_section, 0 },
156   { "section.s", s_d30v_section, 0 },
157   { "sect", s_d30v_section, 0 },
158   { "sect.s", s_d30v_section, 0 },
159   { NULL, NULL, 0 }
160 };
161
162 /* Opcode hash table.  */
163 static struct hash_control *d30v_hash;
164
165 /* Do a binary search of the pre_defined_registers array to see if
166    NAME is a valid regiter name.  Return the register number from the
167    array on success, or -1 on failure.  */
168
169 static int
170 reg_name_search (name)
171      char *name;
172 {
173   int middle, low, high;
174   int cmp;
175
176   low = 0;
177   high = reg_name_cnt () - 1;
178
179   do
180     {
181       middle = (low + high) / 2;
182       cmp = strcasecmp (name, pre_defined_registers[middle].name);
183       if (cmp < 0)
184         high = middle - 1;
185       else if (cmp > 0)
186         low = middle + 1;
187       else
188         {
189           if (symbol_find (name) != NULL)
190             {
191               if (warn_register_name_conflicts)
192                 as_warn (_("Register name %s conflicts with symbol of the same name"),
193                          name);
194             }
195
196           return pre_defined_registers[middle].value;
197         }
198     }
199   while (low <= high);
200
201   return -1;
202 }
203
204 /* Check the string at input_line_pointer to see if it is a valid
205    register name.  */
206
207 static int
208 register_name (expressionP)
209      expressionS *expressionP;
210 {
211   int reg_number;
212   char c, *p = input_line_pointer;
213
214   while (*p && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
215     p++;
216
217   c = *p;
218   if (c)
219     *p++ = 0;
220
221   /* Look to see if it's in the register table.  */
222   reg_number = reg_name_search (input_line_pointer);
223   if (reg_number >= 0)
224     {
225       expressionP->X_op = O_register;
226       /* Temporarily store a pointer to the string here.  */
227       expressionP->X_op_symbol = (symbolS *) input_line_pointer;
228       expressionP->X_add_number = reg_number;
229       input_line_pointer = p;
230       return 1;
231     }
232   if (c)
233     *(p - 1) = c;
234   return 0;
235 }
236
237 static int
238 check_range (num, bits, flags)
239      unsigned long num;
240      int bits;
241      int flags;
242 {
243   long min, max;
244
245   /* Don't bother checking 32-bit values.  */
246   if (bits == 32)
247     {
248       if (sizeof (unsigned long) * CHAR_BIT == 32)
249         return 0;
250
251       /* We don't record signed or unsigned for 32-bit quantities.
252          Allow either.  */
253       min = -((unsigned long) 1 << (bits - 1));
254       max = ((unsigned long) 1 << bits) - 1;
255       return (long) num < min || (long) num > max;
256     }
257
258   if (flags & OPERAND_SHIFT)
259     {
260       /* We know that all shifts are right by three bits.  */
261       num >>= 3;
262
263       if (flags & OPERAND_SIGNED)
264         {
265           unsigned long sign_bit = ((unsigned long) -1L >> 4) + 1;
266           num = (num ^ sign_bit) - sign_bit;
267         }
268     }
269
270   if (flags & OPERAND_SIGNED)
271     {
272       max = ((unsigned long) 1 << (bits - 1)) - 1;
273       min = - ((unsigned long) 1 << (bits - 1));
274       return (long) num > max || (long) num < min;
275     }
276   else
277     {
278       max = ((unsigned long) 1 << bits) - 1;
279       return num > (unsigned long) max;
280     }
281 }
282
283 void
284 md_show_usage (stream)
285      FILE *stream;
286 {
287   fprintf (stream, _("\nD30V options:\n\
288 -O                      Make adjacent short instructions parallel if possible.\n\
289 -n                      Warn about all NOPs inserted by the assembler.\n\
290 -N                      Warn about NOPs inserted after word multiplies.\n\
291 -c                      Warn about symbols whoes names match register names.\n\
292 -C                      Opposite of -C.  -c is the default.\n"));
293 }
294
295 int
296 md_parse_option (c, arg)
297      int c;
298      char *arg ATTRIBUTE_UNUSED;
299 {
300   switch (c)
301     {
302       /* Optimize.  Will attempt to parallelize operations.  */
303     case 'O':
304       Optimizing = 1;
305       break;
306
307       /* Warn about all NOPS that the assembler inserts.  */
308     case 'n':
309       warn_nops = NOP_ALL;
310       break;
311
312       /* Warn about the NOPS that the assembler inserts because of the
313          multiply hazard.  */
314     case 'N':
315       warn_nops = NOP_MULTIPLY;
316       break;
317
318     case 'c':
319       warn_register_name_conflicts = 1;
320       break;
321
322     case 'C':
323       warn_register_name_conflicts = 0;
324       break;
325
326     default:
327       return 0;
328     }
329   return 1;
330 }
331
332 symbolS *
333 md_undefined_symbol (name)
334      char *name ATTRIBUTE_UNUSED;
335 {
336   return 0;
337 }
338
339 /* Turn a string in input_line_pointer into a floating point constant
340    of type TYPE, and store the appropriate bytes in *LITP.  The number
341    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
342    returned, or NULL on OK.  */
343
344 char *
345 md_atof (type, litP, sizeP)
346      int type;
347      char *litP;
348      int *sizeP;
349 {
350   int prec;
351   LITTLENUM_TYPE words[4];
352   char *t;
353   int i;
354
355   switch (type)
356     {
357     case 'f':
358       prec = 2;
359       break;
360     case 'd':
361       prec = 4;
362       break;
363     default:
364       *sizeP = 0;
365       return _("bad call to md_atof");
366     }
367
368   t = atof_ieee (input_line_pointer, type, words);
369   if (t)
370     input_line_pointer = t;
371
372   *sizeP = prec * 2;
373
374   for (i = 0; i < prec; i++)
375     {
376       md_number_to_chars (litP, (valueT) words[i], 2);
377       litP += 2;
378     }
379   return NULL;
380 }
381
382 void
383 md_convert_frag (abfd, sec, fragP)
384      bfd *abfd ATTRIBUTE_UNUSED;
385      asection *sec ATTRIBUTE_UNUSED;
386      fragS *fragP ATTRIBUTE_UNUSED;
387 {
388   abort ();
389 }
390
391 valueT
392 md_section_align (seg, addr)
393      asection *seg;
394      valueT addr;
395 {
396   int align = bfd_get_section_alignment (stdoutput, seg);
397   return ((addr + (1 << align) - 1) & (-1 << align));
398 }
399
400 void
401 md_begin ()
402 {
403   struct d30v_opcode *opcode;
404   d30v_hash = hash_new ();
405
406   /* Insert opcode names into a hash table.  */
407   for (opcode = (struct d30v_opcode *) d30v_opcode_table; opcode->name; opcode++)
408       hash_insert (d30v_hash, opcode->name, (char *) opcode);
409
410   fixups = &FixUps[0];
411   FixUps[0].next = &FixUps[1];
412   FixUps[1].next = &FixUps[0];
413
414   d30v_current_align_seg = now_seg;
415 }
416
417 /* Remove the postincrement or postdecrement operator ( '+' or '-' )
418    from an expression.  */
419
420 static int
421 postfix (p)
422      char *p;
423 {
424   while (*p != '-' && *p != '+')
425     {
426       if (*p == 0 || *p == '\n' || *p == '\r' || *p == ' ' || *p == ',')
427         break;
428       p++;
429     }
430
431   if (*p == '-')
432     {
433       *p = ' ';
434       return -1;
435     }
436
437   if (*p == '+')
438     {
439       *p = ' ';
440       return 1;
441     }
442
443   return 0;
444 }
445
446 static bfd_reloc_code_real_type
447 get_reloc (op, rel_flag)
448      struct d30v_operand *op;
449      int rel_flag;
450 {
451   switch (op->bits)
452     {
453     case 6:
454       if (op->flags & OPERAND_SHIFT)
455         return BFD_RELOC_D30V_9_PCREL;
456       else
457         return BFD_RELOC_D30V_6;
458       break;
459     case 12:
460       if (!(op->flags & OPERAND_SHIFT))
461         as_warn (_("unexpected 12-bit reloc type"));
462       if (rel_flag == RELOC_PCREL)
463         return BFD_RELOC_D30V_15_PCREL;
464       else
465         return BFD_RELOC_D30V_15;
466     case 18:
467       if (!(op->flags & OPERAND_SHIFT))
468         as_warn (_("unexpected 18-bit reloc type"));
469       if (rel_flag == RELOC_PCREL)
470         return BFD_RELOC_D30V_21_PCREL;
471       else
472         return BFD_RELOC_D30V_21;
473     case 32:
474       if (rel_flag == RELOC_PCREL)
475         return BFD_RELOC_D30V_32_PCREL;
476       else
477         return BFD_RELOC_D30V_32;
478     default:
479       return 0;
480     }
481 }
482
483 /* Parse a string of operands and return an array of expressions.  */
484
485 static int
486 get_operands (exp, cmp_hack)
487      expressionS exp[];
488      int cmp_hack;
489 {
490   char *p = input_line_pointer;
491   int numops = 0;
492   int post = 0;
493
494   if (cmp_hack)
495     {
496       exp[numops].X_op = O_absent;
497       exp[numops++].X_add_number = cmp_hack - 1;
498     }
499
500   while (*p)
501     {
502       while (*p == ' ' || *p == '\t' || *p == ',')
503         p++;
504
505       if (*p == 0 || *p == '\n' || *p == '\r')
506         break;
507
508       if (*p == '@')
509         {
510           p++;
511           exp[numops].X_op = O_absent;
512           if (*p == '(')
513             {
514               p++;
515               exp[numops].X_add_number = OPERAND_ATPAR;
516               post = postfix (p);
517             }
518           else if (*p == '-')
519             {
520               p++;
521               exp[numops].X_add_number = OPERAND_ATMINUS;
522             }
523           else
524             {
525               exp[numops].X_add_number = OPERAND_ATSIGN;
526               post = postfix (p);
527             }
528           numops++;
529           continue;
530         }
531
532       if (*p == ')')
533         {
534           /* Just skip the trailing paren.  */
535           p++;
536           continue;
537         }
538
539       input_line_pointer = p;
540
541       /* Check to see if it might be a register name.  */
542       if (!register_name (&exp[numops]))
543         {
544           /* Parse as an expression.  */
545           expression (&exp[numops]);
546         }
547
548       if (exp[numops].X_op == O_illegal)
549         as_bad (_("illegal operand"));
550       else if (exp[numops].X_op == O_absent)
551         as_bad (_("missing operand"));
552
553       numops++;
554       p = input_line_pointer;
555
556       switch (post)
557         {
558         case -1:
559           /* Postdecrement mode.  */
560           exp[numops].X_op = O_absent;
561           exp[numops++].X_add_number = OPERAND_MINUS;
562           break;
563         case 1:
564           /* Postincrement mode.  */
565           exp[numops].X_op = O_absent;
566           exp[numops++].X_add_number = OPERAND_PLUS;
567           break;
568         }
569       post = 0;
570     }
571
572   exp[numops].X_op = 0;
573
574   return numops;
575 }
576
577 /* Generate the instruction.
578    It does everything but write the FM bits.  */
579
580 static long long
581 build_insn (opcode, opers)
582      struct d30v_insn *opcode;
583      expressionS *opers;
584 {
585   int i, length, bits, shift, flags;
586   unsigned long number, id = 0;
587   long long insn;
588   struct d30v_opcode *op = opcode->op;
589   struct d30v_format *form = opcode->form;
590
591   insn =
592     opcode->ecc << 28 | op->op1 << 25 | op->op2 << 20 | form->modifier << 18;
593
594   for (i = 0; form->operands[i]; i++)
595     {
596       flags = d30v_operand_table[form->operands[i]].flags;
597
598       /* Must be a register or number.  */
599       if (!(flags & OPERAND_REG) && !(flags & OPERAND_NUM)
600           && !(flags & OPERAND_NAME) && !(flags & OPERAND_SPECIAL))
601         continue;
602
603       bits = d30v_operand_table[form->operands[i]].bits;
604       if (flags & OPERAND_SHIFT)
605         bits += 3;
606
607       length = d30v_operand_table[form->operands[i]].length;
608       shift = 12 - d30v_operand_table[form->operands[i]].position;
609       if (opers[i].X_op != O_symbol)
610         number = opers[i].X_add_number;
611       else
612         number = 0;
613       if (flags & OPERAND_REG)
614         {
615           /* Check for mvfsys or mvtsys control registers.  */
616           if (flags & OPERAND_CONTROL && (number & 0x7f) > MAX_CONTROL_REG)
617             {
618               /* PSWL or PSWH.  */
619               id = (number & 0x7f) - MAX_CONTROL_REG;
620               number = 0;
621             }
622           else if (number & OPERAND_FLAG)
623             {
624               /* NUMBER is a flag register.  */
625               id = 3;
626             }
627           number &= 0x7F;
628         }
629       else if (flags & OPERAND_SPECIAL)
630         {
631           number = id;
632         }
633
634       if (opers[i].X_op != O_register && opers[i].X_op != O_constant
635           && !(flags & OPERAND_NAME))
636         {
637           /* Now create a fixup.  */
638           if (fixups->fc >= MAX_INSN_FIXUPS)
639             as_fatal (_("too many fixups"));
640
641           fixups->fix[fixups->fc].reloc =
642             get_reloc ((struct d30v_operand *) &d30v_operand_table[form->operands[i]], op->reloc_flag);
643           fixups->fix[fixups->fc].size = 4;
644           fixups->fix[fixups->fc].exp = opers[i];
645           fixups->fix[fixups->fc].operand = form->operands[i];
646           if (fixups->fix[fixups->fc].reloc == BFD_RELOC_D30V_9_PCREL)
647             fixups->fix[fixups->fc].pcrel = RELOC_PCREL;
648           else
649             fixups->fix[fixups->fc].pcrel = op->reloc_flag;
650           (fixups->fc)++;
651         }
652
653       /* Truncate to the proper number of bits.  */
654       if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
655         as_bad (_("operand out of range: %ld"), number);
656       if (bits < 31)
657         number &= 0x7FFFFFFF >> (31 - bits);
658       if (flags & OPERAND_SHIFT)
659         number >>= 3;
660       if (bits == 32)
661         {
662           /* It's a LONG instruction.  */
663           insn |= ((number & 0xffffffff) >> 26);        /* top 6 bits */
664           insn <<= 32;                  /* shift the first word over */
665           insn |= ((number & 0x03FC0000) << 2);         /* next 8 bits */
666           insn |= number & 0x0003FFFF;                  /* bottom 18 bits */
667         }
668       else
669         insn |= number << shift;
670     }
671
672   return insn;
673 }
674
675 /* Write out a long form instruction.  */
676
677 static void
678 write_long (opcode, insn, fx)
679      struct d30v_insn *opcode ATTRIBUTE_UNUSED;
680      long long insn;
681      Fixups *fx;
682 {
683   int i, where;
684   char *f = frag_more (8);
685
686   insn |= FM11;
687   d30v_number_to_chars (f, insn, 8);
688
689   for (i = 0; i < fx->fc; i++)
690     {
691       if (fx->fix[i].reloc)
692         {
693           where = f - frag_now->fr_literal;
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].reloc);
700         }
701     }
702
703   fx->fc = 0;
704 }
705
706 /* Write out a short form instruction by itself.  */
707
708 static void
709 write_1_short (opcode, insn, fx, use_sequential)
710      struct d30v_insn *opcode;
711      long long insn;
712      Fixups *fx;
713      int use_sequential;
714 {
715   char *f = frag_more (8);
716   int i, where;
717
718   if (warn_nops == NOP_ALL)
719     as_warn (_("%s NOP inserted"), use_sequential ?
720              _("sequential") : _("parallel"));
721
722   /* The other container needs to be NOP.  */
723   if (use_sequential)
724     {
725       /* Use a sequential NOP rather than a parallel one,
726          as the current instruction is a FLAG_MUL32 type one
727          and the next instruction is a load.  */
728
729       /* According to 4.3.1: for FM=01, sub-instructions performed
730          only by IU cannot be encoded in L-container.  */
731
732       if (opcode->op->unit == IU)
733         /* Right then left.  */
734         insn |= FM10 | NOP_LEFT;
735       else
736         /* Left then right.  */
737         insn = FM01 | (insn << 32) | NOP_RIGHT;
738     }
739   else
740     {
741       /* According to 4.3.1: for FM=00, sub-instructions performed
742          only by IU cannot be encoded in L-container.  */
743
744       if (opcode->op->unit == IU)
745         /* Right container.  */
746         insn |= FM00 | NOP_LEFT;
747       else
748         /* Left container.  */
749         insn = FM00 | (insn << 32) | NOP_RIGHT;
750     }
751
752   d30v_number_to_chars (f, insn, 8);
753
754   for (i = 0; i < fx->fc; i++)
755     {
756       if (fx->fix[i].reloc)
757         {
758           where = f - frag_now->fr_literal;
759           fix_new_exp (frag_now,
760                        where,
761                        fx->fix[i].size,
762                        &(fx->fix[i].exp),
763                        fx->fix[i].pcrel,
764                        fx->fix[i].reloc);
765         }
766     }
767
768   fx->fc = 0;
769 }
770
771 /* Write out a short form instruction if possible.
772    Return number of instructions not written out.  */
773
774 static int
775 write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx)
776      struct d30v_insn *opcode1, *opcode2;
777      long long insn1, insn2;
778      exec_type_enum exec_type;
779      Fixups *fx;
780 {
781   long long insn = NOP2;
782   char *f;
783   int i, j, where;
784
785   if (exec_type == EXEC_SEQ
786       && (opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR))
787       && ((opcode1->op->flags_used & FLAG_DELAY) == 0)
788       && ((opcode1->ecc == ECC_AL) || ! Optimizing))
789     {
790       /* Unconditional, non-delayed branches kill instructions in
791          the right bin.  Conditional branches don't always but if
792          we are not optimizing, then we have been asked to produce
793          an error about such constructs.  For the purposes of this
794          test, subroutine calls are considered to be branches.  */
795       write_1_short (opcode1, insn1, fx->next, FALSE);
796       return 1;
797     }
798
799   /* Note: we do not have to worry about subroutine calls occurring
800      in the right hand container.  The return address is always
801      aligned to the next 64 bit boundary, be that 64 or 32 bit away.  */
802   switch (exec_type)
803     {
804     case EXEC_UNKNOWN:  /* Order not specified.  */
805       if (Optimizing
806           && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)
807           && ! (   (opcode1->op->unit == EITHER_BUT_PREFER_MU
808                  || opcode1->op->unit == MU)
809                 &&
810                 (   opcode2->op->unit == EITHER_BUT_PREFER_MU
811                  || opcode2->op->unit == MU)))
812         {
813           /* Parallel.  */
814           exec_type = EXEC_PARALLEL;
815
816           if (opcode1->op->unit == IU
817               || opcode2->op->unit == MU
818               || opcode2->op->unit == EITHER_BUT_PREFER_MU)
819             insn = FM00 | (insn2 << 32) | insn1;
820           else
821             {
822               insn = FM00 | (insn1 << 32) | insn2;
823               fx = fx->next;
824             }
825         }
826       else if ((opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR)
827                 && ((opcode1->op->flags_used & FLAG_DELAY) == 0))
828                || opcode1->op->flags_used & FLAG_RP)
829         {
830           /* We must emit (non-delayed) branch type instructions
831              on their own with nothing in the right container.  */
832           /* We must treat repeat instructions likewise, since the
833              following instruction has to be separate from the repeat
834              in order to be repeated.  */
835           write_1_short (opcode1, insn1, fx->next, FALSE);
836           return 1;
837         }
838       else if (prev_left_kills_right_p)
839         {
840           /* The left instruction kils the right slot, so we
841              must leave it empty.  */
842           write_1_short (opcode1, insn1, fx->next, FALSE);
843           return 1;
844         }
845       else if (opcode1->op->unit == IU)
846         {
847           if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
848             {
849               /* Case 103810 is a request from Mitsubishi that opcodes
850                  with EITHER_BUT_PREFER_MU should not be executed in
851                  reverse sequential order.  */
852               write_1_short (opcode1, insn1, fx->next, FALSE);
853               return 1;
854             }
855
856           /* Reverse sequential.  */
857           insn = FM10 | (insn2 << 32) | insn1;
858           exec_type = EXEC_REVSEQ;
859         }
860       else
861         {
862           /* Sequential.  */
863           insn = FM01 | (insn1 << 32) | insn2;
864           fx = fx->next;
865           exec_type = EXEC_SEQ;
866         }
867       break;
868
869     case EXEC_PARALLEL: /* Parallel.  */
870       flag_explicitly_parallel = flag_xp_state;
871       if (! parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
872         as_bad (_("Instructions may not be executed in parallel"));
873       else if (opcode1->op->unit == IU)
874         {
875           if (opcode2->op->unit == IU)
876             as_bad (_("Two IU instructions may not be executed in parallel"));
877           as_warn (_("Swapping instruction order"));
878           insn = FM00 | (insn2 << 32) | insn1;
879         }
880       else if (opcode2->op->unit == MU)
881         {
882           if (opcode1->op->unit == MU)
883             as_bad (_("Two MU instructions may not be executed in parallel"));
884           else if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
885             as_warn (_("Executing %s in IU may not work"), opcode1->op->name);
886           as_warn (_("Swapping instruction order"));
887           insn = FM00 | (insn2 << 32) | insn1;
888         }
889       else
890         {
891           if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
892             as_warn (_("Executing %s in IU may not work in parallel execution"),
893                      opcode2->op->name);
894
895           insn = FM00 | (insn1 << 32) | insn2;
896           fx = fx->next;
897         }
898       flag_explicitly_parallel = 0;
899       break;
900
901     case EXEC_SEQ:      /* Sequential.  */
902       if (opcode1->op->unit == IU)
903         as_bad (_("IU instruction may not be in the left container"));
904       if (prev_left_kills_right_p)
905         as_bad (_("special left instruction `%s' kills instruction "
906                   "`%s' in right container"),
907                 opcode1->op->name, opcode2->op->name);
908       insn = FM01 | (insn1 << 32) | insn2;
909       fx = fx->next;
910       break;
911
912     case EXEC_REVSEQ:   /* Reverse sequential.  */
913       if (opcode2->op->unit == MU)
914         as_bad (_("MU instruction may not be in the right container"));
915       if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
916         as_warn (_("Executing %s in reverse serial with %s may not work"),
917                  opcode1->op->name, opcode2->op->name);
918       else if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
919         as_warn (_("Executing %s in IU in reverse serial may not work"),
920                  opcode2->op->name);
921       insn = FM10 | (insn1 << 32) | insn2;
922       fx = fx->next;
923       break;
924
925     default:
926       as_fatal (_("unknown execution type passed to write_2_short()"));
927     }
928
929 #if 0
930   printf ("writing out %llx\n", insn);
931 #endif
932   f = frag_more (8);
933   d30v_number_to_chars (f, insn, 8);
934
935   /* If the previous instruction was a 32-bit multiply but it is put into a
936      parallel container, mark the current instruction as being a 32-bit
937      multiply.  */
938   if (prev_mul32_p && exec_type == EXEC_PARALLEL)
939     cur_mul32_p = 1;
940
941   for (j = 0; j < 2; j++)
942     {
943       for (i = 0; i < fx->fc; i++)
944         {
945           if (fx->fix[i].reloc)
946             {
947               where = (f - frag_now->fr_literal) + 4 * j;
948
949               fix_new_exp (frag_now,
950                            where,
951                            fx->fix[i].size,
952                            &(fx->fix[i].exp),
953                            fx->fix[i].pcrel,
954                            fx->fix[i].reloc);
955             }
956         }
957
958       fx->fc = 0;
959       fx = fx->next;
960     }
961
962   return 0;
963 }
964
965 /* Check 2 instructions and determine if they can be safely
966    executed in parallel.  Return 1 if they can be.  */
967
968 static int
969 parallel_ok (op1, insn1, op2, insn2, exec_type)
970      struct d30v_insn *op1, *op2;
971      unsigned long insn1, insn2;
972      exec_type_enum exec_type;
973 {
974   int i, j, shift, regno, bits, ecc;
975   unsigned long flags, mask, flags_set1, flags_set2, flags_used1, flags_used2;
976   unsigned long ins, mod_reg[2][3], used_reg[2][3], flag_reg[2];
977   struct d30v_format *f;
978   struct d30v_opcode *op;
979
980   /* Section 4.3: Both instructions must not be IU or MU only.  */
981   if ((op1->op->unit == IU && op2->op->unit == IU)
982       || (op1->op->unit == MU && op2->op->unit == MU))
983     return 0;
984
985   /* First instruction must not be a jump to safely optimize, unless this
986      is an explicit parallel operation.  */
987   if (exec_type != EXEC_PARALLEL
988       && (op1->op->flags_used & (FLAG_JMP | FLAG_JSR)))
989     return 0;
990
991   /* If one instruction is /TX or /XT and the other is /FX or /XF respectively,
992      then it is safe to allow the two to be done as parallel ops, since only
993      one will ever be executed at a time.  */
994   if ((op1->ecc == ECC_TX && op2->ecc == ECC_FX)
995       || (op1->ecc == ECC_FX && op2->ecc == ECC_TX)
996       || (op1->ecc == ECC_XT && op2->ecc == ECC_XF)
997       || (op1->ecc == ECC_XF && op2->ecc == ECC_XT))
998     return 1;
999
1000   /* [0] r0-r31
1001      [1] r32-r63
1002      [2] a0, a1, flag registers.  */
1003   for (j = 0; j < 2; j++)
1004     {
1005       if (j == 0)
1006         {
1007           f = op1->form;
1008           op = op1->op;
1009           ecc = op1->ecc;
1010           ins = insn1;
1011         }
1012       else
1013         {
1014           f = op2->form;
1015           op = op2->op;
1016           ecc = op2->ecc;
1017           ins = insn2;
1018         }
1019
1020       flag_reg[j] = 0;
1021       mod_reg[j][0] = mod_reg[j][1] = 0;
1022       used_reg[j][0] = used_reg[j][1] = 0;
1023
1024       if (flag_explicitly_parallel)
1025         {
1026           /* For human specified parallel instructions we have been asked
1027              to ignore the possibility that both instructions could modify
1028              bits in the PSW, so we initialise the mod & used arrays to 0.
1029              We have been asked, however, to refuse to allow parallel
1030              instructions which explicitly set the same flag register,
1031              eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test
1032              for the use of a flag register and set a bit in the mod or used
1033              array appropriately.  */
1034           mod_reg[j][2]  = 0;
1035           used_reg[j][2] = 0;
1036         }
1037       else
1038         {
1039           mod_reg[j][2] = (op->flags_set & FLAG_ALL);
1040           used_reg[j][2] = (op->flags_used & FLAG_ALL);
1041         }
1042
1043       /* BSR/JSR always sets R62.  */
1044       if (op->flags_used & FLAG_JSR)
1045         mod_reg[j][1] = (1L << (62 - 32));
1046
1047       /* Conditional execution affects the flags_used.  */
1048       switch (ecc)
1049         {
1050         case ECC_TX:
1051         case ECC_FX:
1052           used_reg[j][2] |= flag_reg[j] = FLAG_0;
1053           break;
1054
1055         case ECC_XT:
1056         case ECC_XF:
1057           used_reg[j][2] |= flag_reg[j] = FLAG_1;
1058           break;
1059
1060         case ECC_TT:
1061         case ECC_TF:
1062           used_reg[j][2] |= flag_reg[j] = (FLAG_0 | FLAG_1);
1063           break;
1064         }
1065
1066       for (i = 0; f->operands[i]; i++)
1067         {
1068           flags = d30v_operand_table[f->operands[i]].flags;
1069           shift = 12 - d30v_operand_table[f->operands[i]].position;
1070           bits = d30v_operand_table[f->operands[i]].bits;
1071           if (bits == 32)
1072             mask = 0xffffffff;
1073           else
1074             mask = 0x7FFFFFFF >> (31 - bits);
1075
1076           if ((flags & OPERAND_PLUS) || (flags & OPERAND_MINUS))
1077             {
1078               /* This is a post-increment or post-decrement.
1079                  The previous register needs to be marked as modified.  */
1080               shift = 12 - d30v_operand_table[f->operands[i - 1]].position;
1081               regno = (ins >> shift) & 0x3f;
1082               if (regno >= 32)
1083                 mod_reg[j][1] |= 1L << (regno - 32);
1084               else
1085                 mod_reg[j][0] |= 1L << regno;
1086             }
1087           else if (flags & OPERAND_REG)
1088             {
1089               regno = (ins >> shift) & mask;
1090               /* The memory write functions don't have a destination
1091                  register.  */
1092               if ((flags & OPERAND_DEST) && !(op->flags_set & FLAG_MEM))
1093                 {
1094                   /* MODIFIED registers and flags.  */
1095                   if (flags & OPERAND_ACC)
1096                     {
1097                       if (regno == 0)
1098                         mod_reg[j][2] |= FLAG_A0;
1099                       else if (regno == 1)
1100                         mod_reg[j][2] |= FLAG_A1;
1101                       else
1102                         abort ();
1103                     }
1104                   else if (flags & OPERAND_FLAG)
1105                     mod_reg[j][2] |= 1L << regno;
1106                   else if (!(flags & OPERAND_CONTROL))
1107                     {
1108                       int r, z;
1109
1110                       /* Need to check if there are two destination
1111                          registers, for example ld2w.  */
1112                       if (flags & OPERAND_2REG)
1113                         z = 1;
1114                       else
1115                         z = 0;
1116
1117                       for (r = regno; r <= regno + z; r++)
1118                         {
1119                           if (r >= 32)
1120                             mod_reg[j][1] |= 1L << (r - 32);
1121                           else
1122                             mod_reg[j][0] |= 1L << r;
1123                         }
1124                     }
1125                 }
1126               else
1127                 {
1128                   /* USED, but not modified registers and flags.  */
1129                   if (flags & OPERAND_ACC)
1130                     {
1131                       if (regno == 0)
1132                         used_reg[j][2] |= FLAG_A0;
1133                       else if (regno == 1)
1134                         used_reg[j][2] |= FLAG_A1;
1135                       else
1136                         abort ();
1137                     }
1138                   else if (flags & OPERAND_FLAG)
1139                     used_reg[j][2] |= 1L << regno;
1140                   else if (!(flags & OPERAND_CONTROL))
1141                     {
1142                       int r, z;
1143
1144                       /* Need to check if there are two source
1145                          registers, for example st2w.  */
1146                       if (flags & OPERAND_2REG)
1147                         z = 1;
1148                       else
1149                         z = 0;
1150
1151                       for (r = regno; r <= regno + z; r++)
1152                         {
1153                           if (r >= 32)
1154                             used_reg[j][1] |= 1L << (r - 32);
1155                           else
1156                             used_reg[j][0] |= 1L << r;
1157                         }
1158                     }
1159                 }
1160             }
1161         }
1162     }
1163
1164   flags_set1 = op1->op->flags_set;
1165   flags_set2 = op2->op->flags_set;
1166   flags_used1 = op1->op->flags_used;
1167   flags_used2 = op2->op->flags_used;
1168
1169   /* Check for illegal combinations with ADDppp/SUBppp.  */
1170   if (((flags_set1 & FLAG_NOT_WITH_ADDSUBppp) != 0
1171        && (flags_used2 & FLAG_ADDSUBppp) != 0)
1172       || ((flags_set2 & FLAG_NOT_WITH_ADDSUBppp) != 0
1173           && (flags_used1 & FLAG_ADDSUBppp) != 0))
1174     return 0;
1175
1176   /* Load instruction combined with half-word multiply is illegal.  */
1177   if (((flags_used1 & FLAG_MEM) != 0 && (flags_used2 & FLAG_MUL16))
1178       || ((flags_used2 & FLAG_MEM) != 0 && (flags_used1 & FLAG_MUL16)))
1179     return 0;
1180
1181   /* Specifically allow add || add by removing carry, overflow bits dependency.
1182      This is safe, even if an addc follows since the IU takes the argument in
1183      the right container, and it writes its results last.
1184      However, don't paralellize add followed by addc or sub followed by
1185      subb.  */
1186   if (mod_reg[0][2] == FLAG_CVVA && mod_reg[1][2] == FLAG_CVVA
1187       && (used_reg[0][2] & ~flag_reg[0]) == 0
1188       && (used_reg[1][2] & ~flag_reg[1]) == 0
1189       && op1->op->unit == EITHER && op2->op->unit == EITHER)
1190     {
1191       mod_reg[0][2] = mod_reg[1][2] = 0;
1192     }
1193
1194   for (j = 0; j < 3; j++)
1195     {
1196       /* If the second instruction depends on the first, we obviously
1197          cannot parallelize.  Note, the mod flag implies use, so
1198          check that as well.  */
1199       /* If flag_explicitly_parallel is set, then the case of the
1200          second instruction using a register the first instruction
1201          modifies is assumed to be okay; we trust the human.  We
1202          don't trust the human if both instructions modify the same
1203          register but we do trust the human if they modify the same
1204          flags.  */
1205       /* We have now been requested not to trust the human if the
1206          instructions modify the same flag registers either.  */
1207       if (flag_explicitly_parallel)
1208         {
1209           if ((mod_reg[0][j] & mod_reg[1][j]) != 0)
1210             return 0;
1211         }
1212       else
1213         if ((mod_reg[0][j] & (mod_reg[1][j] | used_reg[1][j])) != 0)
1214           return 0;
1215     }
1216
1217   return 1;
1218 }
1219
1220 /* This is the main entry point for the machine-dependent assembler.
1221    STR points to a machine-dependent instruction.  This function is
1222    supposed to emit the frags/bytes it assembles to.  For the D30V, it
1223    mostly handles the special VLIW parsing and packing and leaves the
1224    difficult stuff to do_assemble ().  */
1225
1226 static long long prev_insn = -1;
1227 static struct d30v_insn prev_opcode;
1228 static subsegT prev_subseg;
1229 static segT prev_seg = 0;
1230
1231 void
1232 md_assemble (str)
1233      char *str;
1234 {
1235   struct d30v_insn opcode;
1236   long long insn;
1237   /* Execution type; parallel, etc.  */
1238   exec_type_enum extype = EXEC_UNKNOWN;
1239   /* Saved extype.  Used for multiline instructions.  */
1240   static exec_type_enum etype = EXEC_UNKNOWN;
1241   char *str2;
1242
1243   if ((prev_insn != -1) && prev_seg
1244       && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1245     d30v_cleanup (FALSE);
1246
1247   if (d30v_current_align < 3)
1248     d30v_align (3, NULL, d30v_last_label);
1249   else if (d30v_current_align > 3)
1250     d30v_current_align = 3;
1251   d30v_last_label = NULL;
1252
1253   flag_explicitly_parallel = 0;
1254   flag_xp_state = 0;
1255   if (etype == EXEC_UNKNOWN)
1256     {
1257       /* Look for the special multiple instruction separators.  */
1258       str2 = strstr (str, "||");
1259       if (str2)
1260         {
1261           extype = EXEC_PARALLEL;
1262           flag_xp_state = 1;
1263         }
1264       else
1265         {
1266           str2 = strstr (str, "->");
1267           if (str2)
1268             extype = EXEC_SEQ;
1269           else
1270             {
1271               str2 = strstr (str, "<-");
1272               if (str2)
1273                 extype = EXEC_REVSEQ;
1274             }
1275         }
1276
1277       /* STR2 points to the separator, if one.  */
1278       if (str2)
1279         {
1280           *str2 = 0;
1281
1282           /* If two instructions are present and we already have one saved,
1283              then first write it out.  */
1284           d30v_cleanup (FALSE);
1285
1286           /* Assemble first instruction and save it.  */
1287           prev_insn = do_assemble (str, &prev_opcode, 1, 0);
1288           if (prev_insn == -1)
1289             as_bad (_("Cannot assemble instruction"));
1290           if (prev_opcode.form != NULL && prev_opcode.form->form >= LONG)
1291             as_bad (_("First opcode is long.  Unable to mix instructions as specified."));
1292           fixups = fixups->next;
1293           str = str2 + 2;
1294           prev_seg = now_seg;
1295           prev_subseg = now_subseg;
1296         }
1297     }
1298
1299   insn = do_assemble (str, &opcode,
1300                       (extype != EXEC_UNKNOWN || etype != EXEC_UNKNOWN),
1301                       extype == EXEC_PARALLEL);
1302   if (insn == -1)
1303     {
1304       if (extype != EXEC_UNKNOWN)
1305         etype = extype;
1306       as_bad (_("Cannot assemble instruction"));
1307       return;
1308     }
1309
1310   if (etype != EXEC_UNKNOWN)
1311     {
1312       extype = etype;
1313       etype = EXEC_UNKNOWN;
1314     }
1315
1316   /* Word multiply instructions must not be followed by either a load or a
1317      16-bit multiply instruction in the next cycle.  */
1318   if (   (extype != EXEC_REVSEQ)
1319       && prev_mul32_p
1320       && (opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1321     {
1322       /* However, load and multiply should able to be combined in a parallel
1323          operation, so check for that first.  */
1324       if (prev_insn != -1
1325           && (opcode.op->flags_used & FLAG_MEM)
1326           && opcode.form->form < LONG
1327           && (extype == EXEC_PARALLEL || (Optimizing && extype == EXEC_UNKNOWN))
1328           && parallel_ok (&prev_opcode, (long) prev_insn,
1329                           &opcode, (long) insn, extype)
1330           && write_2_short (&prev_opcode, (long) prev_insn,
1331                             &opcode, (long) insn, extype, fixups) == 0)
1332         {
1333           /* No instructions saved.  */
1334           prev_insn = -1;
1335           return;
1336         }
1337       else
1338         {
1339           /* Can't parallelize, flush previous instruction and emit a
1340              word of NOPS, unless the previous instruction is a NOP,
1341              in which case just flush it, as this will generate a word
1342              of NOPs for us.  */
1343
1344           if (prev_insn != -1 && (strcmp (prev_opcode.op->name, "nop") == 0))
1345             d30v_cleanup (FALSE);
1346           else
1347             {
1348               char *f;
1349
1350               if (prev_insn != -1)
1351                 d30v_cleanup (TRUE);
1352               else
1353                 {
1354                   f = frag_more (8);
1355                   d30v_number_to_chars (f, NOP2, 8);
1356
1357                   if (warn_nops == NOP_ALL || warn_nops == NOP_MULTIPLY)
1358                     {
1359                       if (opcode.op->flags_used & FLAG_MEM)
1360                         as_warn (_("word of NOPs added between word multiply and load"));
1361                       else
1362                         as_warn (_("word of NOPs added between word multiply and 16-bit multiply"));
1363                     }
1364                 }
1365             }
1366
1367           extype = EXEC_UNKNOWN;
1368         }
1369     }
1370   else if (   (extype == EXEC_REVSEQ)
1371            && cur_mul32_p
1372            && (prev_opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1373     {
1374       /* Can't parallelize, flush current instruction and add a
1375          sequential NOP.  */
1376       write_1_short (&opcode, (long) insn, fixups->next->next, TRUE);
1377
1378       /* Make the previous instruction the current one.  */
1379       extype = EXEC_UNKNOWN;
1380       insn = prev_insn;
1381       now_seg = prev_seg;
1382       now_subseg = prev_subseg;
1383       prev_insn = -1;
1384       cur_mul32_p = prev_mul32_p;
1385       prev_mul32_p = 0;
1386       memcpy (&opcode, &prev_opcode, sizeof (prev_opcode));
1387     }
1388
1389   /* If this is a long instruction, write it and any previous short
1390      instruction.  */
1391   if (opcode.form->form >= LONG)
1392     {
1393       if (extype != EXEC_UNKNOWN)
1394         as_bad (_("Instruction uses long version, so it cannot be mixed as specified"));
1395       d30v_cleanup (FALSE);
1396       write_long (&opcode, insn, fixups);
1397       prev_insn = -1;
1398     }
1399   else if ((prev_insn != -1)
1400            && (write_2_short
1401                (&prev_opcode, (long) prev_insn, &opcode,
1402                 (long) insn, extype, fixups) == 0))
1403     {
1404       /* No instructions saved.  */
1405       prev_insn = -1;
1406     }
1407   else
1408     {
1409       if (extype != EXEC_UNKNOWN)
1410         as_bad (_("Unable to mix instructions as specified"));
1411
1412       /* Save off last instruction so it may be packed on next pass.  */
1413       memcpy (&prev_opcode, &opcode, sizeof (prev_opcode));
1414       prev_insn = insn;
1415       prev_seg = now_seg;
1416       prev_subseg = now_subseg;
1417       fixups = fixups->next;
1418       prev_mul32_p = cur_mul32_p;
1419     }
1420 }
1421
1422 /* Assemble a single instruction and return an opcode.
1423    Return -1 (an invalid opcode) on error.  */
1424
1425 #define NAME_BUF_LEN    20
1426
1427 static long long
1428 do_assemble (str, opcode, shortp, is_parallel)
1429      char *str;
1430      struct d30v_insn *opcode;
1431      int shortp;
1432      int is_parallel;
1433 {
1434   unsigned char *op_start;
1435   unsigned char *save;
1436   unsigned char *op_end;
1437   char           name[NAME_BUF_LEN];
1438   int            cmp_hack;
1439   int            nlen = 0;
1440   int            fsize = (shortp ? FORCE_SHORT : 0);
1441   expressionS    myops[6];
1442   long long      insn;
1443
1444   /* Drop leading whitespace.  */
1445   while (*str == ' ')
1446     str++;
1447
1448   /* Find the opcode end.  */
1449   for (op_start = op_end = (unsigned char *) (str);
1450        *op_end
1451        && nlen < (NAME_BUF_LEN - 1)
1452        && *op_end != '/'
1453        && !is_end_of_line[*op_end] && *op_end != ' ';
1454        op_end++)
1455     {
1456       name[nlen] = TOLOWER (op_start[nlen]);
1457       nlen++;
1458     }
1459
1460   if (nlen == 0)
1461     return -1;
1462
1463   name[nlen] = 0;
1464
1465   /* If there is an execution condition code, handle it.  */
1466   if (*op_end == '/')
1467     {
1468       int i = 0;
1469       while ((i < ECC_MAX) && strncasecmp (d30v_ecc_names[i], op_end + 1, 2))
1470         i++;
1471
1472       if (i == ECC_MAX)
1473         {
1474           char tmp[4];
1475           strncpy (tmp, op_end + 1, 2);
1476           tmp[2] = 0;
1477           as_bad (_("unknown condition code: %s"), tmp);
1478           return -1;
1479         }
1480 #if 0
1481       printf ("condition code=%d\n", i);
1482 #endif
1483       opcode->ecc = i;
1484       op_end += 3;
1485     }
1486   else
1487     opcode->ecc = ECC_AL;
1488
1489   /* CMP and CMPU change their name based on condition codes.  */
1490   if (!strncmp (name, "cmp", 3))
1491     {
1492       int p, i;
1493       char **str = (char **) d30v_cc_names;
1494       if (name[3] == 'u')
1495         p = 4;
1496       else
1497         p = 3;
1498
1499       for (i = 1; *str && strncmp (*str, &name[p], 2); i++, str++)
1500         ;
1501
1502       /* cmpu only supports some condition codes.  */
1503       if (p == 4)
1504         {
1505           if (i < 3 || i > 6)
1506             {
1507               name[p + 2] = 0;
1508               as_bad (_("cmpu doesn't support condition code %s"), &name[p]);
1509             }
1510         }
1511
1512       if (!*str)
1513         {
1514           name[p + 2] = 0;
1515           as_bad (_("unknown condition code: %s"), &name[p]);
1516         }
1517
1518       cmp_hack = i;
1519       name[p] = 0;
1520     }
1521   else
1522     cmp_hack = 0;
1523
1524 #if 0
1525   printf ("cmp_hack=%d\n", cmp_hack);
1526 #endif
1527
1528   /* Need to look for .s or .l.  */
1529   if (name[nlen - 2] == '.')
1530     {
1531       switch (name[nlen - 1])
1532         {
1533         case 's':
1534           fsize = FORCE_SHORT;
1535           break;
1536         case 'l':
1537           fsize = FORCE_LONG;
1538           break;
1539         }
1540       name[nlen - 2] = 0;
1541     }
1542
1543   /* Find the first opcode with the proper name.  */
1544   opcode->op = (struct d30v_opcode *) hash_find (d30v_hash, name);
1545   if (opcode->op == NULL)
1546     {
1547       as_bad (_("unknown opcode: %s"), name);
1548       return -1;
1549     }
1550
1551   save = input_line_pointer;
1552   input_line_pointer = op_end;
1553   while (!(opcode->form = find_format (opcode->op, myops, fsize, cmp_hack)))
1554     {
1555       opcode->op++;
1556       if (opcode->op->name == NULL || strcmp (opcode->op->name, name))
1557         {
1558           as_bad (_("operands for opcode `%s' do not match any valid format"),
1559                   name);
1560           return -1;
1561         }
1562     }
1563   input_line_pointer = save;
1564
1565   insn = build_insn (opcode, myops);
1566
1567   /* Propagate multiply status.  */
1568   if (insn != -1)
1569     {
1570       if (is_parallel && prev_mul32_p)
1571         cur_mul32_p = 1;
1572       else
1573         {
1574           prev_mul32_p = cur_mul32_p;
1575           cur_mul32_p  = (opcode->op->flags_used & FLAG_MUL32) != 0;
1576         }
1577     }
1578
1579   /* Propagate left_kills_right status.  */
1580   if (insn != -1)
1581     {
1582       prev_left_kills_right_p = cur_left_kills_right_p;
1583
1584       if (opcode->op->flags_set & FLAG_LKR)
1585         {
1586           cur_left_kills_right_p = 1;
1587
1588           if (strcmp (opcode->op->name, "mvtsys") == 0)
1589             {
1590               /* Left kills right for only mvtsys only for
1591                  PSW/PSWH/PSWL/flags target.  */
1592               if ((myops[0].X_op == O_register) &&
1593                   ((myops[0].X_add_number == OPERAND_CONTROL) || /* psw */
1594                    (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+2) || /* pswh */
1595                    (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+1) || /* pswl */
1596                    (myops[0].X_add_number == OPERAND_FLAG+0) || /* f0 */
1597                    (myops[0].X_add_number == OPERAND_FLAG+1) || /* f1 */
1598                    (myops[0].X_add_number == OPERAND_FLAG+2) || /* f2 */
1599                    (myops[0].X_add_number == OPERAND_FLAG+3) || /* f3 */
1600                    (myops[0].X_add_number == OPERAND_FLAG+4) || /* f4 */
1601                    (myops[0].X_add_number == OPERAND_FLAG+5) || /* f5 */
1602                    (myops[0].X_add_number == OPERAND_FLAG+6) || /* f6 */
1603                    (myops[0].X_add_number == OPERAND_FLAG+7))) /* f7 */
1604                 {
1605                   cur_left_kills_right_p = 1;
1606                 }
1607               else
1608                 {
1609                   /* Other mvtsys target registers don't kill right
1610                      instruction.  */
1611                   cur_left_kills_right_p = 0;
1612                 }
1613             } /* mvtsys */
1614         }
1615       else
1616         cur_left_kills_right_p = 0;
1617     }
1618
1619   return insn;
1620 }
1621
1622 /* Get a pointer to an entry in the format table.
1623    It must look at all formats for an opcode and use the operands
1624    to choose the correct one.  Return NULL on error.  */
1625
1626 static struct d30v_format *
1627 find_format (opcode, myops, fsize, cmp_hack)
1628      struct d30v_opcode *opcode;
1629      expressionS myops[];
1630      int fsize;
1631      int cmp_hack;
1632 {
1633   int numops, match, index, i = 0, j, k;
1634   struct d30v_format *fm;
1635
1636   if (opcode == NULL)
1637     return NULL;
1638
1639   /* Get all the operands and save them as expressions.  */
1640   numops = get_operands (myops, cmp_hack);
1641
1642   while ((index = opcode->format[i++]) != 0)
1643     {
1644       if (fsize == FORCE_SHORT && index >= LONG)
1645         continue;
1646
1647       if (fsize == FORCE_LONG && index < LONG)
1648         continue;
1649
1650       fm = (struct d30v_format *) &d30v_format_table[index];
1651       k = index;
1652       while (fm->form == index)
1653         {
1654           match = 1;
1655           /* Now check the operands for compatibility.  */
1656           for (j = 0; match && fm->operands[j]; j++)
1657             {
1658               int flags = d30v_operand_table[fm->operands[j]].flags;
1659               int bits = d30v_operand_table[fm->operands[j]].bits;
1660               int X_op = myops[j].X_op;
1661               int num = myops[j].X_add_number;
1662
1663               if (flags & OPERAND_SPECIAL)
1664                 break;
1665               else if (X_op == O_illegal)
1666                 match = 0;
1667               else if (flags & OPERAND_REG)
1668                 {
1669                   if (X_op != O_register
1670                       || ((flags & OPERAND_ACC) && !(num & OPERAND_ACC))
1671                       || (!(flags & OPERAND_ACC) && (num & OPERAND_ACC))
1672                       || ((flags & OPERAND_FLAG) && !(num & OPERAND_FLAG))
1673                       || (!(flags & (OPERAND_FLAG | OPERAND_CONTROL)) && (num & OPERAND_FLAG))
1674                       || ((flags & OPERAND_CONTROL)
1675                           && !(num & (OPERAND_CONTROL | OPERAND_FLAG))))
1676                     {
1677                       match = 0;
1678                     }
1679                 }
1680               else if (((flags & OPERAND_MINUS)
1681                         && (X_op != O_absent || num != OPERAND_MINUS))
1682                        || ((flags & OPERAND_PLUS)
1683                            && (X_op != O_absent || num != OPERAND_PLUS))
1684                        || ((flags & OPERAND_ATMINUS)
1685                            && (X_op != O_absent || num != OPERAND_ATMINUS))
1686                        || ((flags & OPERAND_ATPAR)
1687                            && (X_op != O_absent || num != OPERAND_ATPAR))
1688                        || ((flags & OPERAND_ATSIGN)
1689                            && (X_op != O_absent || num != OPERAND_ATSIGN)))
1690                 {
1691                   match = 0;
1692                 }
1693               else if (flags & OPERAND_NUM)
1694                 {
1695                   /* A number can be a constant or symbol expression.  */
1696
1697                   /* If we have found a register name, but that name
1698                      also matches a symbol, then re-parse the name as
1699                      an expression.  */
1700                   if (X_op == O_register
1701                       && symbol_find ((char *) myops[j].X_op_symbol))
1702                     {
1703                       input_line_pointer = (char *) myops[j].X_op_symbol;
1704                       expression (&myops[j]);
1705                     }
1706
1707                   /* Turn an expression into a symbol for later resolution.  */
1708                   if (X_op != O_absent && X_op != O_constant
1709                       && X_op != O_symbol && X_op != O_register
1710                       && X_op != O_big)
1711                     {
1712                       symbolS *sym = make_expr_symbol (&myops[j]);
1713                       myops[j].X_op = X_op = O_symbol;
1714                       myops[j].X_add_symbol = sym;
1715                       myops[j].X_add_number = num = 0;
1716                     }
1717
1718                   if (fm->form >= LONG)
1719                     {
1720                       /* If we're testing for a LONG format, either fits.  */
1721                       if (X_op != O_constant && X_op != O_symbol)
1722                         match = 0;
1723                     }
1724                   else if (fm->form < LONG
1725                            && ((fsize == FORCE_SHORT && X_op == O_symbol)
1726                                || (fm->form == SHORT_D2 && j == 0)))
1727                     match = 1;
1728
1729                   /* This is the tricky part.  Will the constant or symbol
1730                      fit into the space in the current format?  */
1731                   else if (X_op == O_constant)
1732                     {
1733                       if (check_range (num, bits, flags))
1734                         match = 0;
1735                     }
1736                   else if (X_op == O_symbol
1737                            && S_IS_DEFINED (myops[j].X_add_symbol)
1738                            && S_GET_SEGMENT (myops[j].X_add_symbol) == now_seg
1739                            && opcode->reloc_flag == RELOC_PCREL)
1740                     {
1741                       /* If the symbol is defined, see if the value will fit
1742                          into the form we're considering.  */
1743                       fragS *f;
1744                       long value;
1745
1746                       /* Calculate the current address by running through the
1747                          previous frags and adding our current offset.  */
1748                       value = 0;
1749                       for (f = frchain_now->frch_root; f; f = f->fr_next)
1750                         value += f->fr_fix + f->fr_offset;
1751                       value = (S_GET_VALUE (myops[j].X_add_symbol) - value
1752                                - (obstack_next_free (&frchain_now->frch_obstack)
1753                                   - frag_now->fr_literal));
1754                       if (check_range (value, bits, flags))
1755                         match = 0;
1756                     }
1757                   else
1758                     match = 0;
1759                 }
1760             }
1761 #if 0
1762           printf ("through the loop: match=%d\n", match);
1763 #endif
1764           /* We're only done if the operands matched so far AND there
1765              are no more to check.  */
1766           if (match && myops[j].X_op == 0)
1767             {
1768               /* Final check - issue a warning if an odd numbered register
1769                  is used as the first register in an instruction that reads
1770                  or writes 2 registers.  */
1771
1772               for (j = 0; fm->operands[j]; j++)
1773                 if (myops[j].X_op == O_register
1774                     && (myops[j].X_add_number & 1)
1775                     && (d30v_operand_table[fm->operands[j]].flags & OPERAND_2REG))
1776                   as_warn (_("Odd numbered register used as target of multi-register instruction"));
1777
1778               return fm;
1779             }
1780           fm = (struct d30v_format *) &d30v_format_table[++k];
1781         }
1782 #if 0
1783       printf ("trying another format: i=%d\n", i);
1784 #endif
1785     }
1786   return NULL;
1787 }
1788
1789 /* If while processing a fixup, a reloc really needs to be created,
1790    then it is done here.  */
1791
1792 arelent *
1793 tc_gen_reloc (seg, fixp)
1794      asection *seg ATTRIBUTE_UNUSED;
1795      fixS *fixp;
1796 {
1797   arelent *reloc;
1798   reloc = (arelent *) xmalloc (sizeof (arelent));
1799   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1800   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1801   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1802   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1803   if (reloc->howto == (reloc_howto_type *) NULL)
1804     {
1805       as_bad_where (fixp->fx_file, fixp->fx_line,
1806                     _("reloc %d not supported by object file format"),
1807                     (int) fixp->fx_r_type);
1808       return NULL;
1809     }
1810
1811   reloc->addend = 0;
1812   return reloc;
1813 }
1814
1815 int
1816 md_estimate_size_before_relax (fragp, seg)
1817      fragS *fragp ATTRIBUTE_UNUSED;
1818      asection *seg ATTRIBUTE_UNUSED;
1819 {
1820   abort ();
1821   return 0;
1822 }
1823
1824 long
1825 md_pcrel_from_section (fixp, sec)
1826      fixS *fixp;
1827      segT sec;
1828 {
1829   if (fixp->fx_addsy != (symbolS *) NULL
1830       && (!S_IS_DEFINED (fixp->fx_addsy)
1831           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1832     return 0;
1833   return fixp->fx_frag->fr_address + fixp->fx_where;
1834 }
1835
1836 void
1837 md_apply_fix3 (fixP, valP, seg)
1838      fixS *fixP;
1839      valueT *valP;
1840      segT seg ATTRIBUTE_UNUSED;
1841 {
1842   char *where;
1843   unsigned long insn, insn2;
1844   long value = *valP;
1845
1846   if (fixP->fx_addsy == (symbolS *) NULL)
1847     fixP->fx_done = 1;
1848
1849   /* We don't support subtracting a symbol.  */
1850   if (fixP->fx_subsy != (symbolS *) NULL)
1851     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1852
1853   /* Fetch the instruction, insert the fully resolved operand
1854      value, and stuff the instruction back again.  */
1855   where = fixP->fx_frag->fr_literal + fixP->fx_where;
1856   insn = bfd_getb32 ((unsigned char *) where);
1857
1858   switch (fixP->fx_r_type)
1859     {
1860     case BFD_RELOC_8:  /* Check for a bad .byte directive.  */
1861       if (fixP->fx_addsy != NULL)
1862         as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
1863                 fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1864       else if (((unsigned)value) > 0xff)
1865         as_bad (_("line %d: unable to place value %lx into a byte"),
1866                 fixP->fx_line, value);
1867       else
1868         *(unsigned char *) where = value;
1869       break;
1870
1871     case BFD_RELOC_16:  /* Check for a bad .short directive.  */
1872       if (fixP->fx_addsy != NULL)
1873         as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
1874                 fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1875       else if (((unsigned)value) > 0xffff)
1876         as_bad (_("line %d: unable to place value %lx into a short"),
1877                 fixP->fx_line, value);
1878       else
1879         bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1880       break;
1881
1882     case BFD_RELOC_64:  /* Check for a bad .quad directive.  */
1883       if (fixP->fx_addsy != NULL)
1884         as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
1885                 fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1886       else
1887         {
1888           bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1889           bfd_putb32 (0, ((unsigned char *) where) + 4);
1890         }
1891       break;
1892
1893     case BFD_RELOC_D30V_6:
1894       check_size (value, 6, fixP->fx_file, fixP->fx_line);
1895       insn |= value & 0x3F;
1896       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1897       break;
1898
1899     case BFD_RELOC_D30V_9_PCREL:
1900       if (fixP->fx_where & 0x7)
1901         {
1902           if (fixP->fx_done)
1903             value += 4;
1904           else
1905             fixP->fx_r_type = BFD_RELOC_D30V_9_PCREL_R;
1906         }
1907       check_size (value, 9, fixP->fx_file, fixP->fx_line);
1908       insn |= ((value >> 3) & 0x3F) << 12;
1909       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1910       break;
1911
1912     case BFD_RELOC_D30V_15:
1913       check_size (value, 15, fixP->fx_file, fixP->fx_line);
1914       insn |= (value >> 3) & 0xFFF;
1915       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1916       break;
1917
1918     case BFD_RELOC_D30V_15_PCREL:
1919       if (fixP->fx_where & 0x7)
1920         {
1921           if (fixP->fx_done)
1922             value += 4;
1923           else
1924             fixP->fx_r_type = BFD_RELOC_D30V_15_PCREL_R;
1925         }
1926       check_size (value, 15, fixP->fx_file, fixP->fx_line);
1927       insn |= (value >> 3) & 0xFFF;
1928       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1929       break;
1930
1931     case BFD_RELOC_D30V_21:
1932       check_size (value, 21, fixP->fx_file, fixP->fx_line);
1933       insn |= (value >> 3) & 0x3FFFF;
1934       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1935       break;
1936
1937     case BFD_RELOC_D30V_21_PCREL:
1938       if (fixP->fx_where & 0x7)
1939         {
1940           if (fixP->fx_done)
1941             value += 4;
1942           else
1943             fixP->fx_r_type = BFD_RELOC_D30V_21_PCREL_R;
1944         }
1945       check_size (value, 21, fixP->fx_file, fixP->fx_line);
1946       insn |= (value >> 3) & 0x3FFFF;
1947       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1948       break;
1949
1950     case BFD_RELOC_D30V_32:
1951       insn2 = bfd_getb32 ((unsigned char *) where + 4);
1952       insn |= (value >> 26) & 0x3F;             /* Top 6 bits.  */
1953       insn2 |= ((value & 0x03FC0000) << 2);     /* Next 8 bits.  */
1954       insn2 |= value & 0x0003FFFF;              /* Bottom 18 bits.  */
1955       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1956       bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
1957       break;
1958
1959     case BFD_RELOC_D30V_32_PCREL:
1960       insn2 = bfd_getb32 ((unsigned char *) where + 4);
1961       insn |= (value >> 26) & 0x3F;             /* Top 6 bits.  */
1962       insn2 |= ((value & 0x03FC0000) << 2);     /* Next 8 bits.  */
1963       insn2 |= value & 0x0003FFFF;              /* Bottom 18 bits.  */
1964       bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1965       bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
1966       break;
1967
1968     case BFD_RELOC_32:
1969       bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1970       break;
1971
1972     default:
1973       as_bad (_("line %d: unknown relocation type: 0x%x"),
1974               fixP->fx_line, fixP->fx_r_type);
1975     }
1976 }
1977
1978 /* Called after the assembler has finished parsing the input file or
1979    after a label is defined.  Because the D30V assembler sometimes
1980    saves short instructions to see if it can package them with the
1981    next instruction, there may be a short instruction that still needs
1982    written.  */
1983
1984 int
1985 d30v_cleanup (use_sequential)
1986      int use_sequential;
1987 {
1988   segT seg;
1989   subsegT subseg;
1990
1991   if (prev_insn != -1)
1992     {
1993       seg = now_seg;
1994       subseg = now_subseg;
1995       subseg_set (prev_seg, prev_subseg);
1996       write_1_short (&prev_opcode, (long) prev_insn, fixups->next,
1997                      use_sequential);
1998       subseg_set (seg, subseg);
1999       prev_insn = -1;
2000       if (use_sequential)
2001         prev_mul32_p = FALSE;
2002     }
2003
2004   return 1;
2005 }
2006
2007 static void
2008 d30v_number_to_chars (buf, value, n)
2009      char *buf;                 /* Return 'nbytes' of chars here.  */
2010      long long value;           /* The value of the bits.  */
2011      int n;                     /* Number of bytes in the output.  */
2012 {
2013   while (n--)
2014     {
2015       buf[n] = value & 0xff;
2016       value >>= 8;
2017     }
2018 }
2019
2020 /* This function is called at the start of every line.  It checks to
2021    see if the first character is a '.', which indicates the start of a
2022    pseudo-op.  If it is, then write out any unwritten instructions.  */
2023
2024 void
2025 d30v_start_line ()
2026 {
2027   char *c = input_line_pointer;
2028
2029   while (ISSPACE (*c))
2030     c++;
2031
2032   if (*c == '.')
2033     d30v_cleanup (FALSE);
2034 }
2035
2036 static void
2037 check_size (value, bits, file, line)
2038      long value;
2039      int bits;
2040      char *file;
2041      int line;
2042 {
2043   int tmp, max;
2044
2045   if (value < 0)
2046     tmp = ~value;
2047   else
2048     tmp = value;
2049
2050   max = (1 << (bits - 1)) - 1;
2051
2052   if (tmp > max)
2053     as_bad_where (file, line, _("value too large to fit in %d bits"), bits);
2054 }
2055
2056 /* d30v_frob_label() is called when after a label is recognized.  */
2057
2058 void
2059 d30v_frob_label (lab)
2060      symbolS *lab;
2061 {
2062   /* Emit any pending instructions.  */
2063   d30v_cleanup (FALSE);
2064
2065   /* Update the label's address with the current output pointer.  */
2066   symbol_set_frag (lab, frag_now);
2067   S_SET_VALUE (lab, (valueT) frag_now_fix ());
2068
2069   /* Record this label for future adjustment after we find out what
2070      kind of data it references, and the required alignment therewith.  */
2071   d30v_last_label = lab;
2072 }
2073
2074 /* Hook into cons for capturing alignment changes.  */
2075
2076 void
2077 d30v_cons_align (size)
2078      int size;
2079 {
2080   int log_size;
2081
2082   log_size = 0;
2083   while ((size >>= 1) != 0)
2084     ++log_size;
2085
2086   if (d30v_current_align < log_size)
2087     d30v_align (log_size, (char *) NULL, NULL);
2088   else if (d30v_current_align > log_size)
2089     d30v_current_align = log_size;
2090   d30v_last_label = NULL;
2091 }
2092
2093 /* Called internally to handle all alignment needs.  This takes care
2094    of eliding calls to frag_align if'n the cached current alignment
2095    says we've already got it, as well as taking care of the auto-aligning
2096    labels wrt code.  */
2097
2098 static void
2099 d30v_align (n, pfill, label)
2100      int n;
2101      char *pfill;
2102      symbolS *label;
2103 {
2104   /* The front end is prone to changing segments out from under us
2105      temporarily when -g is in effect.  */
2106   int switched_seg_p = (d30v_current_align_seg != now_seg);
2107
2108   /* Do not assume that if 'd30v_current_align >= n' and
2109      '! switched_seg_p' that it is safe to avoid performing
2110      this alignment request.  The alignment of the current frag
2111      can be changed under our feet, for example by a .ascii
2112      directive in the source code.  cf testsuite/gas/d30v/reloc.s  */
2113   d30v_cleanup (FALSE);
2114
2115   if (pfill == NULL)
2116     {
2117       if (n > 2
2118           && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
2119         {
2120           static char const nop[4] = { 0x00, 0xf0, 0x00, 0x00 };
2121
2122           /* First, make sure we're on a four-byte boundary, in case
2123              someone has been putting .byte values the text section.  */
2124           if (d30v_current_align < 2 || switched_seg_p)
2125             frag_align (2, 0, 0);
2126           frag_align_pattern (n, nop, sizeof nop, 0);
2127         }
2128       else
2129         frag_align (n, 0, 0);
2130     }
2131   else
2132     frag_align (n, *pfill, 0);
2133
2134   if (!switched_seg_p)
2135     d30v_current_align = n;
2136
2137   if (label != NULL)
2138     {
2139       symbolS     *sym;
2140       int          label_seen = FALSE;
2141       struct frag *old_frag;
2142       valueT       old_value;
2143       valueT       new_value;
2144
2145       assert (S_GET_SEGMENT (label) == now_seg);
2146
2147       old_frag  = symbol_get_frag (label);
2148       old_value = S_GET_VALUE (label);
2149       new_value = (valueT) frag_now_fix ();
2150
2151       /* It is possible to have more than one label at a particular
2152          address, especially if debugging is enabled, so we must
2153          take care to adjust all the labels at this address in this
2154          fragment.  To save time we search from the end of the symbol
2155          list, backwards, since the symbols we are interested in are
2156          almost certainly the ones that were most recently added.
2157          Also to save time we stop searching once we have seen at least
2158          one matching label, and we encounter a label that is no longer
2159          in the target fragment.  Note, this search is guaranteed to
2160          find at least one match when sym == label, so no special case
2161          code is necessary.  */
2162       for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
2163         {
2164           if (symbol_get_frag (sym) == old_frag
2165               && S_GET_VALUE (sym) == old_value)
2166             {
2167               label_seen = TRUE;
2168               symbol_set_frag (sym, frag_now);
2169               S_SET_VALUE (sym, new_value);
2170             }
2171           else if (label_seen && symbol_get_frag (sym) != old_frag)
2172             break;
2173         }
2174     }
2175
2176   record_alignment (now_seg, n);
2177 }
2178
2179 /* Handle the .align pseudo-op.  This aligns to a power of two.  We
2180    hook here to latch the current alignment.  */
2181
2182 static void
2183 s_d30v_align (ignore)
2184      int ignore ATTRIBUTE_UNUSED;
2185 {
2186   int align;
2187   char fill, *pfill = NULL;
2188   long max_alignment = 15;
2189
2190   align = get_absolute_expression ();
2191   if (align > max_alignment)
2192     {
2193       align = max_alignment;
2194       as_warn (_("Alignment too large: %d assumed"), align);
2195     }
2196   else if (align < 0)
2197     {
2198       as_warn (_("Alignment negative: 0 assumed"));
2199       align = 0;
2200     }
2201
2202   if (*input_line_pointer == ',')
2203     {
2204       input_line_pointer++;
2205       fill = get_absolute_expression ();
2206       pfill = &fill;
2207     }
2208
2209   d30v_last_label = NULL;
2210   d30v_align (align, pfill, NULL);
2211
2212   demand_empty_rest_of_line ();
2213 }
2214
2215 /* Handle the .text pseudo-op.  This is like the usual one, but it
2216    clears the saved last label and resets known alignment.  */
2217
2218 static void
2219 s_d30v_text (i)
2220      int i;
2221
2222 {
2223   s_text (i);
2224   d30v_last_label = NULL;
2225   d30v_current_align = 0;
2226   d30v_current_align_seg = now_seg;
2227 }
2228
2229 /* Handle the .data pseudo-op.  This is like the usual one, but it
2230    clears the saved last label and resets known alignment.  */
2231
2232 static void
2233 s_d30v_data (i)
2234      int i;
2235 {
2236   s_data (i);
2237   d30v_last_label = NULL;
2238   d30v_current_align = 0;
2239   d30v_current_align_seg = now_seg;
2240 }
2241
2242 /* Handle the .section pseudo-op.  This is like the usual one, but it
2243    clears the saved last label and resets known alignment.  */
2244
2245 static void
2246 s_d30v_section (ignore)
2247      int ignore;
2248 {
2249   obj_elf_section (ignore);
2250   d30v_last_label = NULL;
2251   d30v_current_align = 0;
2252   d30v_current_align_seg = now_seg;
2253 }