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