2000-02-22 H.J. Lu <hjl@gnu.org>
[binutils.git] / gas / config / tc-tic80.c
blobf31dba32f93138a8a0c5478116c7c76aac541425
1 /* tc-tic80.c -- Assemble for the TI TMS320C80 (MV)
2 Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
21 #include "as.h"
22 #include "opcode/tic80.h"
24 #define internal_error(what) \
25 as_fatal(_("internal error:%s:%d: %s\n"),__FILE__,__LINE__,what)
26 #define internal_error_a(what,arg) \
27 as_fatal(_("internal error:%s:%d: %s %d\n"),__FILE__,__LINE__,what,arg)
30 /* Generic assembler global variables which must be defined by all targets. */
32 /* Characters which always start a comment. */
33 const char comment_chars[] = ";";
35 /* Characters which start a comment at the beginning of a line. */
36 const char line_comment_chars[] = ";*#";
38 /* Characters which may be used to separate multiple commands on a single
39 line. The semicolon is such a character by default and should not be
40 explicitly listed. */
41 const char line_separator_chars[] = "";
43 /* Characters which are used to indicate an exponent in a floating
44 point number. */
45 const char EXP_CHARS[] = "eE";
47 /* Characters which mean that a number is a floating point constant,
48 as in 0f1.0. */
49 const char FLT_CHARS[] = "fF";
51 /* This table describes all the machine specific pseudo-ops the assembler
52 has to support. The fields are:
54 pseudo-op name without dot
55 function to call to execute this pseudo-op
56 integer arg to pass to the function */
58 extern void obj_coff_section ();
60 const pseudo_typeS md_pseudo_table[] =
62 { "align", s_align_bytes, 4 }, /* Do byte alignment, default is a 4 byte boundary */
63 { "word", cons, 4 }, /* FIXME: Should this be machine independent? */
64 { "bss", s_lcomm_bytes, 1 },
65 { "sect", obj_coff_section, 0}, /* For compatibility with TI tools */
66 { "section", obj_coff_section, 0}, /* Standard COFF .section pseudo-op */
67 { NULL, NULL, 0 }
70 /* Opcode hash table. */
71 static struct hash_control *tic80_hash;
73 static struct tic80_opcode * find_opcode PARAMS ((struct tic80_opcode *, expressionS []));
74 static void build_insn PARAMS ((struct tic80_opcode *, expressionS *));
75 static int get_operands PARAMS ((expressionS exp[]));
76 static int const_overflow PARAMS ((unsigned long num, int bits, int flags));
78 /* Replace short PC relative instructions with long form when necessary. Currently
79 this is off by default or when given the -no-relax option. Turning it on by using
80 the -relax option forces all PC relative instructions to use the long form, which
81 is why it is currently not the default. */
82 static int tic80_relax = 0;
85 int
86 md_estimate_size_before_relax (fragP, segment_type)
87 fragS *fragP;
88 segT segment_type;
90 internal_error (_("Relaxation is a luxury we can't afford"));
91 return (-1);
94 /* We have no need to default values of symbols. */
96 /* ARGSUSED */
97 symbolS *
98 md_undefined_symbol (name)
99 char *name;
101 return 0;
104 /* Turn a string in input_line_pointer into a floating point constant of type
105 type, and store the appropriate bytes in *litP. The number of LITTLENUMS
106 emitted is stored in *sizeP . An error message is returned, or NULL on OK.
109 #define MAX_LITTLENUMS 4
111 char *
112 md_atof (type, litP, sizeP)
113 int type;
114 char *litP;
115 int *sizeP;
117 int prec;
118 LITTLENUM_TYPE words[MAX_LITTLENUMS];
119 LITTLENUM_TYPE *wordP;
120 char *t;
121 char *atof_ieee ();
123 switch (type)
125 case 'f':
126 case 'F':
127 case 's':
128 case 'S':
129 prec = 2;
130 break;
132 case 'd':
133 case 'D':
134 case 'r':
135 case 'R':
136 prec = 4;
137 break;
139 default:
140 *sizeP = 0;
141 return _("bad call to md_atof ()");
144 t = atof_ieee (input_line_pointer, type, words);
145 if (t)
147 input_line_pointer = t;
150 *sizeP = prec * sizeof (LITTLENUM_TYPE);
152 for (wordP = words; prec--;)
154 md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
155 litP += sizeof (LITTLENUM_TYPE);
157 return (NULL);
160 /* Check to see if the constant value in NUM will fit in a field of
161 width BITS if it has flags FLAGS. */
163 static int
164 const_overflow (num, bits, flags)
165 unsigned long num;
166 int bits;
167 int flags;
169 long min, max;
170 int retval = 0;
172 /* Only need to check fields less than 32 bits wide */
173 if (bits < 32)
174 if (flags & TIC80_OPERAND_SIGNED)
176 max = (1 << (bits - 1)) - 1;
177 min = - (1 << (bits - 1));
178 retval = ((long) num > max) || ((long) num < min);
180 else
182 max = (1 << bits) - 1;
183 min = 0;
184 retval = (num > max) || (num < min);
186 return (retval);
189 /* get_operands() parses a string of operands and fills in a passed array of
190 expressions in EXP.
192 Note that we use O_absent expressions to record additional information
193 about the previous non-O_absent expression, such as ":m" or ":s"
194 modifiers or register numbers enclosed in parens like "(r10)".
196 Returns the number of expressions that were placed in EXP.
200 static int
201 get_operands (exp)
202 expressionS exp[];
204 char *p = input_line_pointer;
205 int numexp = 0;
206 int mflag = 0;
207 int sflag = 0;
208 int parens = 0;
210 while (*p)
212 /* Skip leading whitespace */
213 while (*p == ' ' || *p == '\t' || *p == ',')
215 p++;
218 /* Check to see if we have any operands left to parse */
219 if (*p == 0 || *p == '\n' || *p == '\r')
221 break;
224 /* Notice scaling or direct memory operand modifiers and save them in
225 an O_absent expression after the expression that they modify. */
227 if (*p == ':')
229 p++;
230 exp[numexp].X_op = O_absent;
231 if (*p == 'm')
233 p++;
234 /* This is a ":m" modifier */
235 exp[numexp].X_add_number = TIC80_OPERAND_M_SI | TIC80_OPERAND_M_LI;
237 else if (*p == 's')
239 p++;
240 /* This is a ":s" modifier */
241 exp[numexp].X_add_number = TIC80_OPERAND_SCALED;
243 else
245 as_bad (_("':' not followed by 'm' or 's'"));
247 numexp++;
248 continue;
251 /* Handle leading '(' on operands that use them, by recording that we
252 have entered a paren nesting level and then continuing. We complain
253 about multiple nesting. */
255 if (*p == '(')
257 if (++parens != 1)
259 as_bad (_("paren nesting"));
261 p++;
262 continue;
265 /* Handle trailing ')' on operands that use them, by reducing the
266 nesting level and then continuing. We complain if there were too
267 many closures. */
269 if (*p == ')')
271 /* Record that we have left a paren group and continue */
272 if (--parens < 0)
274 as_bad (_("mismatched parenthesis"));
276 p++;
277 continue;
280 /* Begin operand parsing at the current scan point. */
282 input_line_pointer = p;
283 expression (&exp[numexp]);
285 if (exp[numexp].X_op == O_illegal)
287 as_bad (_("illegal operand"));
289 else if (exp[numexp].X_op == O_absent)
291 as_bad (_("missing operand"));
294 numexp++;
295 p = input_line_pointer;
298 if (parens)
300 exp[numexp].X_op = O_absent;
301 exp[numexp++].X_add_number = TIC80_OPERAND_PARENS;
304 /* Mark the end of the valid operands with an illegal expression. */
305 exp[numexp].X_op = O_illegal;
307 return (numexp);
310 /* find_opcode() gets a pointer to the entry in the opcode table that
311 matches the instruction being assembled, or returns NULL if no such match
312 is found.
314 First it parses all the operands and save them as expressions. Note that
315 we use O_absent expressions to record additional information about the
316 previous non-O_absent expression, such as ":m" or ":s" modifiers or
317 register numbers enclosed in parens like "(r10)".
319 It then looks at all opcodes with the same name and uses the operands to
320 choose the correct opcode. */
322 static struct tic80_opcode *
323 find_opcode (opcode, myops)
324 struct tic80_opcode *opcode;
325 expressionS myops[];
327 int numexp; /* Number of expressions from parsing operands */
328 int expi; /* Index of current expression to match */
329 int opi; /* Index of current operand to match */
330 int match = 0; /* Set to 1 when an operand match is found */
331 struct tic80_opcode *opc = opcode; /* Pointer to current opcode table entry */
332 const struct tic80_opcode *end; /* Pointer to end of opcode table */
334 /* First parse all the operands so we only have to do it once. There may
335 be more expressions generated than there are operands. */
337 numexp = get_operands (myops);
339 /* For each opcode with the same name, try to match it against the parsed
340 operands. */
342 end = tic80_opcodes + tic80_num_opcodes;
343 while (!match && (opc < end) && (strcmp (opc -> name, opcode -> name) == 0))
345 /* Start off assuming a match. If we find a mismatch, then this is
346 reset and the operand/expr matching loop terminates with match
347 equal to zero, which allows us to try the next opcode. */
349 match = 1;
351 /* For each expression, try to match it against the current operand
352 for the current opcode. Upon any mismatch, we abandon further
353 matching for the current opcode table entry. */
355 for (expi = 0, opi = -1; (expi < numexp) && match; expi++)
357 int bits, flags, X_op, num;
359 X_op = myops[expi].X_op;
360 num = myops[expi].X_add_number;
362 /* The O_absent expressions apply to the same operand as the most
363 recent non O_absent expression. So only increment the operand
364 index when the current expression is not one of these special
365 expressions. */
367 if (X_op != O_absent)
369 opi++;
372 flags = tic80_operands[opc -> operands[opi]].flags;
373 bits = tic80_operands[opc -> operands[opi]].bits;
375 switch (X_op)
377 case O_register:
378 /* Also check that registers that are supposed to be even actually
379 are even. */
380 if (((flags & TIC80_OPERAND_GPR) != (num & TIC80_OPERAND_GPR)) ||
381 ((flags & TIC80_OPERAND_FPA) != (num & TIC80_OPERAND_FPA)) ||
382 ((flags & TIC80_OPERAND_CR) != (num & TIC80_OPERAND_CR)) ||
383 ((flags & TIC80_OPERAND_EVEN) && (num & 1)) ||
384 const_overflow (num & ~TIC80_OPERAND_MASK, bits, flags))
386 match = 0;
388 break;
389 case O_constant:
390 if ((flags & TIC80_OPERAND_ENDMASK) && (num == 32))
392 /* Endmask values of 0 and 32 give identical results */
393 num = 0;
395 if ((flags & (TIC80_OPERAND_FPA | TIC80_OPERAND_GPR)) ||
396 const_overflow (num, bits, flags))
398 match = 0;
400 break;
401 case O_symbol:
402 if ((bits < 32) && (flags & TIC80_OPERAND_PCREL) && !tic80_relax)
404 /* The default is to prefer the short form of PC relative relocations.
405 This is the only form that the TI assembler supports.
406 If the -relax option is given, we never use the short forms.
407 FIXME: Should be able to choose "best-fit". */
409 else if ((bits == 32) /* && (flags & TIC80_OPERAND_BASEREL) */)
411 /* The default is to prefer the long form of base relative relocations.
412 This is the only form that the TI assembler supports.
413 If the -no-relax option is given, we always use the long form of
414 PC relative relocations.
415 FIXME: Should be able to choose "best-fit". */
417 else
419 /* Symbols that don't match one of the above cases are
420 rejected as an operand. */
421 match = 0;
423 break;
424 case O_absent:
425 /* If this is an O_absent expression, then it may be an expression that
426 supplies additional information about the operand, such as ":m" or
427 ":s" modifiers. Check to see that the operand matches this requirement. */
428 if (!((num & TIC80_OPERAND_M_SI) && (flags & TIC80_OPERAND_M_SI) ||
429 (num & TIC80_OPERAND_M_LI) && (flags & TIC80_OPERAND_M_LI) ||
430 (num & TIC80_OPERAND_SCALED) && (flags & TIC80_OPERAND_SCALED)))
432 match = 0;
434 break;
435 case O_big:
436 if ((num > 0) || !(flags & TIC80_OPERAND_FLOAT))
438 match = 0;
440 break;
441 case O_illegal:
442 case O_symbol_rva:
443 case O_uminus:
444 case O_bit_not:
445 case O_logical_not:
446 case O_multiply:
447 case O_divide:
448 case O_modulus:
449 case O_left_shift:
450 case O_right_shift:
451 case O_bit_inclusive_or:
452 case O_bit_or_not:
453 case O_bit_exclusive_or:
454 case O_bit_and:
455 case O_add:
456 case O_subtract:
457 case O_eq:
458 case O_ne:
459 case O_lt:
460 case O_le:
461 case O_ge:
462 case O_gt:
463 case O_logical_and:
464 case O_logical_or:
465 case O_max:
466 default:
467 internal_error_a (_("unhandled expression type"), X_op);
470 if (!match)
472 opc++;
476 return (match ? opc : NULL);
478 #if 0
480 /* Now search the opcode table table for one with operands that
481 matches what we've got. */
483 while (!match)
485 match = 1;
486 for (i = 0; opcode -> operands[i]; i++)
488 int flags = tic80_operands[opcode->operands[i]].flags;
489 int X_op = myops[i].X_op;
490 int num = myops[i].X_add_number;
492 if (X_op == 0)
494 match = 0;
495 break;
498 if (flags & (TIC80_OPERAND_GPR | TIC80_OPERAND_FPA | TIC80_OPERAND_CR))
500 if ((X_op != O_register) ||
501 ((flags & TIC80_OPERAND_GPR) != (num & TIC80_OPERAND_GPR)) ||
502 ((flags & TIC80_OPERAND_FPA) != (num & TIC80_OPERAND_FPA)) ||
503 ((flags & TIC80_OPERAND_CR) != (num & TIC80_OPERAND_CR)))
505 match=0;
506 break;
510 if (((flags & TIC80_OPERAND_MINUS) && ((X_op != O_absent) || (num != TIC80_OPERAND_MINUS))) ||
511 ((flags & TIC80_OPERAND_PLUS) && ((X_op != O_absent) || (num != TIC80_OPERAND_PLUS))) ||
512 ((flags & TIC80_OPERAND_ATMINUS) && ((X_op != O_absent) || (num != TIC80_OPERAND_ATMINUS))) ||
513 ((flags & TIC80_OPERAND_ATPAR) && ((X_op != O_absent) || (num != TIC80_OPERAND_ATPAR))) ||
514 ((flags & TIC80_OPERAND_ATSIGN) && ((X_op != O_absent) || (num != TIC80_OPERAND_ATSIGN))))
516 match=0;
517 break;
520 /* we're only done if the operands matched so far AND there
521 are no more to check */
522 if (match && myops[i].X_op==0)
523 break;
524 else
525 match = 0;
527 next_opcode = opcode+1;
528 if (next_opcode->opcode == 0)
529 break;
530 if (strcmp(next_opcode->name, opcode->name))
531 break;
532 opcode = next_opcode;
535 if (!match)
537 as_bad (_("bad opcode or operands"));
538 return (0);
541 /* Check that all registers that are required to be even are. */
542 /* Also, if any operands were marked as registers, but were really symbols */
543 /* fix that here. */
544 for (i=0; opcode->operands[i]; i++)
546 if ((tic80_operands[opcode->operands[i]].flags & TIC80_OPERAND_EVEN) &&
547 (myops[i].X_add_number & 1))
548 as_fatal (_("Register number must be EVEN"));
549 if (myops[i].X_op == O_register)
551 if (!(tic80_operands[opcode->operands[i]].flags & TIC80_OPERAND_REG))
553 myops[i].X_op = O_symbol;
554 myops[i].X_add_symbol = symbol_find_or_make ((char *)myops[i].X_op_symbol);
555 myops[i].X_add_number = 0;
556 myops[i].X_op_symbol = NULL;
561 #endif
564 /* build_insn takes a pointer to the opcode entry in the opcode table
565 and the array of operand expressions and writes out the instruction.
567 Note that the opcode word and extended word may be written to different
568 frags, with the opcode at the end of one frag and the extension at the
569 beginning of the next. */
571 static void
572 build_insn (opcode, opers)
573 struct tic80_opcode *opcode;
574 expressionS *opers;
576 int expi; /* Index of current expression to match */
577 int opi; /* Index of current operand to match */
578 unsigned long insn[2]; /* Instruction and long immediate (if any) */
579 char *f; /* Pointer to frag location for insn[0] */
580 fragS *ffrag; /* Frag containing location f */
581 char *fx = NULL; /* Pointer to frag location for insn[1] */
582 fragS *fxfrag; /* Frag containing location fx */
584 /* Start with the raw opcode bits from the opcode table. */
585 insn[0] = opcode -> opcode;
587 /* We are going to insert at least one 32 bit opcode so get the
588 frag now. */
590 f = frag_more (4);
591 ffrag = frag_now;
593 /* For each operand expression, insert the appropriate bits into the
594 instruction . */
595 for (expi = 0, opi = -1; opers[expi].X_op != O_illegal; expi++)
597 int bits, shift, flags, X_op, num;
599 X_op = opers[expi].X_op;
600 num = opers[expi].X_add_number;
602 /* The O_absent expressions apply to the same operand as the most
603 recent non O_absent expression. So only increment the operand
604 index when the current expression is not one of these special
605 expressions. */
607 if (X_op != O_absent)
609 opi++;
612 flags = tic80_operands[opcode -> operands[opi]].flags;
613 bits = tic80_operands[opcode -> operands[opi]].bits;
614 shift = tic80_operands[opcode -> operands[opi]].shift;
616 switch (X_op)
618 case O_register:
619 num &= ~TIC80_OPERAND_MASK;
620 insn[0] = insn[0] | (num << shift);
621 break;
622 case O_constant:
623 if ((flags & TIC80_OPERAND_ENDMASK) && (num == 32))
625 /* Endmask values of 0 and 32 give identical results */
626 num = 0;
628 else if ((flags & TIC80_OPERAND_BITNUM))
630 /* BITNUM values are stored in one's complement form */
631 num = (~num & 0x1F);
633 /* Mask off upper bits, just it case it is signed and is negative */
634 if (bits < 32)
636 num &= (1 << bits) - 1;
637 insn[0] = insn[0] | (num << shift);
639 else
641 fx = frag_more (4);
642 fxfrag = frag_now;
643 insn[1] = num;
645 break;
646 case O_symbol:
647 if (bits == 32)
649 fx = frag_more (4);
650 fxfrag = frag_now;
651 insn[1] = 0;
652 if (flags & TIC80_OPERAND_PCREL)
654 fix_new_exp (fxfrag,
655 fx - (fxfrag -> fr_literal),
657 &opers[expi],
659 R_MPPCR);
661 else
663 fix_new_exp (fxfrag,
664 fx - (fxfrag -> fr_literal),
666 &opers[expi],
668 R_RELLONGX);
671 else if (flags & TIC80_OPERAND_PCREL)
673 fix_new_exp (ffrag,
674 f - (ffrag -> fr_literal),
675 4, /* FIXME! how is this used? */
676 &opers[expi],
678 R_MPPCR15W);
680 else
682 internal_error (_("symbol reloc that is not PC relative or 32 bits"));
684 break;
685 case O_absent:
686 /* Each O_absent expression can indicate exactly one possible modifier. */
687 if ((num & TIC80_OPERAND_M_SI) && (flags & TIC80_OPERAND_M_SI))
689 insn[0] = insn[0] | (1 << 17);
691 else if ((num & TIC80_OPERAND_M_LI) && (flags & TIC80_OPERAND_M_LI))
693 insn[0] = insn[0] | (1 << 15);
695 else if ((num & TIC80_OPERAND_SCALED) && (flags & TIC80_OPERAND_SCALED))
697 insn[0] = insn[0] | (1 << 11);
699 else if ((num & TIC80_OPERAND_PARENS) && (flags & TIC80_OPERAND_PARENS))
701 /* No code to generate, just accept and discard this expression */
703 else
705 internal_error_a (_("unhandled operand modifier"), opers[expi].X_add_number);
707 break;
708 case O_big:
709 fx = frag_more (4);
710 fxfrag = frag_now;
712 int precision = 2;
713 long exponent_bits = 8L;
714 LITTLENUM_TYPE words[2];
715 /* Value is still in generic_floating_point_number */
716 gen_to_words (words, precision, exponent_bits);
717 insn[1] = (words[0] << 16) | words[1];
719 break;
720 case O_illegal:
721 case O_symbol_rva:
722 case O_uminus:
723 case O_bit_not:
724 case O_logical_not:
725 case O_multiply:
726 case O_divide:
727 case O_modulus:
728 case O_left_shift:
729 case O_right_shift:
730 case O_bit_inclusive_or:
731 case O_bit_or_not:
732 case O_bit_exclusive_or:
733 case O_bit_and:
734 case O_add:
735 case O_subtract:
736 case O_eq:
737 case O_ne:
738 case O_lt:
739 case O_le:
740 case O_ge:
741 case O_gt:
742 case O_logical_and:
743 case O_logical_or:
744 case O_max:
745 default:
746 internal_error_a (_("unhandled expression"), X_op);
747 break;
751 /* Write out the instruction, either 4 or 8 bytes. */
753 md_number_to_chars (f, insn[0], 4);
754 if (fx != NULL)
756 md_number_to_chars (fx, insn[1], 4);
760 /* This is the main entry point for the machine-dependent assembler. Gas
761 calls this function for each input line which does not contain a
762 pseudoop.
764 STR points to a NULL terminated machine dependent instruction. This
765 function is supposed to emit the frags/bytes it assembles to. */
767 void
768 md_assemble (str)
769 char *str;
771 char *scan;
772 unsigned char *input_line_save;
773 struct tic80_opcode *opcode;
774 expressionS myops[16];
775 unsigned long insn;
777 /* Ensure there is something there to assemble. */
778 assert (str);
780 /* Drop any leading whitespace. */
781 while (isspace (*str))
783 str++;
786 /* Isolate the mnemonic from the rest of the string by finding the first
787 whitespace character and zapping it to a null byte. */
788 for (scan = str; *scan != '\000' && !isspace (*scan); scan++) {;}
789 if (*scan != '\000')
791 *scan++ = '\000';
794 /* Try to find this mnemonic in the hash table */
795 if ((opcode = (struct tic80_opcode *) hash_find (tic80_hash, str)) == NULL)
797 as_bad (_("Invalid mnemonic: '%s'"), str);
798 return;
801 str = scan;
802 while (isspace (*scan))
804 scan++;
807 input_line_save = input_line_pointer;
808 input_line_pointer = str;
810 opcode = find_opcode (opcode, myops);
811 if (opcode == NULL)
813 as_bad (_("Invalid operands: '%s'"), input_line_save);
816 input_line_pointer = input_line_save;
817 build_insn (opcode, myops);
820 /* This function is called once at the start of assembly, after the command
821 line arguments have been parsed and all the machine independent
822 initializations have been completed.
824 It should set up all the tables, etc., that the machine dependent part of
825 the assembler will need. */
827 void
828 md_begin ()
830 char *prev_name = "";
831 register const struct tic80_opcode *op;
832 register const struct tic80_opcode *op_end;
833 const struct predefined_symbol *pdsp;
834 extern int coff_flags; /* Defined in obj-coff.c */
836 /* Set F_AR32WR in coff_flags, which will end up in the file header
837 f_flags field. */
839 coff_flags |= F_AR32WR; /* TIc80 is 32 bit little endian */
841 /* Insert unique names into hash table. The TIc80 instruction set
842 has many identical opcode names that have different opcodes based
843 on the operands. This hash table then provides a quick index to
844 the first opcode with a particular name in the opcode table. */
846 tic80_hash = hash_new ();
847 op_end = tic80_opcodes + tic80_num_opcodes;
848 for (op = tic80_opcodes; op < op_end; op++)
850 if (strcmp (prev_name, op -> name) != 0)
852 prev_name = (char *) op -> name;
853 hash_insert (tic80_hash, op -> name, (char *) op);
857 /* Insert the predefined symbols into the symbol table. We use symbol_create
858 rather than symbol_new so that these symbols don't end up in the object
859 files' symbol table. Note that the values of the predefined symbols include
860 some upper bits that distinguish the type of the symbol (register, bitnum,
861 condition code, etc) and these bits must be masked away before actually
862 inserting the values into the instruction stream. For registers we put
863 these bits in the symbol table since we use them later and there is no
864 question that they aren't part of the register number. For constants we
865 can't do that since the constant can be any value, so they are masked off
866 before putting them into the symbol table. */
868 pdsp = NULL;
869 while ((pdsp = tic80_next_predefined_symbol (pdsp)) != NULL)
871 segT segment;
872 valueT valu;
873 int symtype;
875 symtype = PDS_VALUE (pdsp) & TIC80_OPERAND_MASK;
876 switch (symtype)
878 case TIC80_OPERAND_GPR:
879 case TIC80_OPERAND_FPA:
880 case TIC80_OPERAND_CR:
881 segment = reg_section;
882 valu = PDS_VALUE (pdsp);
883 break;
884 case TIC80_OPERAND_CC:
885 case TIC80_OPERAND_BITNUM:
886 segment = absolute_section;
887 valu = PDS_VALUE (pdsp) & ~TIC80_OPERAND_MASK;
888 break;
889 default:
890 internal_error_a (_("unhandled predefined symbol bits"), symtype);
891 break;
893 symbol_table_insert (symbol_create (PDS_NAME (pdsp), segment, valu,
894 &zero_address_frag));
900 /* The assembler adds md_shortopts to the string passed to getopt. */
902 CONST char *md_shortopts = "";
904 /* The assembler adds md_longopts to the machine independent long options
905 that are passed to getopt. */
907 struct option md_longopts[] = {
909 #define OPTION_RELAX (OPTION_MD_BASE)
910 {"relax", no_argument, NULL, OPTION_RELAX},
912 #define OPTION_NO_RELAX (OPTION_RELAX + 1)
913 {"no-relax", no_argument, NULL, OPTION_NO_RELAX},
915 {NULL, no_argument, NULL, 0}
918 size_t md_longopts_size = sizeof(md_longopts);
920 /* The md_parse_option function will be called whenever getopt returns an
921 unrecognized code, presumably indicating a special code value which
922 appears in md_longopts for machine specific command line options. */
925 md_parse_option (c, arg)
926 int c;
927 char *arg;
929 switch (c)
931 case OPTION_RELAX:
932 tic80_relax = 1;
933 break;
934 case OPTION_NO_RELAX:
935 tic80_relax = 0;
936 break;
937 default:
938 return (0);
940 return (1);
943 /* The md_show_usage function will be called whenever a usage message is
944 printed. It should print a description of the machine specific options
945 found in md_longopts. */
947 void
948 md_show_usage (stream)
949 FILE *stream;
951 fprintf (stream, "\
952 TIc80 options:\n\
953 -relax alter PC relative branch instructions to use long form when needed\n\
954 -no-relax always use short PC relative branch instructions, error on overflow\n");
958 /* Attempt to simplify or even eliminate a fixup. The return value is
959 ignored; perhaps it was once meaningful, but now it is historical.
960 To indicate that a fixup has been eliminated, set fixP->fx_done.
963 void
964 md_apply_fix (fixP, val)
965 fixS *fixP;
966 long val;
968 char *dest = fixP -> fx_frag -> fr_literal + fixP -> fx_where;
969 int overflow;
971 switch (fixP -> fx_r_type)
973 case R_RELLONGX:
974 md_number_to_chars (dest, (valueT) val, 4);
975 break;
976 case R_MPPCR:
977 val >>= 2;
978 val += 1; /* Target address computed from inst start */
979 md_number_to_chars (dest, (valueT) val, 4);
980 break;
981 case R_MPPCR15W:
982 overflow = (val < -65536L) || (val > 65532L);
983 if (overflow)
985 as_bad_where (fixP -> fx_file, fixP -> fx_line,
986 _("PC offset 0x%lx outside range 0x%lx-0x%lx"),
987 val, -65536L, 65532L);
989 else
991 val >>= 2;
992 *dest++ = val & 0xFF;
993 val >>= 8;
994 *dest = (*dest & 0x80) | (val & 0x7F);
996 break;
997 case R_ABS:
998 md_number_to_chars (dest, (valueT) val, fixP -> fx_size);
999 break;
1000 default:
1001 internal_error_a (_("unhandled relocation type in fixup"), fixP -> fx_r_type);
1002 break;
1007 /* Functions concerning relocs. */
1009 /* The location from which a PC relative jump should be calculated,
1010 given a PC relative reloc.
1012 For the TIc80, this is the address of the 32 bit opcode containing
1013 the PC relative field. */
1015 long
1016 md_pcrel_from (fixP)
1017 fixS *fixP;
1019 return (fixP -> fx_frag -> fr_address + fixP -> fx_where) ;
1023 * Called after relax() is finished.
1024 * In: Address of frag.
1025 * fr_type == rs_machine_dependent.
1026 * fr_subtype is what the address relaxed to.
1028 * Out: Any fixSs and constants are set up.
1029 * Caller will turn frag into a ".space 0".
1032 void
1033 md_convert_frag (headers, seg, fragP)
1034 object_headers *headers;
1035 segT seg;
1036 fragS *fragP;
1038 internal_error (_("md_convert_frag() not implemented yet"));
1039 abort ();
1043 /*ARGSUSED*/
1044 void
1045 tc_coff_symbol_emit_hook (ignore)
1046 symbolS *ignore;
1050 #if defined OBJ_COFF
1052 short
1053 tc_coff_fix2rtype (fixP)
1054 fixS *fixP;
1056 return (fixP -> fx_r_type);
1059 #endif /* OBJ_COFF */
1061 /* end of tc-tic80.c */