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)
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
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
41 const char line_separator_chars
[] = "";
43 /* Characters which are used to indicate an exponent in a floating
45 const char EXP_CHARS
[] = "eE";
47 /* Characters which mean that a number is a floating point constant,
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 */
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;
86 md_estimate_size_before_relax (fragP
, segment_type
)
90 internal_error (_("Relaxation is a luxury we can't afford"));
94 /* We have no need to default values of symbols. */
98 md_undefined_symbol (name
)
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
112 md_atof (type
, litP
, sizeP
)
118 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
119 LITTLENUM_TYPE
*wordP
;
141 return _("bad call to md_atof ()");
144 t
= atof_ieee (input_line_pointer
, type
, words
);
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
);
160 /* Check to see if the constant value in NUM will fit in a field of
161 width BITS if it has flags FLAGS. */
164 const_overflow (num
, bits
, flags
)
172 /* Only need to check fields less than 32 bits wide */
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
);
182 max
= (1 << bits
) - 1;
184 retval
= (num
> max
) || (num
< min
);
189 /* get_operands() parses a string of operands and fills in a passed array of
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.
204 char *p
= input_line_pointer
;
212 /* Skip leading whitespace */
213 while (*p
== ' ' || *p
== '\t' || *p
== ',')
218 /* Check to see if we have any operands left to parse */
219 if (*p
== 0 || *p
== '\n' || *p
== '\r')
224 /* Notice scaling or direct memory operand modifiers and save them in
225 an O_absent expression after the expression that they modify. */
230 exp
[numexp
].X_op
= O_absent
;
234 /* This is a ":m" modifier */
235 exp
[numexp
].X_add_number
= TIC80_OPERAND_M_SI
| TIC80_OPERAND_M_LI
;
240 /* This is a ":s" modifier */
241 exp
[numexp
].X_add_number
= TIC80_OPERAND_SCALED
;
245 as_bad (_("':' not followed by 'm' or 's'"));
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. */
259 as_bad (_("paren nesting"));
265 /* Handle trailing ')' on operands that use them, by reducing the
266 nesting level and then continuing. We complain if there were too
271 /* Record that we have left a paren group and continue */
274 as_bad (_("mismatched parenthesis"));
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"));
295 p
= input_line_pointer
;
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
;
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
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
;
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
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. */
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
367 if (X_op
!= O_absent
)
372 flags
= tic80_operands
[opc
-> operands
[opi
]].flags
;
373 bits
= tic80_operands
[opc
-> operands
[opi
]].bits
;
378 /* Also check that registers that are supposed to be even actually
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
))
390 if ((flags
& TIC80_OPERAND_ENDMASK
) && (num
== 32))
392 /* Endmask values of 0 and 32 give identical results */
395 if ((flags
& (TIC80_OPERAND_FPA
| TIC80_OPERAND_GPR
)) ||
396 const_overflow (num
, bits
, flags
))
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". */
419 /* Symbols that don't match one of the above cases are
420 rejected as an operand. */
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
)))
436 if ((num
> 0) || !(flags
& TIC80_OPERAND_FLOAT
))
451 case O_bit_inclusive_or
:
453 case O_bit_exclusive_or
:
467 internal_error_a (_("unhandled expression type"), X_op
);
476 return (match
? opc
: NULL
);
480 /* Now search the opcode table table for one with operands that
481 matches what we've got. */
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
;
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
)))
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
))))
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)
527 next_opcode
= opcode
+1;
528 if (next_opcode
->opcode
== 0)
530 if (strcmp(next_opcode
->name
, opcode
->name
))
532 opcode
= next_opcode
;
537 as_bad (_("bad opcode or operands"));
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 */
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
;
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. */
572 build_insn (opcode
, opers
)
573 struct tic80_opcode
*opcode
;
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
593 /* For each operand expression, insert the appropriate bits into the
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
607 if (X_op
!= O_absent
)
612 flags
= tic80_operands
[opcode
-> operands
[opi
]].flags
;
613 bits
= tic80_operands
[opcode
-> operands
[opi
]].bits
;
614 shift
= tic80_operands
[opcode
-> operands
[opi
]].shift
;
619 num
&= ~TIC80_OPERAND_MASK
;
620 insn
[0] = insn
[0] | (num
<< shift
);
623 if ((flags
& TIC80_OPERAND_ENDMASK
) && (num
== 32))
625 /* Endmask values of 0 and 32 give identical results */
628 else if ((flags
& TIC80_OPERAND_BITNUM
))
630 /* BITNUM values are stored in one's complement form */
633 /* Mask off upper bits, just it case it is signed and is negative */
636 num
&= (1 << bits
) - 1;
637 insn
[0] = insn
[0] | (num
<< shift
);
652 if (flags
& TIC80_OPERAND_PCREL
)
655 fx
- (fxfrag
-> fr_literal
),
664 fx
- (fxfrag
-> fr_literal
),
671 else if (flags
& TIC80_OPERAND_PCREL
)
674 f
- (ffrag
-> fr_literal
),
675 4, /* FIXME! how is this used? */
682 internal_error (_("symbol reloc that is not PC relative or 32 bits"));
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 */
705 internal_error_a (_("unhandled operand modifier"), opers
[expi
].X_add_number
);
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];
730 case O_bit_inclusive_or
:
732 case O_bit_exclusive_or
:
746 internal_error_a (_("unhandled expression"), X_op
);
751 /* Write out the instruction, either 4 or 8 bytes. */
753 md_number_to_chars (f
, insn
[0], 4);
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
764 STR points to a NULL terminated machine dependent instruction. This
765 function is supposed to emit the frags/bytes it assembles to. */
772 unsigned char *input_line_save
;
773 struct tic80_opcode
*opcode
;
774 expressionS myops
[16];
777 /* Ensure there is something there to assemble. */
780 /* Drop any leading whitespace. */
781 while (isspace (*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
++) {;}
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
);
802 while (isspace (*scan
))
807 input_line_save
= input_line_pointer
;
808 input_line_pointer
= str
;
810 opcode
= find_opcode (opcode
, myops
);
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. */
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
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. */
869 while ((pdsp
= tic80_next_predefined_symbol (pdsp
)) != NULL
)
875 symtype
= PDS_VALUE (pdsp
) & TIC80_OPERAND_MASK
;
878 case TIC80_OPERAND_GPR
:
879 case TIC80_OPERAND_FPA
:
880 case TIC80_OPERAND_CR
:
881 segment
= reg_section
;
882 valu
= PDS_VALUE (pdsp
);
884 case TIC80_OPERAND_CC
:
885 case TIC80_OPERAND_BITNUM
:
886 segment
= absolute_section
;
887 valu
= PDS_VALUE (pdsp
) & ~TIC80_OPERAND_MASK
;
890 internal_error_a (_("unhandled predefined symbol bits"), symtype
);
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
)
934 case OPTION_NO_RELAX
:
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. */
948 md_show_usage (stream
)
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.
964 md_apply_fix (fixP
, val
)
968 char *dest
= fixP
-> fx_frag
-> fr_literal
+ fixP
-> fx_where
;
971 switch (fixP
-> fx_r_type
)
974 md_number_to_chars (dest
, (valueT
) val
, 4);
978 val
+= 1; /* Target address computed from inst start */
979 md_number_to_chars (dest
, (valueT
) val
, 4);
982 overflow
= (val
< -65536L) || (val
> 65532L);
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);
992 *dest
++ = val
& 0xFF;
994 *dest
= (*dest
& 0x80) | (val
& 0x7F);
998 md_number_to_chars (dest
, (valueT
) val
, fixP
-> fx_size
);
1001 internal_error_a (_("unhandled relocation type in fixup"), fixP
-> fx_r_type
);
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. */
1016 md_pcrel_from (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".
1033 md_convert_frag (headers
, seg
, fragP
)
1034 object_headers
*headers
;
1038 internal_error (_("md_convert_frag() not implemented yet"));
1045 tc_coff_symbol_emit_hook (ignore
)
1050 #if defined OBJ_COFF
1053 tc_coff_fix2rtype (fixP
)
1056 return (fixP
-> fx_r_type
);
1059 #endif /* OBJ_COFF */
1061 /* end of tc-tic80.c */