1 /* tc-tic80.c -- Assemble for the TI TMS320C80 (MV)
2 Copyright 1996, 1997, 2000, 2001 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 "safe-ctype.h"
23 #include "opcode/tic80.h"
25 #define internal_error(what) \
26 as_fatal (_("internal error:%s:%d: %s\n"), __FILE__, __LINE__, what)
28 #define internal_error_a(what,arg) \
29 as_fatal (_("internal error:%s:%d: %s %d\n"), __FILE__, __LINE__, what, arg)
31 /* Generic assembler global variables which must be defined by all
34 /* Characters which always start a comment. */
35 const char comment_chars
[] = ";";
37 /* Characters which start a comment at the beginning of a line. */
38 const char line_comment_chars
[] = ";*#";
40 /* Characters which may be used to separate multiple commands on a single
41 line. The semicolon is such a character by default and should not be
43 const char line_separator_chars
[] = "";
45 /* Characters which are used to indicate an exponent in a floating
47 const char EXP_CHARS
[] = "eE";
49 /* Characters which mean that a number is a floating point constant,
51 const char FLT_CHARS
[] = "fF";
53 /* This table describes all the machine specific pseudo-ops the assembler
54 has to support. The fields are:
56 pseudo-op name without dot
57 function to call to execute this pseudo-op
58 integer arg to pass to the function */
60 extern void obj_coff_section ();
62 const pseudo_typeS md_pseudo_table
[] = {
63 { "align", s_align_bytes
, 4 }, /* Do byte alignment, default is a 4 byte boundary */
64 { "word", cons
, 4 }, /* FIXME: Should this be machine independent? */
65 { "bss", s_lcomm_bytes
, 1 },
66 { "sect", obj_coff_section
, 0}, /* For compatibility with TI tools */
67 { "section", obj_coff_section
, 0}, /* Standard COFF .section pseudo-op */
71 /* Opcode hash table. */
72 static struct hash_control
*tic80_hash
;
74 static struct tic80_opcode
* find_opcode
PARAMS ((struct tic80_opcode
*, expressionS
[]));
75 static void build_insn
PARAMS ((struct tic80_opcode
*, expressionS
*));
76 static int get_operands
PARAMS ((expressionS exp
[]));
77 static int const_overflow
PARAMS ((unsigned long num
, int bits
, int flags
));
79 /* Replace short PC relative instructions with long form when
80 necessary. Currently this is off by default or when given the
81 -no-relax option. Turning it on by using the -relax option forces
82 all PC relative instructions to use the long form, which is why it
83 is currently not the default. */
84 static int tic80_relax
= 0;
87 md_estimate_size_before_relax (fragP
, segment_type
)
91 internal_error (_("Relaxation is a luxury we can't afford"));
95 /* 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
105 of type TYPE, and store the appropriate bytes in *LITP. The number
106 of LITTLENUMS emitted is stored in *SIZEP. An error message is
107 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
190 array of 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. */
202 char *p
= input_line_pointer
;
210 /* Skip leading whitespace. */
211 while (*p
== ' ' || *p
== '\t' || *p
== ',')
214 /* Check to see if we have any operands left to parse. */
215 if (*p
== 0 || *p
== '\n' || *p
== '\r')
218 /* Notice scaling or direct memory operand modifiers and save them in
219 an O_absent expression after the expression that they modify. */
224 exp
[numexp
].X_op
= O_absent
;
228 /* This is a ":m" modifier. */
229 exp
[numexp
].X_add_number
= TIC80_OPERAND_M_SI
| TIC80_OPERAND_M_LI
;
234 /* This is a ":s" modifier. */
235 exp
[numexp
].X_add_number
= TIC80_OPERAND_SCALED
;
239 as_bad (_("':' not followed by 'm' or 's'"));
245 /* Handle leading '(' on operands that use them, by recording that we
246 have entered a paren nesting level and then continuing. We complain
247 about multiple nesting. */
252 as_bad (_("paren nesting"));
258 /* Handle trailing ')' on operands that use them, by reducing the
259 nesting level and then continuing. We complain if there were too
264 /* Record that we have left a paren group and continue. */
266 as_bad (_("mismatched parenthesis"));
272 /* Begin operand parsing at the current scan point. */
274 input_line_pointer
= p
;
275 expression (&exp
[numexp
]);
277 if (exp
[numexp
].X_op
== O_illegal
)
279 as_bad (_("illegal operand"));
281 else if (exp
[numexp
].X_op
== O_absent
)
283 as_bad (_("missing operand"));
287 p
= input_line_pointer
;
292 exp
[numexp
].X_op
= O_absent
;
293 exp
[numexp
++].X_add_number
= TIC80_OPERAND_PARENS
;
296 /* Mark the end of the valid operands with an illegal expression. */
297 exp
[numexp
].X_op
= O_illegal
;
302 /* find_opcode() gets a pointer to the entry in the opcode table that
303 matches the instruction being assembled, or returns NULL if no such match
306 First it parses all the operands and save them as expressions. Note that
307 we use O_absent expressions to record additional information about the
308 previous non-O_absent expression, such as ":m" or ":s" modifiers or
309 register numbers enclosed in parens like "(r10)".
311 It then looks at all opcodes with the same name and uses the operands to
312 choose the correct opcode. */
314 static struct tic80_opcode
*
315 find_opcode (opcode
, myops
)
316 struct tic80_opcode
*opcode
;
319 int numexp
; /* Number of expressions from parsing operands */
320 int expi
; /* Index of current expression to match */
321 int opi
; /* Index of current operand to match */
322 int match
= 0; /* Set to 1 when an operand match is found */
323 struct tic80_opcode
*opc
= opcode
; /* Pointer to current opcode table entry */
324 const struct tic80_opcode
*end
; /* Pointer to end of opcode table */
326 /* First parse all the operands so we only have to do it once. There may
327 be more expressions generated than there are operands. */
329 numexp
= get_operands (myops
);
331 /* For each opcode with the same name, try to match it against the parsed
334 end
= tic80_opcodes
+ tic80_num_opcodes
;
335 while (!match
&& (opc
< end
) && (strcmp (opc
->name
, opcode
->name
) == 0))
337 /* Start off assuming a match. If we find a mismatch, then this is
338 reset and the operand/expr matching loop terminates with match
339 equal to zero, which allows us to try the next opcode. */
343 /* For each expression, try to match it against the current operand
344 for the current opcode. Upon any mismatch, we abandon further
345 matching for the current opcode table entry. */
347 for (expi
= 0, opi
= -1; (expi
< numexp
) && match
; expi
++)
349 int bits
, flags
, X_op
, num
;
351 X_op
= myops
[expi
].X_op
;
352 num
= myops
[expi
].X_add_number
;
354 /* The O_absent expressions apply to the same operand as the most
355 recent non O_absent expression. So only increment the operand
356 index when the current expression is not one of these special
359 if (X_op
!= O_absent
)
364 flags
= tic80_operands
[opc
->operands
[opi
]].flags
;
365 bits
= tic80_operands
[opc
->operands
[opi
]].bits
;
370 /* Also check that registers that are supposed to be
371 even actually are even. */
372 if (((flags
& TIC80_OPERAND_GPR
) != (num
& TIC80_OPERAND_GPR
)) ||
373 ((flags
& TIC80_OPERAND_FPA
) != (num
& TIC80_OPERAND_FPA
)) ||
374 ((flags
& TIC80_OPERAND_CR
) != (num
& TIC80_OPERAND_CR
)) ||
375 ((flags
& TIC80_OPERAND_EVEN
) && (num
& 1)) ||
376 const_overflow (num
& ~TIC80_OPERAND_MASK
, bits
, flags
))
382 if ((flags
& TIC80_OPERAND_ENDMASK
) && (num
== 32))
384 /* Endmask values of 0 and 32 give identical
388 if ((flags
& (TIC80_OPERAND_FPA
| TIC80_OPERAND_GPR
)) ||
389 const_overflow (num
, bits
, flags
))
395 if ((bits
< 32) && (flags
& TIC80_OPERAND_PCREL
)
398 /* The default is to prefer the short form of PC
399 relative relocations. This is the only form that
400 the TI assembler supports. If the -relax option
401 is given, we never use the short forms.
402 FIXME: Should be able to choose "best-fit". */
404 else if ((bits
== 32)
406 && (flags
& TIC80_OPERAND_BASEREL
)
410 /* The default is to prefer the long form of base
411 relative relocations. This is the only form that
412 the TI assembler supports. If the -no-relax
413 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
426 expression that supplies additional information about
427 the operand, such as ":m" or ":s" modifiers. Check to
428 see that the operand matches this requirement. */
429 if (!((num
& TIC80_OPERAND_M_SI
) && (flags
& TIC80_OPERAND_M_SI
)
430 || (num
& TIC80_OPERAND_M_LI
) && (flags
& TIC80_OPERAND_M_LI
)
431 || (num
& TIC80_OPERAND_SCALED
) && (flags
& TIC80_OPERAND_SCALED
)))
437 if ((num
> 0) || !(flags
& TIC80_OPERAND_FLOAT
))
452 case O_bit_inclusive_or
:
454 case O_bit_exclusive_or
:
468 internal_error_a (_("unhandled expression type"), X_op
);
475 return (match
? opc
: NULL
);
478 /* Now search the opcode table table for one with operands that
479 matches what we've got. */
484 for (i
= 0; opcode
->operands
[i
]; i
++)
486 int flags
= tic80_operands
[opcode
->operands
[i
]].flags
;
487 int X_op
= myops
[i
].X_op
;
488 int num
= myops
[i
].X_add_number
;
497 & (TIC80_OPERAND_GPR
| TIC80_OPERAND_FPA
| TIC80_OPERAND_CR
))
499 if ((X_op
!= O_register
) ||
500 ((flags
& TIC80_OPERAND_GPR
) != (num
& TIC80_OPERAND_GPR
)) ||
501 ((flags
& TIC80_OPERAND_FPA
) != (num
& TIC80_OPERAND_FPA
)) ||
502 ((flags
& TIC80_OPERAND_CR
) != (num
& TIC80_OPERAND_CR
)))
509 if (((flags
& TIC80_OPERAND_MINUS
) && ((X_op
!= O_absent
) || (num
!= TIC80_OPERAND_MINUS
))) ||
510 ((flags
& TIC80_OPERAND_PLUS
) && ((X_op
!= O_absent
) || (num
!= TIC80_OPERAND_PLUS
))) ||
511 ((flags
& TIC80_OPERAND_ATMINUS
) && ((X_op
!= O_absent
) || (num
!= TIC80_OPERAND_ATMINUS
))) ||
512 ((flags
& TIC80_OPERAND_ATPAR
) && ((X_op
!= O_absent
) || (num
!= TIC80_OPERAND_ATPAR
))) ||
513 ((flags
& TIC80_OPERAND_ATSIGN
) && ((X_op
!= O_absent
) || (num
!= TIC80_OPERAND_ATSIGN
))))
519 /* We're only done if the operands matched so far AND there
520 are no more to check. */
521 if (match
&& myops
[i
].X_op
== 0)
526 next_opcode
= opcode
+ 1;
527 if (next_opcode
->opcode
== 0)
529 if (strcmp (next_opcode
->name
, opcode
->name
))
531 opcode
= next_opcode
;
536 as_bad (_("bad opcode or operands"));
540 /* Check that all registers that are required to be even are.
541 Also, if any operands were marked as registers, but were really
542 symbols, fix that here. */
543 for (i
= 0; opcode
->operands
[i
]; i
++)
545 if ((tic80_operands
[opcode
->operands
[i
]].flags
& TIC80_OPERAND_EVEN
)
546 && (myops
[i
].X_add_number
& 1))
547 as_fatal (_("Register number must be EVEN"));
548 if (myops
[i
].X_op
== O_register
)
550 if (!(tic80_operands
[opcode
->operands
[i
]].flags
& TIC80_OPERAND_REG
))
552 myops
[i
].X_op
= O_symbol
;
553 myops
[i
].X_add_symbol
=
554 symbol_find_or_make ((char *) myops
[i
].X_op_symbol
);
555 myops
[i
].X_add_number
= 0;
556 myops
[i
].X_op_symbol
= NULL
;
563 /* build_insn takes a pointer to the opcode entry in the opcode table
564 and the array of operand expressions and writes out the instruction.
566 Note that the opcode word and extended word may be written to different
567 frags, with the opcode at the end of one frag and the extension at the
568 beginning of the next. */
571 build_insn (opcode
, opers
)
572 struct tic80_opcode
*opcode
;
575 int expi
; /* Index of current expression to match */
576 int opi
; /* Index of current operand to match */
577 unsigned long insn
[2]; /* Instruction and long immediate (if any) */
578 char *f
; /* Pointer to frag location for insn[0] */
579 fragS
*ffrag
; /* Frag containing location f */
580 char *fx
= NULL
; /* Pointer to frag location for insn[1] */
581 fragS
*fxfrag
; /* Frag containing location fx */
583 /* Start with the raw opcode bits from the opcode table. */
584 insn
[0] = opcode
->opcode
;
586 /* We are going to insert at least one 32 bit opcode so get the
592 /* For each operand expression, insert the appropriate bits into the
594 for (expi
= 0, opi
= -1; opers
[expi
].X_op
!= O_illegal
; expi
++)
596 int bits
, shift
, flags
, X_op
, num
;
598 X_op
= opers
[expi
].X_op
;
599 num
= opers
[expi
].X_add_number
;
601 /* The O_absent expressions apply to the same operand as the most
602 recent non O_absent expression. So only increment the operand
603 index when the current expression is not one of these special
606 if (X_op
!= O_absent
)
611 flags
= tic80_operands
[opcode
->operands
[opi
]].flags
;
612 bits
= tic80_operands
[opcode
->operands
[opi
]].bits
;
613 shift
= tic80_operands
[opcode
->operands
[opi
]].shift
;
618 num
&= ~TIC80_OPERAND_MASK
;
619 insn
[0] = insn
[0] | (num
<< shift
);
622 if ((flags
& TIC80_OPERAND_ENDMASK
) && (num
== 32))
624 /* Endmask values of 0 and 32 give identical results. */
627 else if ((flags
& TIC80_OPERAND_BITNUM
))
629 /* BITNUM values are stored in one's complement form. */
632 /* Mask off upper bits, just it case it is signed and is
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
687 possible modifier. */
688 if ((num
& TIC80_OPERAND_M_SI
)
689 && (flags
& TIC80_OPERAND_M_SI
))
691 insn
[0] = insn
[0] | (1 << 17);
693 else if ((num
& TIC80_OPERAND_M_LI
)
694 && (flags
& TIC80_OPERAND_M_LI
))
696 insn
[0] = insn
[0] | (1 << 15);
698 else if ((num
& TIC80_OPERAND_SCALED
)
699 && (flags
& TIC80_OPERAND_SCALED
))
701 insn
[0] = insn
[0] | (1 << 11);
703 else if ((num
& TIC80_OPERAND_PARENS
)
704 && (flags
& TIC80_OPERAND_PARENS
))
706 /* No code to generate, just accept and discard this
711 internal_error_a (_("unhandled operand modifier"),
712 opers
[expi
].X_add_number
);
720 long exponent_bits
= 8L;
721 LITTLENUM_TYPE words
[2];
722 /* Value is still in generic_floating_point_number. */
723 gen_to_words (words
, precision
, exponent_bits
);
724 insn
[1] = (words
[0] << 16) | words
[1];
737 case O_bit_inclusive_or
:
739 case O_bit_exclusive_or
:
753 internal_error_a (_("unhandled expression"), X_op
);
758 /* Write out the instruction, either 4 or 8 bytes. */
760 md_number_to_chars (f
, insn
[0], 4);
763 md_number_to_chars (fx
, insn
[1], 4);
767 /* This is the main entry point for the machine-dependent assembler. Gas
768 calls this function for each input line which does not contain a
771 STR points to a NULL terminated machine dependent instruction. This
772 function is supposed to emit the frags/bytes it assembles to. */
779 unsigned char *input_line_save
;
780 struct tic80_opcode
*opcode
;
781 expressionS myops
[16];
784 /* Ensure there is something there to assemble. */
787 /* Drop any leading whitespace. */
788 while (ISSPACE (*str
))
791 /* Isolate the mnemonic from the rest of the string by finding the first
792 whitespace character and zapping it to a null byte. */
793 for (scan
= str
; *scan
!= '\000' && !ISSPACE (*scan
); scan
++)
799 /* Try to find this mnemonic in the hash table. */
800 if ((opcode
= (struct tic80_opcode
*) hash_find (tic80_hash
, str
)) == NULL
)
802 as_bad (_("Invalid mnemonic: '%s'"), str
);
807 while (ISSPACE (*scan
))
810 input_line_save
= input_line_pointer
;
811 input_line_pointer
= str
;
813 opcode
= find_opcode (opcode
, myops
);
815 as_bad (_("Invalid operands: '%s'"), input_line_save
);
817 input_line_pointer
= input_line_save
;
818 build_insn (opcode
, myops
);
821 /* This function is called once at the start of assembly, after the command
822 line arguments have been parsed and all the machine independent
823 initializations have been completed.
825 It should set up all the tables, etc., that the machine dependent part of
826 the assembler will need. */
831 char *prev_name
= "";
832 register const struct tic80_opcode
*op
;
833 register const struct tic80_opcode
*op_end
;
834 const struct predefined_symbol
*pdsp
;
835 extern int coff_flags
; /* Defined in obj-coff.c */
837 /* Set F_AR32WR in coff_flags, which will end up in the file header
840 coff_flags
|= F_AR32WR
; /* TIc80 is 32 bit little endian. */
842 /* Insert unique names into hash table. The TIc80 instruction set
843 has many identical opcode names that have different opcodes based
844 on the operands. This hash table then provides a quick index to
845 the first opcode with a particular name in the opcode table. */
847 tic80_hash
= hash_new ();
848 op_end
= tic80_opcodes
+ tic80_num_opcodes
;
849 for (op
= tic80_opcodes
; op
< op_end
; op
++)
851 if (strcmp (prev_name
, op
->name
) != 0)
853 prev_name
= (char *) op
->name
;
854 hash_insert (tic80_hash
, op
->name
, (char *) op
);
858 /* Insert the predefined symbols into the symbol table. We use
859 symbol_create rather than symbol_new so that these symbols don't
860 end up in the object files' symbol table. Note that the values
861 of the predefined symbols include some upper bits that
862 distinguish the type of the symbol (register, bitnum, condition
863 code, etc) and these bits must be masked away before actually
864 inserting the values into the instruction stream. For registers
865 we put these bits in the symbol table since we use them later and
866 there is no question that they aren't part of the register
867 number. For constants we can't do that since the constant can be
868 any value, so they are masked off before putting them into the
872 while ((pdsp
= tic80_next_predefined_symbol (pdsp
)) != NULL
)
878 symtype
= PDS_VALUE (pdsp
) & TIC80_OPERAND_MASK
;
881 case TIC80_OPERAND_GPR
:
882 case TIC80_OPERAND_FPA
:
883 case TIC80_OPERAND_CR
:
884 segment
= reg_section
;
885 valu
= PDS_VALUE (pdsp
);
887 case TIC80_OPERAND_CC
:
888 case TIC80_OPERAND_BITNUM
:
889 segment
= absolute_section
;
890 valu
= PDS_VALUE (pdsp
) & ~TIC80_OPERAND_MASK
;
893 internal_error_a (_("unhandled predefined symbol bits"), symtype
);
896 symbol_table_insert (symbol_create (PDS_NAME (pdsp
), segment
, valu
,
897 &zero_address_frag
));
901 /* The assembler adds md_shortopts to the string passed to getopt. */
903 CONST
char *md_shortopts
= "";
905 /* The assembler adds md_longopts to the machine independent long options
906 that are passed to getopt. */
908 struct option md_longopts
[] = {
910 #define OPTION_RELAX (OPTION_MD_BASE)
911 {"relax", no_argument
, NULL
, OPTION_RELAX
},
913 #define OPTION_NO_RELAX (OPTION_RELAX + 1)
914 {"no-relax", no_argument
, NULL
, OPTION_NO_RELAX
},
916 {NULL
, no_argument
, NULL
, 0}
919 size_t md_longopts_size
= sizeof (md_longopts
);
921 /* The md_parse_option function will be called whenever getopt returns an
922 unrecognized code, presumably indicating a special code value which
923 appears in md_longopts for machine specific command line options. */
926 md_parse_option (c
, arg
)
935 case OPTION_NO_RELAX
:
944 /* The md_show_usage function will be called whenever a usage message is
945 printed. It should print a description of the machine specific options
946 found in md_longopts. */
949 md_show_usage (stream
)
954 -relax alter PC relative branch instructions to use long form when needed\n\
955 -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 md_apply_fix3 (fixP
, valP
, seg
)
966 segT seg ATTRIBUTE_UNUSED
;
968 long val
= * (long *) valP
;
969 char *dest
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
972 switch (fixP
->fx_r_type
)
975 md_number_to_chars (dest
, (valueT
) val
, 4);
979 val
+= 1; /* Target address computed from inst start */
980 md_number_to_chars (dest
, (valueT
) val
, 4);
983 overflow
= (val
< -65536L) || (val
> 65532L);
986 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
987 _("PC offset 0x%lx outside range 0x%lx-0x%lx"),
988 val
, -65536L, 65532L);
993 *dest
++ = val
& 0xFF;
995 *dest
= (*dest
& 0x80) | (val
& 0x7F);
999 md_number_to_chars (dest
, (valueT
) val
, fixP
->fx_size
);
1002 internal_error_a (_("unhandled relocation type in fixup"),
1007 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
1011 /* Functions concerning relocs. */
1013 /* The location from which a PC relative jump should be calculated,
1014 given a PC relative reloc.
1016 For the TIc80, this is the address of the 32 bit opcode containing
1017 the PC relative field. */
1020 md_pcrel_from (fixP
)
1023 return (fixP
->fx_frag
->fr_address
+ fixP
->fx_where
);
1026 /* Called after relax() is finished.
1027 * In: Address of frag.
1028 * fr_type == rs_machine_dependent.
1029 * fr_subtype is what the address relaxed to.
1031 * Out: Any fixSs and constants are set up.
1032 * Caller will turn frag into a ".space 0".
1036 md_convert_frag (headers
, seg
, fragP
)
1037 object_headers
*headers
;
1041 internal_error (_("md_convert_frag() not implemented yet"));
1046 tc_coff_symbol_emit_hook (ignore
)
1051 #if defined OBJ_COFF
1054 tc_coff_fix2rtype (fixP
)
1057 return (fixP
->fx_r_type
);
1060 #endif /* OBJ_COFF */