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