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