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