Home | History | Annotate | Download | only in config
      1 /* tc-c30.c -- Assembly code for the Texas Instruments TMS320C30
      2    Copyright (C) 1998-2014 Free Software Foundation, Inc.
      3    Contributed by Steven Haworth (steve (at) pm.cse.rmit.edu.au)
      4 
      5    This file is part of GAS, the GNU Assembler.
      6 
      7    GAS is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3, or (at your option)
     10    any later version.
     11 
     12    GAS is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with GAS; see the file COPYING.  If not, write to the Free
     19    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     20    02110-1301, USA.  */
     21 
     22 /* Texas Instruments TMS320C30 machine specific gas.
     23    Written by Steven Haworth (steve (at) pm.cse.rmit.edu.au).
     24    Bugs & suggestions are completely welcome.  This is free software.
     25    Please help us make it better.  */
     26 
     27 #include "as.h"
     28 #include "safe-ctype.h"
     29 #include "opcode/tic30.h"
     30 
     31 /* Put here all non-digit non-letter characters that may occur in an
     32    operand.  */
     33 static char operand_special_chars[] = "%$-+(,)*._~/<>&^!:[@]";
     34 static char *ordinal_names[] =
     35 {
     36   N_("first"), N_("second"), N_("third"), N_("fourth"), N_("fifth")
     37 };
     38 
     39 const char comment_chars[]        = ";";
     40 const char line_comment_chars[]   = "*";
     41 const char line_separator_chars[] = "";
     42 
     43 const char *md_shortopts = "";
     44 struct option md_longopts[] =
     45 {
     46   {NULL, no_argument, NULL, 0}
     47 };
     48 
     49 size_t md_longopts_size = sizeof (md_longopts);
     50 
     51 /* Chars that mean this number is a floating point constant.
     52    As in 0f12.456
     53    or    0d1.2345e12.  */
     54 const char FLT_CHARS[] = "fFdDxX";
     55 
     56 /* Chars that can be used to separate mant from exp in floating point
     57    nums.  */
     58 const char EXP_CHARS[] = "eE";
     59 
     60 /* Tables for lexical analysis.  */
     61 static char opcode_chars[256];
     62 static char register_chars[256];
     63 static char operand_chars[256];
     64 static char space_chars[256];
     65 static char identifier_chars[256];
     66 static char digit_chars[256];
     67 
     68 /* Lexical macros.  */
     69 #define is_opcode_char(x)     (opcode_chars     [(unsigned char) x])
     70 #define is_operand_char(x)    (operand_chars    [(unsigned char) x])
     71 #define is_register_char(x)   (register_chars   [(unsigned char) x])
     72 #define is_space_char(x)      (space_chars      [(unsigned char) x])
     73 #define is_identifier_char(x) (identifier_chars [(unsigned char) x])
     74 #define is_digit_char(x)      (digit_chars      [(unsigned char) x])
     75 
     76 const pseudo_typeS md_pseudo_table[] =
     77 {
     78   {0, 0, 0}
     79 };
     80 
     81 static int ATTRIBUTE_PRINTF_1
     82 debug (const char *string, ...)
     83 {
     84   if (flag_debug)
     85     {
     86       char str[100];
     87       va_list argptr;
     88 
     89       va_start (argptr, string);
     90       vsprintf (str, string, argptr);
     91       va_end (argptr);
     92       if (str[0] == '\0')
     93 	return (0);
     94       fputs (str, USE_STDOUT ? stdout : stderr);
     95       return strlen (str);
     96     }
     97   else
     98     return 0;
     99 }
    100 
    101 /* Hash table for opcode lookup.  */
    102 static struct hash_control *op_hash;
    103 /* Hash table for parallel opcode lookup.  */
    104 static struct hash_control *parop_hash;
    105 /* Hash table for register lookup.  */
    106 static struct hash_control *reg_hash;
    107 /* Hash table for indirect addressing lookup.  */
    108 static struct hash_control *ind_hash;
    109 
    110 void
    111 md_begin (void)
    112 {
    113   const char *hash_err;
    114 
    115   debug ("In md_begin()\n");
    116   op_hash = hash_new ();
    117 
    118   {
    119     const insn_template *current_optab = tic30_optab;
    120 
    121     for (; current_optab < tic30_optab_end; current_optab++)
    122       {
    123 	hash_err = hash_insert (op_hash, current_optab->name,
    124 				(char *) current_optab);
    125 	if (hash_err)
    126 	  as_fatal ("Internal Error: Can't Hash %s: %s",
    127 		    current_optab->name, hash_err);
    128       }
    129   }
    130 
    131   parop_hash = hash_new ();
    132 
    133   {
    134     const partemplate *current_parop = tic30_paroptab;
    135 
    136     for (; current_parop < tic30_paroptab_end; current_parop++)
    137       {
    138 	hash_err = hash_insert (parop_hash, current_parop->name,
    139 				(char *) current_parop);
    140 	if (hash_err)
    141 	  as_fatal ("Internal Error: Can't Hash %s: %s",
    142 		    current_parop->name, hash_err);
    143       }
    144   }
    145 
    146   reg_hash = hash_new ();
    147 
    148   {
    149     const reg *current_reg = tic30_regtab;
    150 
    151     for (; current_reg < tic30_regtab_end; current_reg++)
    152       {
    153 	hash_err = hash_insert (reg_hash, current_reg->name,
    154 				(char *) current_reg);
    155 	if (hash_err)
    156 	  as_fatal ("Internal Error: Can't Hash %s: %s",
    157 		    current_reg->name, hash_err);
    158       }
    159   }
    160 
    161   ind_hash = hash_new ();
    162 
    163   {
    164     const ind_addr_type *current_ind = tic30_indaddr_tab;
    165 
    166     for (; current_ind < tic30_indaddrtab_end; current_ind++)
    167       {
    168 	hash_err = hash_insert (ind_hash, current_ind->syntax,
    169 				(char *) current_ind);
    170 	if (hash_err)
    171 	  as_fatal ("Internal Error: Can't Hash %s: %s",
    172 		    current_ind->syntax, hash_err);
    173       }
    174   }
    175 
    176   /* Fill in lexical tables:  opcode_chars, operand_chars, space_chars.  */
    177   {
    178     int c;
    179     char *p;
    180 
    181     for (c = 0; c < 256; c++)
    182       {
    183 	if (ISLOWER (c) || ISDIGIT (c))
    184 	  {
    185 	    opcode_chars[c] = c;
    186 	    register_chars[c] = c;
    187 	  }
    188 	else if (ISUPPER (c))
    189 	  {
    190 	    opcode_chars[c] = TOLOWER (c);
    191 	    register_chars[c] = opcode_chars[c];
    192 	  }
    193 	else if (c == ')' || c == '(')
    194 	  register_chars[c] = c;
    195 
    196 	if (ISUPPER (c) || ISLOWER (c) || ISDIGIT (c))
    197 	  operand_chars[c] = c;
    198 
    199 	if (ISDIGIT (c) || c == '-')
    200 	  digit_chars[c] = c;
    201 
    202 	if (ISALPHA (c) || c == '_' || c == '.' || ISDIGIT (c))
    203 	  identifier_chars[c] = c;
    204 
    205 	if (c == ' ' || c == '\t')
    206 	  space_chars[c] = c;
    207 
    208 	if (c == '_')
    209 	  opcode_chars[c] = c;
    210       }
    211     for (p = operand_special_chars; *p != '\0'; p++)
    212       operand_chars[(unsigned char) *p] = *p;
    213   }
    214 }
    215 
    216 /* Address Mode OR values.  */
    217 #define AM_Register  0x00000000
    218 #define AM_Direct    0x00200000
    219 #define AM_Indirect  0x00400000
    220 #define AM_Immediate 0x00600000
    221 #define AM_NotReq    0xFFFFFFFF
    222 
    223 /* PC Relative OR values.  */
    224 #define PC_Register 0x00000000
    225 #define PC_Relative 0x02000000
    226 
    227 typedef struct
    228 {
    229   unsigned op_type;
    230   struct
    231   {
    232     int resolved;
    233     unsigned address;
    234     char *label;
    235     expressionS direct_expr;
    236   } direct;
    237   struct
    238   {
    239     unsigned mod;
    240     int ARnum;
    241     unsigned char disp;
    242   } indirect;
    243   struct
    244   {
    245     unsigned opcode;
    246   } reg;
    247   struct
    248   {
    249     int resolved;
    250     int decimal_found;
    251     float f_number;
    252     int s_number;
    253     unsigned int u_number;
    254     char *label;
    255     expressionS imm_expr;
    256   } immediate;
    257 } operand;
    258 
    259 insn_template *opcode;
    260 
    261 struct tic30_insn
    262 {
    263   insn_template *tm;		/* Template of current instruction.  */
    264   unsigned opcode;		/* Final opcode.  */
    265   unsigned int operands;	/* Number of given operands.  */
    266   /* Type of operand given in instruction.  */
    267   operand *operand_type[MAX_OPERANDS];
    268   unsigned addressing_mode;	/* Final addressing mode of instruction.  */
    269 };
    270 
    271 struct tic30_insn insn;
    272 static int found_parallel_insn;
    273 
    274 static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
    275 
    276 static char *
    277 output_invalid (char c)
    278 {
    279   if (ISPRINT (c))
    280     snprintf (output_invalid_buf, sizeof (output_invalid_buf),
    281 	      "'%c'", c);
    282   else
    283     snprintf (output_invalid_buf, sizeof (output_invalid_buf),
    284 	      "(0x%x)", (unsigned char) c);
    285   return output_invalid_buf;
    286 }
    287 
    288 /* next_line points to the next line after the current instruction
    289    (current_line).  Search for the parallel bars, and if found, merge two
    290    lines into internal syntax for a parallel instruction:
    291      q_[INSN1]_[INSN2] [OPERANDS1] | [OPERANDS2]
    292    By this stage, all comments are scrubbed, and only the bare lines are
    293    given.  */
    294 
    295 #define NONE           0
    296 #define START_OPCODE   1
    297 #define END_OPCODE     2
    298 #define START_OPERANDS 3
    299 #define END_OPERANDS   4
    300 
    301 static char *
    302 tic30_find_parallel_insn (char *current_line, char *next_line)
    303 {
    304   int found_parallel = 0;
    305   char first_opcode[256];
    306   char second_opcode[256];
    307   char first_operands[256];
    308   char second_operands[256];
    309   char *parallel_insn;
    310 
    311   debug ("In tic30_find_parallel_insn()\n");
    312   while (!is_end_of_line[(unsigned char) *next_line])
    313     {
    314       if (*next_line == PARALLEL_SEPARATOR
    315 	  && *(next_line + 1) == PARALLEL_SEPARATOR)
    316 	{
    317 	  found_parallel = 1;
    318 	  next_line++;
    319 	  break;
    320 	}
    321       next_line++;
    322     }
    323   if (!found_parallel)
    324     return NULL;
    325   debug ("Found a parallel instruction\n");
    326 
    327   {
    328     int i;
    329     char *op, *operands, *line;
    330 
    331     for (i = 0; i < 2; i++)
    332       {
    333 	if (i == 0)
    334 	  {
    335 	    op = &first_opcode[0];
    336 	    operands = &first_operands[0];
    337 	    line = current_line;
    338 	  }
    339 	else
    340 	  {
    341 	    op = &second_opcode[0];
    342 	    operands = &second_operands[0];
    343 	    line = next_line;
    344 	  }
    345 
    346 	{
    347 	  int search_status = NONE;
    348 	  int char_ptr = 0;
    349 	  char c;
    350 
    351 	  while (!is_end_of_line[(unsigned char) (c = *line)])
    352 	    {
    353 	      if (is_opcode_char (c) && search_status == NONE)
    354 		{
    355 		  op[char_ptr++] = TOLOWER (c);
    356 		  search_status = START_OPCODE;
    357 		}
    358 	      else if (is_opcode_char (c) && search_status == START_OPCODE)
    359 		op[char_ptr++] = TOLOWER (c);
    360 	      else if (!is_opcode_char (c) && search_status == START_OPCODE)
    361 		{
    362 		  op[char_ptr] = '\0';
    363 		  char_ptr = 0;
    364 		  search_status = END_OPCODE;
    365 		}
    366 	      else if (is_operand_char (c) && search_status == START_OPERANDS)
    367 		operands[char_ptr++] = c;
    368 
    369 	      if (is_operand_char (c) && search_status == END_OPCODE)
    370 		{
    371 		  operands[char_ptr++] = c;
    372 		  search_status = START_OPERANDS;
    373 		}
    374 
    375 	      line++;
    376 	    }
    377 	  if (search_status != START_OPERANDS)
    378 	    return NULL;
    379 	  operands[char_ptr] = '\0';
    380 	}
    381       }
    382   }
    383   parallel_insn = malloc (strlen (first_opcode) + strlen (first_operands)
    384 			  + strlen (second_opcode) + strlen (second_operands) + 8);
    385   sprintf (parallel_insn, "q_%s_%s %s | %s",
    386 	   first_opcode, second_opcode,
    387 	   first_operands, second_operands);
    388   debug ("parallel insn = %s\n", parallel_insn);
    389   return parallel_insn;
    390 }
    391 
    392 #undef NONE
    393 #undef START_OPCODE
    394 #undef END_OPCODE
    395 #undef START_OPERANDS
    396 #undef END_OPERANDS
    397 
    398 static operand *
    399 tic30_operand (char *token)
    400 {
    401   unsigned int count;
    402   char ind_buffer[strlen (token)];
    403   operand *current_op;
    404 
    405   debug ("In tic30_operand with %s\n", token);
    406   current_op = malloc (sizeof (* current_op));
    407   memset (current_op, '\0', sizeof (operand));
    408 
    409   if (*token == DIRECT_REFERENCE)
    410     {
    411       char *token_posn = token + 1;
    412       int direct_label = 0;
    413 
    414       debug ("Found direct reference\n");
    415       while (*token_posn)
    416 	{
    417 	  if (!is_digit_char (*token_posn))
    418 	    direct_label = 1;
    419 	  token_posn++;
    420 	}
    421 
    422       if (direct_label)
    423 	{
    424 	  char *save_input_line_pointer;
    425 	  segT retval;
    426 
    427 	  debug ("Direct reference is a label\n");
    428 	  current_op->direct.label = token + 1;
    429 	  save_input_line_pointer = input_line_pointer;
    430 	  input_line_pointer = token + 1;
    431 	  debug ("Current input_line_pointer: %s\n", input_line_pointer);
    432 	  retval = expression (&current_op->direct.direct_expr);
    433 
    434 	  debug ("Expression type: %d\n",
    435 		 current_op->direct.direct_expr.X_op);
    436 	  debug ("Expression addnum: %ld\n",
    437 		 (long) current_op->direct.direct_expr.X_add_number);
    438 	  debug ("Segment: %p\n", retval);
    439 
    440 	  input_line_pointer = save_input_line_pointer;
    441 
    442 	  if (current_op->direct.direct_expr.X_op == O_constant)
    443 	    {
    444 	      current_op->direct.address =
    445 		current_op->direct.direct_expr.X_add_number;
    446 	      current_op->direct.resolved = 1;
    447 	    }
    448 	}
    449       else
    450 	{
    451 	  debug ("Direct reference is a number\n");
    452 	  current_op->direct.address = atoi (token + 1);
    453 	  current_op->direct.resolved = 1;
    454 	}
    455       current_op->op_type = Direct;
    456     }
    457   else if (*token == INDIRECT_REFERENCE)
    458     {
    459       /* Indirect reference operand.  */
    460       int found_ar = 0;
    461       int found_disp = 0;
    462       int ar_number = -1;
    463       int disp_number = 0;
    464       int buffer_posn = 1;
    465       ind_addr_type *ind_addr_op;
    466 
    467       debug ("Found indirect reference\n");
    468       ind_buffer[0] = *token;
    469 
    470       for (count = 1; count < strlen (token); count++)
    471 	{
    472 	  /* Strip operand.  */
    473 	  ind_buffer[buffer_posn] = TOLOWER (*(token + count));
    474 
    475 	  if ((*(token + count - 1) == 'a' || *(token + count - 1) == 'A')
    476 	      && (*(token + count) == 'r' || *(token + count) == 'R'))
    477 	    {
    478 	      /* AR reference is found, so get its number and remove
    479 		 it from the buffer so it can pass through hash_find().  */
    480 	      if (found_ar)
    481 		{
    482 		  as_bad (_("More than one AR register found in indirect reference"));
    483 		  return NULL;
    484 		}
    485 	      if (*(token + count + 1) < '0' || *(token + count + 1) > '7')
    486 		{
    487 		  as_bad (_("Illegal AR register in indirect reference"));
    488 		  return NULL;
    489 		}
    490 	      ar_number = *(token + count + 1) - '0';
    491 	      found_ar = 1;
    492 	      count++;
    493 	    }
    494 
    495 	  if (*(token + count) == '(')
    496 	    {
    497 	      /* Parenthesis found, so check if a displacement value is
    498 		 inside.  If so, get the value and remove it from the
    499 		 buffer.  */
    500 	      if (is_digit_char (*(token + count + 1)))
    501 		{
    502 		  char disp[10];
    503 		  int disp_posn = 0;
    504 
    505 		  if (found_disp)
    506 		    {
    507 		      as_bad (_("More than one displacement found in indirect reference"));
    508 		      return NULL;
    509 		    }
    510 		  count++;
    511 		  while (*(token + count) != ')')
    512 		    {
    513 		      if (!is_digit_char (*(token + count)))
    514 			{
    515 			  as_bad (_("Invalid displacement in indirect reference"));
    516 			  return NULL;
    517 			}
    518 		      disp[disp_posn++] = *(token + (count++));
    519 		    }
    520 		  disp[disp_posn] = '\0';
    521 		  disp_number = atoi (disp);
    522 		  count--;
    523 		  found_disp = 1;
    524 		}
    525 	    }
    526 	  buffer_posn++;
    527 	}
    528 
    529       ind_buffer[buffer_posn] = '\0';
    530       if (!found_ar)
    531 	{
    532 	  as_bad (_("AR register not found in indirect reference"));
    533 	  return NULL;
    534 	}
    535 
    536       ind_addr_op = (ind_addr_type *) hash_find (ind_hash, ind_buffer);
    537       if (ind_addr_op)
    538 	{
    539 	  debug ("Found indirect reference: %s\n", ind_addr_op->syntax);
    540 	  if (ind_addr_op->displacement == IMPLIED_DISP)
    541 	    {
    542 	      found_disp = 1;
    543 	      disp_number = 1;
    544 	    }
    545 	  else if ((ind_addr_op->displacement == DISP_REQUIRED) && !found_disp)
    546 	    {
    547 	      /* Maybe an implied displacement of 1 again.  */
    548 	      as_bad (_("required displacement wasn't given in indirect reference"));
    549 	      return 0;
    550 	    }
    551 	}
    552       else
    553 	{
    554 	  as_bad (_("illegal indirect reference"));
    555 	  return NULL;
    556 	}
    557 
    558       if (found_disp && (disp_number < 0 || disp_number > 255))
    559 	{
    560 	  as_bad (_("displacement must be an unsigned 8-bit number"));
    561 	  return NULL;
    562 	}
    563 
    564       current_op->indirect.mod = ind_addr_op->modfield;
    565       current_op->indirect.disp = disp_number;
    566       current_op->indirect.ARnum = ar_number;
    567       current_op->op_type = Indirect;
    568     }
    569   else
    570     {
    571       reg *regop = (reg *) hash_find (reg_hash, token);
    572 
    573       if (regop)
    574 	{
    575 	  debug ("Found register operand: %s\n", regop->name);
    576 	  if (regop->regtype == REG_ARn)
    577 	    current_op->op_type = ARn;
    578 	  else if (regop->regtype == REG_Rn)
    579 	    current_op->op_type = Rn;
    580 	  else if (regop->regtype == REG_DP)
    581 	    current_op->op_type = DPReg;
    582 	  else
    583 	    current_op->op_type = OtherReg;
    584 	  current_op->reg.opcode = regop->opcode;
    585 	}
    586       else
    587 	{
    588 	  if (!is_digit_char (*token)
    589 	      || *(token + 1) == 'x'
    590 	      || strchr (token, 'h'))
    591 	    {
    592 	      char *save_input_line_pointer;
    593 	      segT retval;
    594 
    595 	      debug ("Probably a label: %s\n", token);
    596 	      current_op->immediate.label = malloc (strlen (token) + 1);
    597 	      strcpy (current_op->immediate.label, token);
    598 	      current_op->immediate.label[strlen (token)] = '\0';
    599 	      save_input_line_pointer = input_line_pointer;
    600 	      input_line_pointer = token;
    601 
    602 	      debug ("Current input_line_pointer: %s\n", input_line_pointer);
    603 	      retval = expression (&current_op->immediate.imm_expr);
    604 	      debug ("Expression type: %d\n",
    605 		     current_op->immediate.imm_expr.X_op);
    606 	      debug ("Expression addnum: %ld\n",
    607 		     (long) current_op->immediate.imm_expr.X_add_number);
    608 	      debug ("Segment: %p\n", retval);
    609 	      input_line_pointer = save_input_line_pointer;
    610 
    611 	      if (current_op->immediate.imm_expr.X_op == O_constant)
    612 		{
    613 		  current_op->immediate.s_number
    614 		    = current_op->immediate.imm_expr.X_add_number;
    615 		  current_op->immediate.u_number
    616 		    = (unsigned int) current_op->immediate.imm_expr.X_add_number;
    617 		  current_op->immediate.resolved = 1;
    618 		}
    619 	    }
    620 	  else
    621 	    {
    622 	      debug ("Found a number or displacement\n");
    623 	      for (count = 0; count < strlen (token); count++)
    624 		if (*(token + count) == '.')
    625 		  current_op->immediate.decimal_found = 1;
    626 	      current_op->immediate.label = malloc (strlen (token) + 1);
    627 	      strcpy (current_op->immediate.label, token);
    628 	      current_op->immediate.label[strlen (token)] = '\0';
    629 	      current_op->immediate.f_number = (float) atof (token);
    630 	      current_op->immediate.s_number = (int) atoi (token);
    631 	      current_op->immediate.u_number = (unsigned int) atoi (token);
    632 	      current_op->immediate.resolved = 1;
    633 	    }
    634 	  current_op->op_type = Disp | Abs24 | Imm16 | Imm24;
    635 	  if (current_op->immediate.u_number <= 31)
    636 	    current_op->op_type |= IVector;
    637 	}
    638     }
    639   return current_op;
    640 }
    641 
    642 struct tic30_par_insn
    643 {
    644   partemplate *tm;		/* Template of current parallel instruction.  */
    645   unsigned operands[2];		/* Number of given operands for each insn.  */
    646   /* Type of operand given in instruction.  */
    647   operand *operand_type[2][MAX_OPERANDS];
    648   int swap_operands;		/* Whether to swap operands around.  */
    649   unsigned p_field;		/* Value of p field in multiply add/sub instructions.  */
    650   unsigned opcode;		/* Final opcode.  */
    651 };
    652 
    653 struct tic30_par_insn p_insn;
    654 
    655 static int
    656 tic30_parallel_insn (char *token)
    657 {
    658   static partemplate *p_opcode;
    659   char *current_posn = token;
    660   char *token_start;
    661   char save_char;
    662 
    663   debug ("In tic30_parallel_insn with %s\n", token);
    664   memset (&p_insn, '\0', sizeof (p_insn));
    665 
    666   while (is_opcode_char (*current_posn))
    667     current_posn++;
    668   {
    669     /* Find instruction.  */
    670     save_char = *current_posn;
    671     *current_posn = '\0';
    672     p_opcode = (partemplate *) hash_find (parop_hash, token);
    673     if (p_opcode)
    674       {
    675 	debug ("Found instruction %s\n", p_opcode->name);
    676 	p_insn.tm = p_opcode;
    677       }
    678     else
    679       {
    680 	char first_opcode[6] = {0};
    681 	char second_opcode[6] = {0};
    682 	unsigned int i;
    683 	int current_opcode = -1;
    684 	int char_ptr = 0;
    685 
    686 	for (i = 0; i < strlen (token); i++)
    687 	  {
    688 	    char ch = *(token + i);
    689 
    690 	    if (ch == '_' && current_opcode == -1)
    691 	      {
    692 		current_opcode = 0;
    693 		continue;
    694 	      }
    695 
    696 	    if (ch == '_' && current_opcode == 0)
    697 	      {
    698 		current_opcode = 1;
    699 		char_ptr = 0;
    700 		continue;
    701 	      }
    702 
    703 	    switch (current_opcode)
    704 	      {
    705 	      case 0:
    706 		first_opcode[char_ptr++] = ch;
    707 		break;
    708 	      case 1:
    709 		second_opcode[char_ptr++] = ch;
    710 		break;
    711 	      }
    712 	  }
    713 
    714 	debug ("first_opcode = %s\n", first_opcode);
    715 	debug ("second_opcode = %s\n", second_opcode);
    716 	sprintf (token, "q_%s_%s", second_opcode, first_opcode);
    717 	p_opcode = (partemplate *) hash_find (parop_hash, token);
    718 
    719 	if (p_opcode)
    720 	  {
    721 	    debug ("Found instruction %s\n", p_opcode->name);
    722 	    p_insn.tm = p_opcode;
    723 	    p_insn.swap_operands = 1;
    724 	  }
    725 	else
    726 	  return 0;
    727       }
    728     *current_posn = save_char;
    729   }
    730 
    731   {
    732     /* Find operands.  */
    733     int paren_not_balanced;
    734     int expecting_operand = 0;
    735     int found_separator = 0;
    736 
    737     do
    738       {
    739 	/* Skip optional white space before operand.  */
    740 	while (!is_operand_char (*current_posn)
    741 	       && *current_posn != END_OF_INSN)
    742 	  {
    743 	    if (!is_space_char (*current_posn)
    744 		&& *current_posn != PARALLEL_SEPARATOR)
    745 	      {
    746 		as_bad (_("Invalid character %s before %s operand"),
    747 			output_invalid (*current_posn),
    748 			ordinal_names[insn.operands]);
    749 		return 1;
    750 	      }
    751 	    if (*current_posn == PARALLEL_SEPARATOR)
    752 	      found_separator = 1;
    753 	    current_posn++;
    754 	  }
    755 
    756 	token_start = current_posn;
    757 	paren_not_balanced = 0;
    758 
    759 	while (paren_not_balanced || *current_posn != ',')
    760 	  {
    761 	    if (*current_posn == END_OF_INSN)
    762 	      {
    763 		if (paren_not_balanced)
    764 		  {
    765 		    as_bad (_("Unbalanced parenthesis in %s operand."),
    766 			    ordinal_names[insn.operands]);
    767 		    return 1;
    768 		  }
    769 		else
    770 		  break;
    771 	      }
    772 	    else if (*current_posn == PARALLEL_SEPARATOR)
    773 	      {
    774 		while (is_space_char (*(current_posn - 1)))
    775 		  current_posn--;
    776 		break;
    777 	      }
    778 	    else if (!is_operand_char (*current_posn)
    779 		     && !is_space_char (*current_posn))
    780 	      {
    781 		as_bad (_("Invalid character %s in %s operand"),
    782 			output_invalid (*current_posn),
    783 			ordinal_names[insn.operands]);
    784 		return 1;
    785 	      }
    786 
    787 	    if (*current_posn == '(')
    788 	      ++paren_not_balanced;
    789 	    if (*current_posn == ')')
    790 	      --paren_not_balanced;
    791 	    current_posn++;
    792 	  }
    793 
    794 	if (current_posn != token_start)
    795 	  {
    796 	    /* Yes, we've read in another operand.  */
    797 	    p_insn.operands[found_separator]++;
    798 	    if (p_insn.operands[found_separator] > MAX_OPERANDS)
    799 	      {
    800 		as_bad (_("Spurious operands; (%d operands/instruction max)"),
    801 			MAX_OPERANDS);
    802 		return 1;
    803 	      }
    804 
    805 	    /* Now parse operand adding info to 'insn' as we go along.  */
    806 	    save_char = *current_posn;
    807 	    *current_posn = '\0';
    808 	    p_insn.operand_type[found_separator][p_insn.operands[found_separator] - 1] =
    809 	      tic30_operand (token_start);
    810 	    *current_posn = save_char;
    811 	    if (!p_insn.operand_type[found_separator][p_insn.operands[found_separator] - 1])
    812 	      return 1;
    813 	  }
    814 	else
    815 	  {
    816 	    if (expecting_operand)
    817 	      {
    818 		as_bad (_("Expecting operand after ','; got nothing"));
    819 		return 1;
    820 	      }
    821 	    if (*current_posn == ',')
    822 	      {
    823 		as_bad (_("Expecting operand before ','; got nothing"));
    824 		return 1;
    825 	      }
    826 	  }
    827 
    828 	/* Now *current_posn must be either ',' or END_OF_INSN.  */
    829 	if (*current_posn == ',')
    830 	  {
    831 	    if (*++current_posn == END_OF_INSN)
    832 	      {
    833 		/* Just skip it, if it's \n complain.  */
    834 		as_bad (_("Expecting operand after ','; got nothing"));
    835 		return 1;
    836 	      }
    837 	    expecting_operand = 1;
    838 	  }
    839       }
    840     while (*current_posn != END_OF_INSN);
    841   }
    842 
    843   if (p_insn.swap_operands)
    844     {
    845       int temp_num, i;
    846       operand *temp_op;
    847 
    848       temp_num = p_insn.operands[0];
    849       p_insn.operands[0] = p_insn.operands[1];
    850       p_insn.operands[1] = temp_num;
    851       for (i = 0; i < MAX_OPERANDS; i++)
    852 	{
    853 	  temp_op = p_insn.operand_type[0][i];
    854 	  p_insn.operand_type[0][i] = p_insn.operand_type[1][i];
    855 	  p_insn.operand_type[1][i] = temp_op;
    856 	}
    857     }
    858 
    859   if (p_insn.operands[0] != p_insn.tm->operands_1)
    860     {
    861       as_bad (_("incorrect number of operands given in the first instruction"));
    862       return 1;
    863     }
    864 
    865   if (p_insn.operands[1] != p_insn.tm->operands_2)
    866     {
    867       as_bad (_("incorrect number of operands given in the second instruction"));
    868       return 1;
    869     }
    870 
    871   debug ("Number of operands in first insn: %d\n", p_insn.operands[0]);
    872   debug ("Number of operands in second insn: %d\n", p_insn.operands[1]);
    873 
    874   {
    875     /* Now check if operands are correct.  */
    876     int count;
    877     int num_rn = 0;
    878     int num_ind = 0;
    879 
    880     for (count = 0; count < 2; count++)
    881       {
    882 	unsigned int i;
    883 	for (i = 0; i < p_insn.operands[count]; i++)
    884 	  {
    885 	    if ((p_insn.operand_type[count][i]->op_type &
    886 		 p_insn.tm->operand_types[count][i]) == 0)
    887 	      {
    888 		as_bad (_("%s instruction, operand %d doesn't match"),
    889 			ordinal_names[count], i + 1);
    890 		return 1;
    891 	      }
    892 
    893 	    /* Get number of R register and indirect reference contained
    894 	       within the first two operands of each instruction.  This is
    895 	       required for the multiply parallel instructions which require
    896 	       two R registers and two indirect references, but not in any
    897 	       particular place.  */
    898 	    if ((p_insn.operand_type[count][i]->op_type & Rn) && i < 2)
    899 	      num_rn++;
    900 	    else if ((p_insn.operand_type[count][i]->op_type & Indirect)
    901 		     && i < 2)
    902 	      num_ind++;
    903 	  }
    904       }
    905 
    906     if ((p_insn.tm->operand_types[0][0] & (Indirect | Rn))
    907 	== (Indirect | Rn))
    908       {
    909 	/* Check for the multiply instructions.  */
    910 	if (num_rn != 2)
    911 	  {
    912 	    as_bad (_("incorrect format for multiply parallel instruction"));
    913 	    return 1;
    914 	  }
    915 
    916 	if (num_ind != 2)
    917 	  {
    918 	    /* Shouldn't get here.  */
    919 	    as_bad (_("incorrect format for multiply parallel instruction"));
    920 	    return 1;
    921 	  }
    922 
    923 	if ((p_insn.operand_type[0][2]->reg.opcode != 0x00)
    924 	    && (p_insn.operand_type[0][2]->reg.opcode != 0x01))
    925 	  {
    926 	    as_bad (_("destination for multiply can only be R0 or R1"));
    927 	    return 1;
    928 	  }
    929 
    930 	if ((p_insn.operand_type[1][2]->reg.opcode != 0x02)
    931 	    && (p_insn.operand_type[1][2]->reg.opcode != 0x03))
    932 	  {
    933 	    as_bad (_("destination for add/subtract can only be R2 or R3"));
    934 	    return 1;
    935 	  }
    936 
    937 	/* Now determine the P field for the instruction.  */
    938 	if (p_insn.operand_type[0][0]->op_type & Indirect)
    939 	  {
    940 	    if (p_insn.operand_type[0][1]->op_type & Indirect)
    941 	      p_insn.p_field = 0x00000000;	/* Ind * Ind, Rn  +/- Rn.  */
    942 	    else if (p_insn.operand_type[1][0]->op_type & Indirect)
    943 	      p_insn.p_field = 0x01000000;	/* Ind * Rn,  Ind +/- Rn.  */
    944 	    else
    945 	      p_insn.p_field = 0x03000000;	/* Ind * Rn,  Rn  +/- Ind.  */
    946 	  }
    947 	else
    948 	  {
    949 	    if (p_insn.operand_type[0][1]->op_type & Rn)
    950 	      p_insn.p_field = 0x02000000;	/* Rn  * Rn,  Ind +/- Ind.  */
    951 	    else if (p_insn.operand_type[1][0]->op_type & Indirect)
    952 	      {
    953 		operand *temp;
    954 		p_insn.p_field = 0x01000000;	/* Rn  * Ind, Ind +/- Rn.  */
    955 		/* Need to swap the two multiply operands around so that
    956 		   everything is in its place for the opcode makeup.
    957 		   ie so Ind * Rn, Ind +/- Rn.  */
    958 		temp = p_insn.operand_type[0][0];
    959 		p_insn.operand_type[0][0] = p_insn.operand_type[0][1];
    960 		p_insn.operand_type[0][1] = temp;
    961 	      }
    962 	    else
    963 	      {
    964 		operand *temp;
    965 		p_insn.p_field = 0x03000000;	/* Rn  * Ind, Rn  +/- Ind.  */
    966 		temp = p_insn.operand_type[0][0];
    967 		p_insn.operand_type[0][0] = p_insn.operand_type[0][1];
    968 		p_insn.operand_type[0][1] = temp;
    969 	      }
    970 	  }
    971       }
    972   }
    973 
    974   debug ("P field: %08X\n", p_insn.p_field);
    975 
    976   /* Finalise opcode.  This is easier for parallel instructions as they have
    977      to be fully resolved, there are no memory addresses allowed, except
    978      through indirect addressing, so there are no labels to resolve.  */
    979   p_insn.opcode = p_insn.tm->base_opcode;
    980 
    981   switch (p_insn.tm->oporder)
    982     {
    983     case OO_4op1:
    984       p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.ARnum);
    985       p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.mod << 3);
    986       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.ARnum << 8);
    987       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.mod << 11);
    988       p_insn.opcode |= (p_insn.operand_type[1][0]->reg.opcode << 16);
    989       p_insn.opcode |= (p_insn.operand_type[0][1]->reg.opcode << 22);
    990       break;
    991 
    992     case OO_4op2:
    993       p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.ARnum);
    994       p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.mod << 3);
    995       p_insn.opcode |= (p_insn.operand_type[1][0]->indirect.ARnum << 8);
    996       p_insn.opcode |= (p_insn.operand_type[1][0]->indirect.mod << 11);
    997       p_insn.opcode |= (p_insn.operand_type[1][1]->reg.opcode << 19);
    998       p_insn.opcode |= (p_insn.operand_type[0][1]->reg.opcode << 22);
    999       if (p_insn.operand_type[1][1]->reg.opcode == p_insn.operand_type[0][1]->reg.opcode)
   1000 	as_warn (_("loading the same register in parallel operation"));
   1001       break;
   1002 
   1003     case OO_4op3:
   1004       p_insn.opcode |= (p_insn.operand_type[0][1]->indirect.ARnum);
   1005       p_insn.opcode |= (p_insn.operand_type[0][1]->indirect.mod << 3);
   1006       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.ARnum << 8);
   1007       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.mod << 11);
   1008       p_insn.opcode |= (p_insn.operand_type[1][0]->reg.opcode << 16);
   1009       p_insn.opcode |= (p_insn.operand_type[0][0]->reg.opcode << 22);
   1010       break;
   1011 
   1012     case OO_5op1:
   1013       p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.ARnum);
   1014       p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.mod << 3);
   1015       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.ARnum << 8);
   1016       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.mod << 11);
   1017       p_insn.opcode |= (p_insn.operand_type[1][0]->reg.opcode << 16);
   1018       p_insn.opcode |= (p_insn.operand_type[0][1]->reg.opcode << 19);
   1019       p_insn.opcode |= (p_insn.operand_type[0][2]->reg.opcode << 22);
   1020       break;
   1021 
   1022     case OO_5op2:
   1023       p_insn.opcode |= (p_insn.operand_type[0][1]->indirect.ARnum);
   1024       p_insn.opcode |= (p_insn.operand_type[0][1]->indirect.mod << 3);
   1025       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.ARnum << 8);
   1026       p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.mod << 11);
   1027       p_insn.opcode |= (p_insn.operand_type[1][0]->reg.opcode << 16);
   1028       p_insn.opcode |= (p_insn.operand_type[0][0]->reg.opcode << 19);
   1029       p_insn.opcode |= (p_insn.operand_type[0][2]->reg.opcode << 22);
   1030       break;
   1031 
   1032     case OO_PField:
   1033       p_insn.opcode |= p_insn.p_field;
   1034       if (p_insn.operand_type[0][2]->reg.opcode == 0x01)
   1035 	p_insn.opcode |= 0x00800000;
   1036       if (p_insn.operand_type[1][2]->reg.opcode == 0x03)
   1037 	p_insn.opcode |= 0x00400000;
   1038 
   1039       switch (p_insn.p_field)
   1040 	{
   1041 	case 0x00000000:
   1042 	  p_insn.opcode |= (p_insn.operand_type[0][1]->indirect.ARnum);
   1043 	  p_insn.opcode |= (p_insn.operand_type[0][1]->indirect.mod << 3);
   1044 	  p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.ARnum << 8);
   1045 	  p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.mod << 11);
   1046 	  p_insn.opcode |= (p_insn.operand_type[1][1]->reg.opcode << 16);
   1047 	  p_insn.opcode |= (p_insn.operand_type[1][0]->reg.opcode << 19);
   1048 	  break;
   1049 	case 0x01000000:
   1050 	  p_insn.opcode |= (p_insn.operand_type[1][0]->indirect.ARnum);
   1051 	  p_insn.opcode |= (p_insn.operand_type[1][0]->indirect.mod << 3);
   1052 	  p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.ARnum << 8);
   1053 	  p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.mod << 11);
   1054 	  p_insn.opcode |= (p_insn.operand_type[1][1]->reg.opcode << 16);
   1055 	  p_insn.opcode |= (p_insn.operand_type[0][1]->reg.opcode << 19);
   1056 	  break;
   1057 	case 0x02000000:
   1058 	  p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.ARnum);
   1059 	  p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.mod << 3);
   1060 	  p_insn.opcode |= (p_insn.operand_type[1][0]->indirect.ARnum << 8);
   1061 	  p_insn.opcode |= (p_insn.operand_type[1][0]->indirect.mod << 11);
   1062 	  p_insn.opcode |= (p_insn.operand_type[0][1]->reg.opcode << 16);
   1063 	  p_insn.opcode |= (p_insn.operand_type[0][0]->reg.opcode << 19);
   1064 	  break;
   1065 	case 0x03000000:
   1066 	  p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.ARnum);
   1067 	  p_insn.opcode |= (p_insn.operand_type[1][1]->indirect.mod << 3);
   1068 	  p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.ARnum << 8);
   1069 	  p_insn.opcode |= (p_insn.operand_type[0][0]->indirect.mod << 11);
   1070 	  p_insn.opcode |= (p_insn.operand_type[1][0]->reg.opcode << 16);
   1071 	  p_insn.opcode |= (p_insn.operand_type[0][1]->reg.opcode << 19);
   1072 	  break;
   1073 	}
   1074       break;
   1075     }
   1076 
   1077   {
   1078     char *p;
   1079 
   1080     p = frag_more (INSN_SIZE);
   1081     md_number_to_chars (p, (valueT) p_insn.opcode, INSN_SIZE);
   1082   }
   1083 
   1084   {
   1085     unsigned int i, j;
   1086 
   1087     for (i = 0; i < 2; i++)
   1088       for (j = 0; j < p_insn.operands[i]; j++)
   1089 	free (p_insn.operand_type[i][j]);
   1090   }
   1091 
   1092   debug ("Final opcode: %08X\n", p_insn.opcode);
   1093   debug ("\n");
   1094 
   1095   return 1;
   1096 }
   1097 
   1098 /* In order to get gas to ignore any | chars at the start of a line,
   1099    this function returns true if a | is found in a line.  */
   1100 
   1101 int
   1102 tic30_unrecognized_line (int c)
   1103 {
   1104   debug ("In tc_unrecognized_line\n");
   1105   return (c == PARALLEL_SEPARATOR);
   1106 }
   1107 
   1108 int
   1109 md_estimate_size_before_relax (fragS *fragP ATTRIBUTE_UNUSED,
   1110 			       segT segment ATTRIBUTE_UNUSED)
   1111 {
   1112   debug ("In md_estimate_size_before_relax()\n");
   1113   return 0;
   1114 }
   1115 
   1116 void
   1117 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
   1118 		 segT sec ATTRIBUTE_UNUSED,
   1119 		 fragS *fragP ATTRIBUTE_UNUSED)
   1120 {
   1121   debug ("In md_convert_frag()\n");
   1122 }
   1123 
   1124 void
   1125 md_apply_fix (fixS *fixP,
   1126 	       valueT *valP,
   1127 	       segT seg ATTRIBUTE_UNUSED)
   1128 {
   1129   valueT value = *valP;
   1130 
   1131   debug ("In md_apply_fix() with value = %ld\n", (long) value);
   1132   debug ("Values in fixP\n");
   1133   debug ("fx_size = %d\n", fixP->fx_size);
   1134   debug ("fx_pcrel = %d\n", fixP->fx_pcrel);
   1135   debug ("fx_where = %ld\n", fixP->fx_where);
   1136   debug ("fx_offset = %d\n", (int) fixP->fx_offset);
   1137   {
   1138     char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
   1139 
   1140     value /= INSN_SIZE;
   1141     if (fixP->fx_size == 1)
   1142       /* Special fix for LDP instruction.  */
   1143       value = (value & 0x00FF0000) >> 16;
   1144 
   1145     debug ("new value = %ld\n", (long) value);
   1146     md_number_to_chars (buf, value, fixP->fx_size);
   1147   }
   1148 
   1149   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
   1150     fixP->fx_done = 1;
   1151 }
   1152 
   1153 int
   1154 md_parse_option (int c ATTRIBUTE_UNUSED,
   1155 		 char *arg ATTRIBUTE_UNUSED)
   1156 {
   1157   debug ("In md_parse_option()\n");
   1158   return 0;
   1159 }
   1160 
   1161 void
   1162 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
   1163 {
   1164   debug ("In md_show_usage()\n");
   1165 }
   1166 
   1167 symbolS *
   1168 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   1169 {
   1170   debug ("In md_undefined_symbol()\n");
   1171   return (symbolS *) 0;
   1172 }
   1173 
   1174 valueT
   1175 md_section_align (segT segment, valueT size)
   1176 {
   1177   debug ("In md_section_align() segment = %p and size = %lu\n",
   1178 	 segment, (unsigned long) size);
   1179   size = (size + 3) / 4;
   1180   size *= 4;
   1181   debug ("New size value = %lu\n", (unsigned long) size);
   1182   return size;
   1183 }
   1184 
   1185 long
   1186 md_pcrel_from (fixS *fixP)
   1187 {
   1188   int offset;
   1189 
   1190   debug ("In md_pcrel_from()\n");
   1191   debug ("fx_where = %ld\n", fixP->fx_where);
   1192   debug ("fx_size = %d\n", fixP->fx_size);
   1193   /* Find the opcode that represents the current instruction in the
   1194      fr_literal storage area, and check bit 21.  Bit 21 contains whether the
   1195      current instruction is a delayed one or not, and then set the offset
   1196      value appropriately.  */
   1197   if (fixP->fx_frag->fr_literal[fixP->fx_where - fixP->fx_size + 1] & 0x20)
   1198     offset = 3;
   1199   else
   1200     offset = 1;
   1201   debug ("offset = %d\n", offset);
   1202   /* PC Relative instructions have a format:
   1203      displacement = Label - (PC + offset)
   1204      This function returns PC + offset where:
   1205      fx_where - fx_size = PC
   1206      INSN_SIZE * offset = offset number of instructions.  */
   1207   return fixP->fx_where - fixP->fx_size + (INSN_SIZE * offset);
   1208 }
   1209 
   1210 char *
   1211 md_atof (int what_statement_type,
   1212 	 char *literalP,
   1213 	 int *sizeP)
   1214 {
   1215   int prec;
   1216   char *token;
   1217   char keepval;
   1218   unsigned long value;
   1219   float float_value;
   1220 
   1221   debug ("In md_atof()\n");
   1222   debug ("precision = %c\n", what_statement_type);
   1223   debug ("literal = %s\n", literalP);
   1224   debug ("line = ");
   1225   token = input_line_pointer;
   1226   while (!is_end_of_line[(unsigned char) *input_line_pointer]
   1227 	 && (*input_line_pointer != ','))
   1228     {
   1229       debug ("%c", *input_line_pointer);
   1230       input_line_pointer++;
   1231     }
   1232 
   1233   keepval = *input_line_pointer;
   1234   *input_line_pointer = '\0';
   1235   debug ("\n");
   1236   float_value = (float) atof (token);
   1237   *input_line_pointer = keepval;
   1238   debug ("float_value = %f\n", float_value);
   1239 
   1240   switch (what_statement_type)
   1241     {
   1242     case 'f':
   1243     case 'F':
   1244     case 's':
   1245     case 'S':
   1246       prec = 2;
   1247       break;
   1248 
   1249     case 'd':
   1250     case 'D':
   1251     case 'r':
   1252     case 'R':
   1253       prec = 4;
   1254       break;
   1255 
   1256     default:
   1257       *sizeP = 0;
   1258       return _("Unrecognized or unsupported floating point constant");
   1259     }
   1260 
   1261   if (float_value == 0.0)
   1262     value = (prec == 2) ? 0x00008000L : 0x80000000L;
   1263   else
   1264     {
   1265       unsigned long exp, sign, mant, tmsfloat;
   1266       union
   1267       {
   1268 	float f;
   1269 	long  l;
   1270       }
   1271       converter;
   1272 
   1273       converter.f = float_value;
   1274       tmsfloat = converter.l;
   1275       sign = tmsfloat & 0x80000000;
   1276       mant = tmsfloat & 0x007FFFFF;
   1277       exp = tmsfloat & 0x7F800000;
   1278       exp <<= 1;
   1279       if (exp == 0xFF000000)
   1280 	{
   1281 	  if (mant == 0)
   1282 	    value = 0x7F7FFFFF;
   1283 	  else if (sign == 0)
   1284 	    value = 0x7F7FFFFF;
   1285 	  else
   1286 	    value = 0x7F800000;
   1287 	}
   1288       else
   1289 	{
   1290 	  exp -= 0x7F000000;
   1291 	  if (sign)
   1292 	    {
   1293 	      mant = mant & 0x007FFFFF;
   1294 	      mant = -mant;
   1295 	      mant = mant & 0x00FFFFFF;
   1296 	      if (mant == 0)
   1297 		{
   1298 		  mant |= 0x00800000;
   1299 		  exp = (long) exp - 0x01000000;
   1300 		}
   1301 	    }
   1302 	  tmsfloat = exp | mant;
   1303 	  value = tmsfloat;
   1304 	}
   1305       if (prec == 2)
   1306 	{
   1307 	  long expon, mantis;
   1308 
   1309 	  if (tmsfloat == 0x80000000)
   1310 	    value = 0x8000;
   1311 	  else
   1312 	    {
   1313 	      value = 0;
   1314 	      expon = (tmsfloat & 0xFF000000);
   1315 	      expon >>= 24;
   1316 	      mantis = tmsfloat & 0x007FFFFF;
   1317 	      if (tmsfloat & 0x00800000)
   1318 		{
   1319 		  mantis |= 0xFF000000;
   1320 		  mantis += 0x00000800;
   1321 		  mantis >>= 12;
   1322 		  mantis |= 0x00000800;
   1323 		  mantis &= 0x0FFF;
   1324 		  if (expon > 7)
   1325 		    value = 0x7800;
   1326 		}
   1327 	      else
   1328 		{
   1329 		  mantis |= 0x00800000;
   1330 		  mantis += 0x00000800;
   1331 		  expon += (mantis >> 24);
   1332 		  mantis >>= 12;
   1333 		  mantis &= 0x07FF;
   1334 		  if (expon > 7)
   1335 		    value = 0x77FF;
   1336 		}
   1337 	      if (expon < -8)
   1338 		value = 0x8000;
   1339 	      if (value == 0)
   1340 		{
   1341 		  mantis = (expon << 12) | mantis;
   1342 		  value = mantis & 0xFFFF;
   1343 		}
   1344 	    }
   1345 	}
   1346     }
   1347   md_number_to_chars (literalP, value, prec);
   1348   *sizeP = prec;
   1349   return NULL;
   1350 }
   1351 
   1352 void
   1353 md_number_to_chars (char *buf, valueT val, int n)
   1354 {
   1355   debug ("In md_number_to_chars()\n");
   1356   number_to_chars_bigendian (buf, val, n);
   1357 }
   1358 
   1359 #define F(SZ,PCREL)		(((SZ) << 1) + (PCREL))
   1360 #define MAP(SZ,PCREL,TYPE)	case F(SZ,PCREL): code = (TYPE); break
   1361 
   1362 arelent *
   1363 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
   1364 {
   1365   arelent *rel;
   1366   bfd_reloc_code_real_type code = 0;
   1367 
   1368   debug ("In tc_gen_reloc()\n");
   1369   debug ("fixP.size = %d\n", fixP->fx_size);
   1370   debug ("fixP.pcrel = %d\n", fixP->fx_pcrel);
   1371   debug ("addsy.name = %s\n", S_GET_NAME (fixP->fx_addsy));
   1372 
   1373   switch (F (fixP->fx_size, fixP->fx_pcrel))
   1374     {
   1375       MAP (1, 0, BFD_RELOC_TIC30_LDP);
   1376       MAP (2, 0, BFD_RELOC_16);
   1377       MAP (3, 0, BFD_RELOC_24);
   1378       MAP (2, 1, BFD_RELOC_16_PCREL);
   1379       MAP (4, 0, BFD_RELOC_32);
   1380     default:
   1381       as_bad (_("Can not do %d byte %srelocation"), fixP->fx_size,
   1382 	      fixP->fx_pcrel ? _("pc-relative ") : "");
   1383     }
   1384 #undef MAP
   1385 #undef F
   1386 
   1387   rel = xmalloc (sizeof (* rel));
   1388   gas_assert (rel != 0);
   1389   rel->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1390   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
   1391   rel->address = fixP->fx_frag->fr_address + fixP->fx_where;
   1392   rel->addend = 0;
   1393   rel->howto = bfd_reloc_type_lookup (stdoutput, code);
   1394   if (!rel->howto)
   1395     {
   1396       const char *name;
   1397 
   1398       name = S_GET_NAME (fixP->fx_addsy);
   1399       if (name == NULL)
   1400 	name = "<unknown>";
   1401       as_fatal ("Cannot generate relocation type for symbol %s, code %s",
   1402 		name, bfd_get_reloc_code_name (code));
   1403     }
   1404   return rel;
   1405 }
   1406 
   1407 void
   1408 md_operand (expressionS *expressionP ATTRIBUTE_UNUSED)
   1409 {
   1410   debug ("In md_operand()\n");
   1411 }
   1412 
   1413 void
   1414 md_assemble (char *line)
   1415 {
   1416   insn_template *op;
   1417   char *current_posn;
   1418   char *token_start;
   1419   char save_char;
   1420   unsigned int count;
   1421 
   1422   debug ("In md_assemble() with argument %s\n", line);
   1423   memset (&insn, '\0', sizeof (insn));
   1424   if (found_parallel_insn)
   1425     {
   1426       debug ("Line is second part of parallel instruction\n\n");
   1427       found_parallel_insn = 0;
   1428       return;
   1429     }
   1430   if ((current_posn =
   1431        tic30_find_parallel_insn (line, input_line_pointer + 1)) == NULL)
   1432     current_posn = line;
   1433   else
   1434     found_parallel_insn = 1;
   1435 
   1436   while (is_space_char (*current_posn))
   1437     current_posn++;
   1438 
   1439   token_start = current_posn;
   1440 
   1441   if (!is_opcode_char (*current_posn))
   1442     {
   1443       as_bad (_("Invalid character %s in opcode"),
   1444 	      output_invalid (*current_posn));
   1445       return;
   1446     }
   1447   /* Check if instruction is a parallel instruction
   1448      by seeing if the first character is a q.  */
   1449   if (*token_start == 'q')
   1450     {
   1451       if (tic30_parallel_insn (token_start))
   1452 	{
   1453 	  if (found_parallel_insn)
   1454 	    free (token_start);
   1455 	  return;
   1456 	}
   1457     }
   1458   while (is_opcode_char (*current_posn))
   1459     current_posn++;
   1460   {
   1461     /* Find instruction.  */
   1462     save_char = *current_posn;
   1463     *current_posn = '\0';
   1464     op = (insn_template *) hash_find (op_hash, token_start);
   1465     if (op)
   1466       {
   1467 	debug ("Found instruction %s\n", op->name);
   1468 	insn.tm = op;
   1469       }
   1470     else
   1471       {
   1472 	debug ("Didn't find insn\n");
   1473 	as_bad (_("Unknown TMS320C30 instruction: %s"), token_start);
   1474 	return;
   1475       }
   1476     *current_posn = save_char;
   1477   }
   1478 
   1479   if (*current_posn != END_OF_INSN)
   1480     {
   1481       /* Find operands.  */
   1482       int paren_not_balanced;
   1483       int expecting_operand = 0;
   1484       int this_operand;
   1485       do
   1486 	{
   1487 	  /* Skip optional white space before operand.  */
   1488 	  while (!is_operand_char (*current_posn)
   1489 		 && *current_posn != END_OF_INSN)
   1490 	    {
   1491 	      if (!is_space_char (*current_posn))
   1492 		{
   1493 		  as_bad (_("Invalid character %s before %s operand"),
   1494 			  output_invalid (*current_posn),
   1495 			  ordinal_names[insn.operands]);
   1496 		  return;
   1497 		}
   1498 	      current_posn++;
   1499 	    }
   1500 	  token_start = current_posn;
   1501 	  paren_not_balanced = 0;
   1502 	  while (paren_not_balanced || *current_posn != ',')
   1503 	    {
   1504 	      if (*current_posn == END_OF_INSN)
   1505 		{
   1506 		  if (paren_not_balanced)
   1507 		    {
   1508 		      as_bad (_("Unbalanced parenthesis in %s operand."),
   1509 			      ordinal_names[insn.operands]);
   1510 		      return;
   1511 		    }
   1512 		  else
   1513 		    break;
   1514 		}
   1515 	      else if (!is_operand_char (*current_posn)
   1516 		       && !is_space_char (*current_posn))
   1517 		{
   1518 		  as_bad (_("Invalid character %s in %s operand"),
   1519 			  output_invalid (*current_posn),
   1520 			  ordinal_names[insn.operands]);
   1521 		  return;
   1522 		}
   1523 	      if (*current_posn == '(')
   1524 		++paren_not_balanced;
   1525 	      if (*current_posn == ')')
   1526 		--paren_not_balanced;
   1527 	      current_posn++;
   1528 	    }
   1529 	  if (current_posn != token_start)
   1530 	    {
   1531 	      /* Yes, we've read in another operand.  */
   1532 	      this_operand = insn.operands++;
   1533 	      if (insn.operands > MAX_OPERANDS)
   1534 		{
   1535 		  as_bad (_("Spurious operands; (%d operands/instruction max)"),
   1536 			  MAX_OPERANDS);
   1537 		  return;
   1538 		}
   1539 
   1540 	      /* Now parse operand adding info to 'insn' as we go along.  */
   1541 	      save_char = *current_posn;
   1542 	      *current_posn = '\0';
   1543 	      insn.operand_type[this_operand] = tic30_operand (token_start);
   1544 	      *current_posn = save_char;
   1545 	      if (insn.operand_type[this_operand] == NULL)
   1546 		return;
   1547 	    }
   1548 	  else
   1549 	    {
   1550 	      if (expecting_operand)
   1551 		{
   1552 		  as_bad (_("Expecting operand after ','; got nothing"));
   1553 		  return;
   1554 		}
   1555 	      if (*current_posn == ',')
   1556 		{
   1557 		  as_bad (_("Expecting operand before ','; got nothing"));
   1558 		  return;
   1559 		}
   1560 	    }
   1561 
   1562 	  /* Now *current_posn must be either ',' or END_OF_INSN.  */
   1563 	  if (*current_posn == ',')
   1564 	    {
   1565 	      if (*++current_posn == END_OF_INSN)
   1566 		{
   1567 		  /* Just skip it, if it's \n complain.  */
   1568 		  as_bad (_("Expecting operand after ','; got nothing"));
   1569 		  return;
   1570 		}
   1571 	      expecting_operand = 1;
   1572 	    }
   1573 	}
   1574       while (*current_posn != END_OF_INSN);
   1575     }
   1576 
   1577   debug ("Number of operands found: %d\n", insn.operands);
   1578 
   1579   /* Check that number of operands is correct.  */
   1580   if (insn.operands != insn.tm->operands)
   1581     {
   1582       unsigned int i;
   1583       unsigned int numops = insn.tm->operands;
   1584 
   1585       /* If operands are not the same, then see if any of the operands are
   1586 	 not required.  Then recheck with number of given operands.  If they
   1587 	 are still not the same, then give an error, otherwise carry on.  */
   1588       for (i = 0; i < insn.tm->operands; i++)
   1589 	if (insn.tm->operand_types[i] & NotReq)
   1590 	  numops--;
   1591       if (insn.operands != numops)
   1592 	{
   1593 	  as_bad (_("Incorrect number of operands given"));
   1594 	  return;
   1595 	}
   1596     }
   1597   insn.addressing_mode = AM_NotReq;
   1598   for (count = 0; count < insn.operands; count++)
   1599     {
   1600       if (insn.operand_type[count]->op_type & insn.tm->operand_types[count])
   1601 	{
   1602 	  debug ("Operand %d matches\n", count + 1);
   1603 	  /* If instruction has two operands and has an AddressMode
   1604 	     modifier then set addressing mode type for instruction.  */
   1605 	  if (insn.tm->opcode_modifier == AddressMode)
   1606 	    {
   1607 	      int addr_insn = 0;
   1608 	      /* Store instruction uses the second
   1609 		 operand for the address mode.  */
   1610 	      if ((insn.tm->operand_types[1] & (Indirect | Direct))
   1611 		  == (Indirect | Direct))
   1612 		addr_insn = 1;
   1613 
   1614 	      if (insn.operand_type[addr_insn]->op_type & (AllReg))
   1615 		insn.addressing_mode = AM_Register;
   1616 	      else if (insn.operand_type[addr_insn]->op_type & Direct)
   1617 		insn.addressing_mode = AM_Direct;
   1618 	      else if (insn.operand_type[addr_insn]->op_type & Indirect)
   1619 		insn.addressing_mode = AM_Indirect;
   1620 	      else
   1621 		insn.addressing_mode = AM_Immediate;
   1622 	    }
   1623 	}
   1624       else
   1625 	{
   1626 	  as_bad (_("The %s operand doesn't match"), ordinal_names[count]);
   1627 	  return;
   1628 	}
   1629     }
   1630 
   1631   /* Now set the addressing mode for 3 operand instructions.  */
   1632   if ((insn.tm->operand_types[0] & op3T1)
   1633       && (insn.tm->operand_types[1] & op3T2))
   1634     {
   1635       /* Set the addressing mode to the values used for 2 operand
   1636 	 instructions in the  G addressing field of the opcode.  */
   1637       char *p;
   1638       switch (insn.operand_type[0]->op_type)
   1639 	{
   1640 	case Rn:
   1641 	case ARn:
   1642 	case DPReg:
   1643 	case OtherReg:
   1644 	  if (insn.operand_type[1]->op_type & (AllReg))
   1645 	    insn.addressing_mode = AM_Register;
   1646 	  else if (insn.operand_type[1]->op_type & Indirect)
   1647 	    insn.addressing_mode = AM_Direct;
   1648 	  else
   1649 	    {
   1650 	      /* Shouldn't make it to this stage.  */
   1651 	      as_bad (_("Incompatible first and second operands in instruction"));
   1652 	      return;
   1653 	    }
   1654 	  break;
   1655 	case Indirect:
   1656 	  if (insn.operand_type[1]->op_type & (AllReg))
   1657 	    insn.addressing_mode = AM_Indirect;
   1658 	  else if (insn.operand_type[1]->op_type & Indirect)
   1659 	    insn.addressing_mode = AM_Immediate;
   1660 	  else
   1661 	    {
   1662 	      /* Shouldn't make it to this stage.  */
   1663 	      as_bad (_("Incompatible first and second operands in instruction"));
   1664 	      return;
   1665 	    }
   1666 	  break;
   1667 	}
   1668       /* Now make up the opcode for the 3 operand instructions.  As in
   1669 	 parallel instructions, there will be no unresolved values, so they
   1670 	 can be fully formed and added to the frag table.  */
   1671       insn.opcode = insn.tm->base_opcode;
   1672       if (insn.operand_type[0]->op_type & Indirect)
   1673 	{
   1674 	  insn.opcode |= (insn.operand_type[0]->indirect.ARnum);
   1675 	  insn.opcode |= (insn.operand_type[0]->indirect.mod << 3);
   1676 	}
   1677       else
   1678 	insn.opcode |= (insn.operand_type[0]->reg.opcode);
   1679 
   1680       if (insn.operand_type[1]->op_type & Indirect)
   1681 	{
   1682 	  insn.opcode |= (insn.operand_type[1]->indirect.ARnum << 8);
   1683 	  insn.opcode |= (insn.operand_type[1]->indirect.mod << 11);
   1684 	}
   1685       else
   1686 	insn.opcode |= (insn.operand_type[1]->reg.opcode << 8);
   1687 
   1688       if (insn.operands == 3)
   1689 	insn.opcode |= (insn.operand_type[2]->reg.opcode << 16);
   1690 
   1691       insn.opcode |= insn.addressing_mode;
   1692       p = frag_more (INSN_SIZE);
   1693       md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1694     }
   1695   else
   1696     {
   1697       /* Not a three operand instruction.  */
   1698       char *p;
   1699       int am_insn = -1;
   1700       insn.opcode = insn.tm->base_opcode;
   1701       /* Create frag for instruction - all instructions are 4 bytes long.  */
   1702       p = frag_more (INSN_SIZE);
   1703       if ((insn.operands > 0) && (insn.tm->opcode_modifier == AddressMode))
   1704 	{
   1705 	  insn.opcode |= insn.addressing_mode;
   1706 	  if (insn.addressing_mode == AM_Indirect)
   1707 	    {
   1708 	      /* Determine which operand gives the addressing mode.  */
   1709 	      if (insn.operand_type[0]->op_type & Indirect)
   1710 		am_insn = 0;
   1711 	      if ((insn.operands > 1)
   1712 		  && (insn.operand_type[1]->op_type & Indirect))
   1713 		am_insn = 1;
   1714 	      insn.opcode |= (insn.operand_type[am_insn]->indirect.disp);
   1715 	      insn.opcode |= (insn.operand_type[am_insn]->indirect.ARnum << 8);
   1716 	      insn.opcode |= (insn.operand_type[am_insn]->indirect.mod << 11);
   1717 	      if (insn.operands > 1)
   1718 		insn.opcode |= (insn.operand_type[!am_insn]->reg.opcode << 16);
   1719 	      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1720 	    }
   1721 	  else if (insn.addressing_mode == AM_Register)
   1722 	    {
   1723 	      insn.opcode |= (insn.operand_type[0]->reg.opcode);
   1724 	      if (insn.operands > 1)
   1725 		insn.opcode |= (insn.operand_type[1]->reg.opcode << 16);
   1726 	      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1727 	    }
   1728 	  else if (insn.addressing_mode == AM_Direct)
   1729 	    {
   1730 	      if (insn.operand_type[0]->op_type & Direct)
   1731 		am_insn = 0;
   1732 	      if ((insn.operands > 1)
   1733 		  && (insn.operand_type[1]->op_type & Direct))
   1734 		am_insn = 1;
   1735 	      if (insn.operands > 1)
   1736 		insn.opcode |=
   1737 		  (insn.operand_type[! am_insn]->reg.opcode << 16);
   1738 	      if (insn.operand_type[am_insn]->direct.resolved == 1)
   1739 		{
   1740 		  /* Resolved values can be placed straight
   1741 		     into instruction word, and output.  */
   1742 		  insn.opcode |=
   1743 		    (insn.operand_type[am_insn]->direct.address & 0x0000FFFF);
   1744 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1745 		}
   1746 	      else
   1747 		{
   1748 		  /* Unresolved direct addressing mode instruction.  */
   1749 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1750 		  fix_new_exp (frag_now, p + 2 - (frag_now->fr_literal), 2,
   1751 			       & insn.operand_type[am_insn]->direct.direct_expr,
   1752 			       0, 0);
   1753 		}
   1754 	    }
   1755 	  else if (insn.addressing_mode == AM_Immediate)
   1756 	    {
   1757 	      if (insn.operand_type[0]->immediate.resolved == 1)
   1758 		{
   1759 		  char *keeploc;
   1760 		  int size;
   1761 
   1762 		  if (insn.operands > 1)
   1763 		    insn.opcode |= (insn.operand_type[1]->reg.opcode << 16);
   1764 
   1765 		  switch (insn.tm->imm_arg_type)
   1766 		    {
   1767 		    case Imm_Float:
   1768 		      debug ("Floating point first operand\n");
   1769 		      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1770 
   1771 		      keeploc = input_line_pointer;
   1772 		      input_line_pointer =
   1773 			insn.operand_type[0]->immediate.label;
   1774 
   1775 		      if (md_atof ('f', p + 2, & size) != 0)
   1776 			{
   1777 			  as_bad (_("invalid short form floating point immediate operand"));
   1778 			  return;
   1779 			}
   1780 
   1781 		      input_line_pointer = keeploc;
   1782 		      break;
   1783 
   1784 		    case Imm_UInt:
   1785 		      debug ("Unsigned int first operand\n");
   1786 		      if (insn.operand_type[0]->immediate.decimal_found)
   1787 			as_warn (_("rounding down first operand float to unsigned int"));
   1788 		      if (insn.operand_type[0]->immediate.u_number > 0xFFFF)
   1789 			as_warn (_("only lower 16-bits of first operand are used"));
   1790 		      insn.opcode |=
   1791 			(insn.operand_type[0]->immediate.u_number & 0x0000FFFFL);
   1792 		      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1793 		      break;
   1794 
   1795 		    case Imm_SInt:
   1796 		      debug ("Int first operand\n");
   1797 
   1798 		      if (insn.operand_type[0]->immediate.decimal_found)
   1799 			as_warn (_("rounding down first operand float to signed int"));
   1800 
   1801 		      if (insn.operand_type[0]->immediate.s_number < -32768 ||
   1802 			  insn.operand_type[0]->immediate.s_number > 32767)
   1803 			{
   1804 			  as_bad (_("first operand is too large for 16-bit signed int"));
   1805 			  return;
   1806 			}
   1807 		      insn.opcode |=
   1808 			(insn.operand_type[0]->immediate.s_number & 0x0000FFFFL);
   1809 		      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1810 		      break;
   1811 		    }
   1812 		}
   1813 	      else
   1814 		{
   1815 		  /* Unresolved immediate label.  */
   1816 		  if (insn.operands > 1)
   1817 		    insn.opcode |= (insn.operand_type[1]->reg.opcode << 16);
   1818 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1819 		  fix_new_exp (frag_now, p + 2 - (frag_now->fr_literal), 2,
   1820 			       & insn.operand_type[0]->immediate.imm_expr,
   1821 			       0, 0);
   1822 		}
   1823 	    }
   1824 	}
   1825       else if (insn.tm->opcode_modifier == PCRel)
   1826 	{
   1827 	  /* Conditional Branch and Call instructions.  */
   1828 	  if ((insn.tm->operand_types[0] & (AllReg | Disp))
   1829 	      == (AllReg | Disp))
   1830 	    {
   1831 	      if (insn.operand_type[0]->op_type & (AllReg))
   1832 		{
   1833 		  insn.opcode |= (insn.operand_type[0]->reg.opcode);
   1834 		  insn.opcode |= PC_Register;
   1835 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1836 		}
   1837 	      else
   1838 		{
   1839 		  insn.opcode |= PC_Relative;
   1840 		  if (insn.operand_type[0]->immediate.resolved == 1)
   1841 		    {
   1842 		      insn.opcode |=
   1843 			(insn.operand_type[0]->immediate.s_number & 0x0000FFFF);
   1844 		      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1845 		    }
   1846 		  else
   1847 		    {
   1848 		      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1849 		      fix_new_exp (frag_now, p + 2 - (frag_now->fr_literal),
   1850 				   2, & insn.operand_type[0]->immediate.imm_expr,
   1851 				   1, 0);
   1852 		    }
   1853 		}
   1854 	    }
   1855 	  else if ((insn.tm->operand_types[0] & ARn) == ARn)
   1856 	    {
   1857 	      /* Decrement and Branch instructions.  */
   1858 	      insn.opcode |= ((insn.operand_type[0]->reg.opcode - 0x08) << 22);
   1859 	      if (insn.operand_type[1]->op_type & (AllReg))
   1860 		{
   1861 		  insn.opcode |= (insn.operand_type[1]->reg.opcode);
   1862 		  insn.opcode |= PC_Register;
   1863 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1864 		}
   1865 	      else if (insn.operand_type[1]->immediate.resolved == 1)
   1866 		{
   1867 		  if (insn.operand_type[0]->immediate.decimal_found)
   1868 		    {
   1869 		      as_bad (_("first operand is floating point"));
   1870 		      return;
   1871 		    }
   1872 		  if (insn.operand_type[0]->immediate.s_number < -32768 ||
   1873 		      insn.operand_type[0]->immediate.s_number > 32767)
   1874 		    {
   1875 		      as_bad (_("first operand is too large for 16-bit signed int"));
   1876 		      return;
   1877 		    }
   1878 		  insn.opcode |= (insn.operand_type[1]->immediate.s_number);
   1879 		  insn.opcode |= PC_Relative;
   1880 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1881 		}
   1882 	      else
   1883 		{
   1884 		  insn.opcode |= PC_Relative;
   1885 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1886 		  fix_new_exp (frag_now, p + 2 - frag_now->fr_literal, 2,
   1887 			       & insn.operand_type[1]->immediate.imm_expr,
   1888 			       1, 0);
   1889 		}
   1890 	    }
   1891 	}
   1892       else if (insn.tm->operand_types[0] == IVector)
   1893 	{
   1894 	  /* Trap instructions.  */
   1895 	  if (insn.operand_type[0]->op_type & IVector)
   1896 	    insn.opcode |= (insn.operand_type[0]->immediate.u_number);
   1897 	  else
   1898 	    {
   1899 	      /* Shouldn't get here.  */
   1900 	      as_bad (_("interrupt vector for trap instruction out of range"));
   1901 	      return;
   1902 	    }
   1903 	  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1904 	}
   1905       else if (insn.tm->opcode_modifier == StackOp
   1906 	       || insn.tm->opcode_modifier == Rotate)
   1907 	{
   1908 	  /* Push, Pop and Rotate instructions.  */
   1909 	  insn.opcode |= (insn.operand_type[0]->reg.opcode << 16);
   1910 	  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1911 	}
   1912       else if ((insn.tm->operand_types[0] & (Abs24 | Direct))
   1913 	       == (Abs24 | Direct))
   1914 	{
   1915 	  /* LDP Instruction needs to be tested
   1916 	     for before the next section.  */
   1917 	  if (insn.operand_type[0]->op_type & Direct)
   1918 	    {
   1919 	      if (insn.operand_type[0]->direct.resolved == 1)
   1920 		{
   1921 		  /* Direct addressing uses lower 8 bits of direct address.  */
   1922 		  insn.opcode |=
   1923 		    (insn.operand_type[0]->direct.address & 0x00FF0000) >> 16;
   1924 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1925 		}
   1926 	      else
   1927 		{
   1928 		  fixS *fix;
   1929 
   1930 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1931 		  fix = fix_new_exp (frag_now, p + 3 - (frag_now->fr_literal),
   1932 				     1, &insn.operand_type[0]->direct.direct_expr, 0, 0);
   1933 		  /* Ensure that the assembler doesn't complain
   1934 		     about fitting a 24-bit address into 8 bits.  */
   1935 		  fix->fx_no_overflow = 1;
   1936 		}
   1937 	    }
   1938 	  else
   1939 	    {
   1940 	      if (insn.operand_type[0]->immediate.resolved == 1)
   1941 		{
   1942 		  /* Immediate addressing uses upper 8 bits of address.  */
   1943 		  if (insn.operand_type[0]->immediate.u_number > 0x00FFFFFF)
   1944 		    {
   1945 		      as_bad (_("LDP instruction needs a 24-bit operand"));
   1946 		      return;
   1947 		    }
   1948 		  insn.opcode |=
   1949 		    ((insn.operand_type[0]->immediate.u_number & 0x00FF0000) >> 16);
   1950 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1951 		}
   1952 	      else
   1953 		{
   1954 		  fixS *fix;
   1955 		  md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1956 		  fix = fix_new_exp (frag_now, p + 3 - (frag_now->fr_literal),
   1957 				     1, &insn.operand_type[0]->immediate.imm_expr,
   1958 				     0, 0);
   1959 		  fix->fx_no_overflow = 1;
   1960 		}
   1961 	    }
   1962 	}
   1963       else if (insn.tm->operand_types[0] & (Imm24))
   1964 	{
   1965 	  /* Unconditional Branch and Call instructions.  */
   1966 	  if (insn.operand_type[0]->immediate.resolved == 1)
   1967 	    {
   1968 	      if (insn.operand_type[0]->immediate.u_number > 0x00FFFFFF)
   1969 		as_warn (_("first operand is too large for a 24-bit displacement"));
   1970 	      insn.opcode |=
   1971 		(insn.operand_type[0]->immediate.u_number & 0x00FFFFFF);
   1972 	      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1973 	    }
   1974 	  else
   1975 	    {
   1976 	      md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1977 	      fix_new_exp (frag_now, p + 1 - (frag_now->fr_literal), 3,
   1978 			   & insn.operand_type[0]->immediate.imm_expr, 0, 0);
   1979 	    }
   1980 	}
   1981       else if (insn.tm->operand_types[0] & NotReq)
   1982 	/* Check for NOP instruction without arguments.  */
   1983 	md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1984 
   1985       else if (insn.tm->operands == 0)
   1986 	/* Check for instructions without operands.  */
   1987 	md_number_to_chars (p, (valueT) insn.opcode, INSN_SIZE);
   1988     }
   1989   debug ("Addressing mode: %08X\n", insn.addressing_mode);
   1990   {
   1991     unsigned int i;
   1992 
   1993     for (i = 0; i < insn.operands; i++)
   1994       {
   1995 	if (insn.operand_type[i]->immediate.label)
   1996 	  free (insn.operand_type[i]->immediate.label);
   1997 	free (insn.operand_type[i]);
   1998       }
   1999   }
   2000   debug ("Final opcode: %08X\n", insn.opcode);
   2001   debug ("\n");
   2002 }
   2003