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