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