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