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