1 /* tc-v850.c -- Assembler code for the NEC V850
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
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 2, or (at your option)
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.
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
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "safe-ctype.h"
26 #include "opcode/v850.h"
27 #include "dwarf2dbg.h"
29 /* Sign-extend a 16-bit number. */
30 #define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
32 /* Temporarily holds the reloc in a cons expression. */
33 static bfd_reloc_code_real_type hold_cons_reloc
= BFD_RELOC_UNUSED
;
35 /* Set to TRUE if we want to be pedantic about signed overflows. */
36 static bfd_boolean warn_signed_overflows
= FALSE
;
37 static bfd_boolean warn_unsigned_overflows
= FALSE
;
39 /* Indicates the target BFD machine number. */
40 static int machine
= -1;
42 /* Indicates the target processor(s) for the assemble. */
43 static int processor_mask
= -1;
45 /* Structure to hold information about predefined registers. */
51 /* Generic assembler global variables which must be defined by all
54 /* Characters which always start a comment. */
55 const char comment_chars
[] = "#";
57 /* Characters which start a comment at the beginning of a line. */
58 const char line_comment_chars
[] = ";#";
60 /* Characters which may be used to separate multiple commands on a
62 const char line_separator_chars
[] = ";";
64 /* Characters which are used to indicate an exponent in a floating
66 const char EXP_CHARS
[] = "eE";
68 /* Characters which mean that a number is a floating point constant,
70 const char FLT_CHARS
[] = "dD";
72 const relax_typeS md_relax_table
[] = {
73 /* Conditional branches. */
75 {0x1fffff, -0x200000, 6, 0},
76 /* Unconditional branches. */
78 {0x1fffff, -0x200000, 4, 0},
81 static int v850_relax
= 0;
84 #define MAX_INSN_FIXUPS (5)
88 bfd_reloc_code_real_type reloc
;
91 struct v850_fixup fixups
[MAX_INSN_FIXUPS
];
101 struct v850_seg_entry v850_seg_table
[] =
104 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
107 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
109 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
111 SEC_ALLOC
| SEC_SMALL_DATA
},
117 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_DATA
118 | SEC_HAS_CONTENTS
| SEC_SMALL_DATA
},
120 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_DATA
121 | SEC_HAS_CONTENTS
},
123 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
124 | SEC_SMALL_DATA
| SEC_IS_COMMON
},
126 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
129 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
131 { NULL
, ".call_table_data",
132 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
133 { NULL
, ".call_table_text",
134 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_CODE
140 #define SDATA_SECTION 0
141 #define TDATA_SECTION 1
142 #define ZDATA_SECTION 2
143 #define SBSS_SECTION 3
144 #define TBSS_SECTION 4
145 #define ZBSS_SECTION 5
146 #define ROSDATA_SECTION 6
147 #define ROZDATA_SECTION 7
148 #define SCOMMON_SECTION 8
149 #define TCOMMON_SECTION 9
150 #define ZCOMMON_SECTION 10
151 #define CALL_TABLE_DATA_SECTION 11
152 #define CALL_TABLE_TEXT_SECTION 12
153 #define BSS_SECTION 13
155 static void do_v850_seg
PARAMS ((int, subsegT
));
162 struct v850_seg_entry
*seg
= v850_seg_table
+ i
;
164 obj_elf_section_change_hook ();
167 subseg_set (seg
->s
, sub
);
171 seg
->s
= subseg_new (seg
->name
, sub
);
172 bfd_set_section_flags (stdoutput
, seg
->s
, seg
->flags
);
173 if ((seg
->flags
& SEC_LOAD
) == 0)
174 seg_info (seg
->s
)->bss
= 1;
178 static void v850_seg
PARAMS ((int i
));
184 subsegT sub
= get_absolute_expression ();
186 do_v850_seg (i
, sub
);
187 demand_empty_rest_of_line ();
190 static void v850_offset
PARAMS ((int));
194 int ignore ATTRIBUTE_UNUSED
;
197 int temp
= get_absolute_expression ();
199 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
)0, (symbolS
*)0,
200 (offsetT
) temp
, (char *) 0);
203 demand_empty_rest_of_line ();
206 /* Copied from obj_elf_common() in gas/config/obj-elf.c. */
208 static void v850_comm
PARAMS ((int));
222 name
= input_line_pointer
;
223 c
= get_symbol_end ();
225 /* Just after name is now '\0'. */
226 p
= input_line_pointer
;
231 if (*input_line_pointer
!= ',')
233 as_bad (_("Expected comma after symbol-name"));
234 ignore_rest_of_line ();
239 input_line_pointer
++;
241 if ((temp
= get_absolute_expression ()) < 0)
243 /* xgettext:c-format */
244 as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp
);
245 ignore_rest_of_line ();
251 symbolP
= symbol_find_or_make (name
);
254 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
256 as_bad (_("Ignoring attempt to re-define symbol"));
257 ignore_rest_of_line ();
261 if (S_GET_VALUE (symbolP
) != 0)
263 if (S_GET_VALUE (symbolP
) != size
)
265 /* xgettext:c-format */
266 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
267 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), size
);
271 know (symbol_get_frag (symbolP
) == &zero_address_frag
);
273 if (*input_line_pointer
!= ',')
278 input_line_pointer
++;
282 if (! have_align
|| *input_line_pointer
!= '"')
288 temp
= get_absolute_expression ();
293 as_warn (_("Common alignment negative; 0 assumed"));
297 if (symbol_get_obj (symbolP
)->local
)
306 old_subsec
= now_subseg
;
308 applicable
= bfd_applicable_section_flags (stdoutput
);
310 applicable
&= SEC_ALLOC
;
314 case SCOMMON_SECTION
:
315 do_v850_seg (SBSS_SECTION
, 0);
318 case ZCOMMON_SECTION
:
319 do_v850_seg (ZBSS_SECTION
, 0);
322 case TCOMMON_SECTION
:
323 do_v850_seg (TBSS_SECTION
, 0);
329 /* Convert to a power of 2 alignment. */
330 for (align
= 0; (temp
& 1) == 0; temp
>>= 1, ++align
)
335 as_bad (_("Common alignment not a power of 2"));
336 ignore_rest_of_line ();
343 record_alignment (now_seg
, align
);
346 frag_align (align
, 0, 0);
350 case SCOMMON_SECTION
:
351 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[SBSS_SECTION
].s
)
352 symbol_get_frag (symbolP
)->fr_symbol
= 0;
355 case ZCOMMON_SECTION
:
356 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[ZBSS_SECTION
].s
)
357 symbol_get_frag (symbolP
)->fr_symbol
= 0;
360 case TCOMMON_SECTION
:
361 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[TBSS_SECTION
].s
)
362 symbol_get_frag (symbolP
)->fr_symbol
= 0;
369 symbol_set_frag (symbolP
, frag_now
);
370 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
371 (offsetT
) size
, (char *) 0);
373 S_SET_SIZE (symbolP
, size
);
377 case SCOMMON_SECTION
:
378 S_SET_SEGMENT (symbolP
, v850_seg_table
[SBSS_SECTION
].s
);
381 case ZCOMMON_SECTION
:
382 S_SET_SEGMENT (symbolP
, v850_seg_table
[ZBSS_SECTION
].s
);
385 case TCOMMON_SECTION
:
386 S_SET_SEGMENT (symbolP
, v850_seg_table
[TBSS_SECTION
].s
);
393 S_CLEAR_EXTERNAL (symbolP
);
394 obj_elf_section_change_hook ();
395 subseg_set (old_sec
, old_subsec
);
404 old_subsec
= now_subseg
;
406 S_SET_VALUE (symbolP
, (valueT
) size
);
407 S_SET_ALIGN (symbolP
, temp
);
408 S_SET_EXTERNAL (symbolP
);
412 case SCOMMON_SECTION
:
413 case ZCOMMON_SECTION
:
414 case TCOMMON_SECTION
:
415 do_v850_seg (area
, 0);
416 S_SET_SEGMENT (symbolP
, v850_seg_table
[area
].s
);
423 obj_elf_section_change_hook ();
424 subseg_set (old_sec
, old_subsec
);
429 input_line_pointer
++;
431 /* @@ Some use the dot, some don't. Can we get some consistency?? */
432 if (*input_line_pointer
== '.')
433 input_line_pointer
++;
435 /* @@ Some say data, some say bss. */
436 if (strncmp (input_line_pointer
, "bss\"", 4)
437 && strncmp (input_line_pointer
, "data\"", 5))
439 while (*--input_line_pointer
!= '"')
441 input_line_pointer
--;
442 goto bad_common_segment
;
444 while (*input_line_pointer
++ != '"')
446 goto allocate_common
;
449 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
451 demand_empty_rest_of_line ();
456 p
= input_line_pointer
;
457 while (*p
&& *p
!= '\n')
461 as_bad (_("bad .common segment %s"), input_line_pointer
+ 1);
463 input_line_pointer
= p
;
464 ignore_rest_of_line ();
469 static void set_machine
PARAMS ((int));
476 bfd_set_arch_mach (stdoutput
, TARGET_ARCH
, machine
);
480 case 0: processor_mask
= PROCESSOR_V850
; break;
481 case bfd_mach_v850e
: processor_mask
= PROCESSOR_V850E
; break;
485 static void v850_longcode
PARAMS ((int));
496 as_warn (".longcall pseudo-op seen when not relaxing");
498 as_warn (".longjump pseudo-op seen when not relaxing");
503 if (ex
.X_op
!= O_symbol
|| ex
.X_add_number
!= 0)
505 as_bad ("bad .longcall format");
506 ignore_rest_of_line ();
512 fix_new_exp (frag_now
, frag_now_fix (), 4, & ex
, 1,
513 BFD_RELOC_V850_LONGCALL
);
515 fix_new_exp (frag_now
, frag_now_fix (), 4, & ex
, 1,
516 BFD_RELOC_V850_LONGJUMP
);
518 demand_empty_rest_of_line ();
521 /* The target specific pseudo-ops which we support. */
522 const pseudo_typeS md_pseudo_table
[] =
524 { "sdata", v850_seg
, SDATA_SECTION
},
525 { "tdata", v850_seg
, TDATA_SECTION
},
526 { "zdata", v850_seg
, ZDATA_SECTION
},
527 { "sbss", v850_seg
, SBSS_SECTION
},
528 { "tbss", v850_seg
, TBSS_SECTION
},
529 { "zbss", v850_seg
, ZBSS_SECTION
},
530 { "rosdata", v850_seg
, ROSDATA_SECTION
},
531 { "rozdata", v850_seg
, ROZDATA_SECTION
},
532 { "bss", v850_seg
, BSS_SECTION
},
533 { "offset", v850_offset
, 0 },
535 { "zcomm", v850_comm
, ZCOMMON_SECTION
},
536 { "scomm", v850_comm
, SCOMMON_SECTION
},
537 { "tcomm", v850_comm
, TCOMMON_SECTION
},
538 { "v850", set_machine
, 0 },
539 { "call_table_data", v850_seg
, CALL_TABLE_DATA_SECTION
},
540 { "call_table_text", v850_seg
, CALL_TABLE_TEXT_SECTION
},
541 { "v850e", set_machine
, bfd_mach_v850e
},
542 { "file", (void (*) PARAMS ((int))) dwarf2_directive_file
, 0 },
543 { "loc", dwarf2_directive_loc
, 0 },
544 { "longcall", v850_longcode
, 1 },
545 { "longjump", v850_longcode
, 2 },
549 /* Opcode hash table. */
550 static struct hash_control
*v850_hash
;
552 /* This table is sorted. Suitable for searching by a binary search. */
553 static const struct reg_name pre_defined_registers
[] =
555 { "ep", 30 }, /* ep - element ptr */
556 { "gp", 4 }, /* gp - global ptr */
557 { "hp", 2 }, /* hp - handler stack ptr */
558 { "lp", 31 }, /* lp - link ptr */
591 { "sp", 3 }, /* sp - stack ptr */
592 { "tp", 5 }, /* tp - text ptr */
596 #define REG_NAME_CNT \
597 (sizeof (pre_defined_registers) / sizeof (struct reg_name))
599 static const struct reg_name system_registers
[] =
621 #define SYSREG_NAME_CNT \
622 (sizeof (system_registers) / sizeof (struct reg_name))
624 static const struct reg_name system_list_registers
[] =
630 #define SYSREGLIST_NAME_CNT \
631 (sizeof (system_list_registers) / sizeof (struct reg_name))
633 static const struct reg_name cc_names
[] =
659 #define CC_NAME_CNT \
660 (sizeof (cc_names) / sizeof (struct reg_name))
662 /* Do a binary search of the given register table to see if NAME is a
663 valid regiter name. Return the register number from the array on
664 success, or -1 on failure. */
666 static int reg_name_search
667 PARAMS ((const struct reg_name
*, int, const char *, bfd_boolean
));
670 reg_name_search (regs
, regcount
, name
, accept_numbers
)
671 const struct reg_name
*regs
;
674 bfd_boolean accept_numbers
;
676 int middle
, low
, high
;
680 /* If the register name is a symbol, then evaluate it. */
681 if ((symbolP
= symbol_find (name
)) != NULL
)
683 /* If the symbol is an alias for another name then use that.
684 If the symbol is an alias for a number, then return the number. */
685 if (symbol_equated_p (symbolP
))
688 = S_GET_NAME (symbol_get_value_expression (symbolP
)->X_add_symbol
);
690 else if (accept_numbers
)
692 int reg
= S_GET_VALUE (symbolP
);
694 if (reg
>= 0 && reg
<= 31)
698 /* Otherwise drop through and try parsing name normally. */
706 middle
= (low
+ high
) / 2;
707 cmp
= strcasecmp (name
, regs
[middle
].name
);
713 return regs
[middle
].value
;
719 /* Summary of register_name().
721 in: Input_line_pointer points to 1st char of operand.
724 The operand may have been a register: in this case, X_op == O_register,
725 X_add_number is set to the register number, and truth is returned.
726 Input_line_pointer->(next non-blank) char after operand, or is in
727 its original state. */
729 static bfd_boolean register_name
PARAMS ((expressionS
*));
732 register_name (expressionP
)
733 expressionS
*expressionP
;
740 /* Find the spelling of the operand. */
741 start
= name
= input_line_pointer
;
743 c
= get_symbol_end ();
745 reg_number
= reg_name_search (pre_defined_registers
, REG_NAME_CNT
,
748 /* Put back the delimiting char. */
749 *input_line_pointer
= c
;
751 /* Look to see if it's in the register table. */
754 expressionP
->X_op
= O_register
;
755 expressionP
->X_add_number
= reg_number
;
757 /* Make the rest nice. */
758 expressionP
->X_add_symbol
= NULL
;
759 expressionP
->X_op_symbol
= NULL
;
765 /* Reset the line as if we had not done anything. */
766 input_line_pointer
= start
;
772 /* Summary of system_register_name().
774 in: INPUT_LINE_POINTER points to 1st char of operand.
775 EXPRESSIONP points to an expression structure to be filled in.
776 ACCEPT_NUMBERS is true iff numerical register names may be used.
777 ACCEPT_LIST_NAMES is true iff the special names PS and SR may be
780 out: An expressionS structure in expressionP.
781 The operand may have been a register: in this case, X_op == O_register,
782 X_add_number is set to the register number, and truth is returned.
783 Input_line_pointer->(next non-blank) char after operand, or is in
784 its original state. */
786 static bfd_boolean system_register_name
787 PARAMS ((expressionS
*, bfd_boolean
, bfd_boolean
));
790 system_register_name (expressionP
, accept_numbers
, accept_list_names
)
791 expressionS
*expressionP
;
792 bfd_boolean accept_numbers
;
793 bfd_boolean accept_list_names
;
800 /* Find the spelling of the operand. */
801 start
= name
= input_line_pointer
;
803 c
= get_symbol_end ();
804 reg_number
= reg_name_search (system_registers
, SYSREG_NAME_CNT
, name
,
807 /* Put back the delimiting char. */
808 *input_line_pointer
= c
;
813 /* Reset input_line pointer. */
814 input_line_pointer
= start
;
816 if (ISDIGIT (*input_line_pointer
))
818 reg_number
= strtol (input_line_pointer
, &input_line_pointer
, 10);
820 /* Make sure that the register number is allowable. */
822 || (reg_number
> 5 && reg_number
< 16)
828 else if (accept_list_names
)
830 c
= get_symbol_end ();
831 reg_number
= reg_name_search (system_list_registers
,
832 SYSREGLIST_NAME_CNT
, name
, FALSE
);
834 /* Put back the delimiting char. */
835 *input_line_pointer
= c
;
839 /* Look to see if it's in the register table. */
842 expressionP
->X_op
= O_register
;
843 expressionP
->X_add_number
= reg_number
;
845 /* Make the rest nice. */
846 expressionP
->X_add_symbol
= NULL
;
847 expressionP
->X_op_symbol
= NULL
;
853 /* Reset the line as if we had not done anything. */
854 input_line_pointer
= start
;
860 /* Summary of cc_name().
862 in: INPUT_LINE_POINTER points to 1st char of operand.
865 The operand may have been a register: in this case, X_op == O_register,
866 X_add_number is set to the register number, and truth is returned.
867 Input_line_pointer->(next non-blank) char after operand, or is in
868 its original state. */
870 static bfd_boolean cc_name
PARAMS ((expressionS
*));
873 cc_name (expressionP
)
874 expressionS
*expressionP
;
881 /* Find the spelling of the operand. */
882 start
= name
= input_line_pointer
;
884 c
= get_symbol_end ();
885 reg_number
= reg_name_search (cc_names
, CC_NAME_CNT
, name
, FALSE
);
887 /* Put back the delimiting char. */
888 *input_line_pointer
= c
;
890 /* Look to see if it's in the register table. */
893 expressionP
->X_op
= O_constant
;
894 expressionP
->X_add_number
= reg_number
;
896 /* Make the rest nice. */
897 expressionP
->X_add_symbol
= NULL
;
898 expressionP
->X_op_symbol
= NULL
;
904 /* Reset the line as if we had not done anything. */
905 input_line_pointer
= start
;
911 static void skip_white_space
PARAMS ((void));
916 while (*input_line_pointer
== ' '
917 || *input_line_pointer
== '\t')
918 ++input_line_pointer
;
921 /* Summary of parse_register_list ().
923 in: INPUT_LINE_POINTER points to 1st char of a list of registers.
924 INSN is the partially constructed instruction.
925 OPERAND is the operand being inserted.
927 out: NULL if the parse completed successfully, otherwise a
928 pointer to an error message is returned. If the parse
929 completes the correct bit fields in the instruction
932 Parses register lists with the syntax:
940 and also parses constant epxressions whoes bits indicate the
941 registers in the lists. The LSB in the expression refers to
942 the lowest numbered permissable register in the register list,
943 and so on upwards. System registers are considered to be very
946 static char *parse_register_list
947 PARAMS ((unsigned long *, const struct v850_operand
*));
950 parse_register_list (insn
, operand
)
952 const struct v850_operand
*operand
;
954 static int type1_regs
[32] = {
955 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
956 0, 0, 0, 0, 0, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
958 static int type2_regs
[32] = {
959 19, 18, 17, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
960 0, 0, 0, 0, 30, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
962 static int type3_regs
[32] = {
963 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
964 0, 0, 0, 0, 14, 15, 13, 12, 7, 6, 5, 4, 11, 10, 9, 8
969 /* Select a register array to parse. */
970 switch (operand
->shift
)
972 case 0xffe00001: regs
= type1_regs
; break;
973 case 0xfff8000f: regs
= type2_regs
; break;
974 case 0xfff8001f: regs
= type3_regs
; break;
976 as_bad (_("unknown operand shift: %x\n"), operand
->shift
);
977 return _("internal failure in parse_register_list");
982 /* If the expression starts with a curly brace it is a register list.
983 Otherwise it is a constant expression, whoes bits indicate which
984 registers are to be included in the list. */
985 if (*input_line_pointer
!= '{')
992 if (exp
.X_op
!= O_constant
)
993 return _("constant expression or register list expected");
995 if (regs
== type1_regs
)
997 if (exp
.X_add_number
& 0xFFFFF000)
998 return _("high bits set in register list expression");
1000 for (reg
= 20; reg
< 32; reg
++)
1001 if (exp
.X_add_number
& (1 << (reg
- 20)))
1003 for (i
= 0; i
< 32; i
++)
1008 else if (regs
== type2_regs
)
1010 if (exp
.X_add_number
& 0xFFFE0000)
1011 return _("high bits set in register list expression");
1013 for (reg
= 1; reg
< 16; reg
++)
1014 if (exp
.X_add_number
& (1 << (reg
- 1)))
1016 for (i
= 0; i
< 32; i
++)
1021 if (exp
.X_add_number
& (1 << 15))
1024 if (exp
.X_add_number
& (1 << 16))
1027 else /* regs == type3_regs */
1029 if (exp
.X_add_number
& 0xFFFE0000)
1030 return _("high bits set in register list expression");
1032 for (reg
= 16; reg
< 32; reg
++)
1033 if (exp
.X_add_number
& (1 << (reg
- 16)))
1035 for (i
= 0; i
< 32; i
++)
1040 if (exp
.X_add_number
& (1 << 16))
1047 input_line_pointer
++;
1049 /* Parse the register list until a terminator (closing curly brace or
1050 new-line) is found. */
1053 if (register_name (&exp
))
1057 /* Locate the given register in the list, and if it is there,
1058 insert the corresponding bit into the instruction. */
1059 for (i
= 0; i
< 32; i
++)
1061 if (regs
[i
] == exp
.X_add_number
)
1069 return _("illegal register included in list");
1071 else if (system_register_name (&exp
, TRUE
, TRUE
))
1073 if (regs
== type1_regs
)
1075 return _("system registers cannot be included in list");
1077 else if (exp
.X_add_number
== 5)
1079 if (regs
== type2_regs
)
1080 return _("PSW cannot be included in list");
1084 else if (exp
.X_add_number
< 4)
1087 return _("High value system registers cannot be included in list");
1089 else if (*input_line_pointer
== '}')
1091 input_line_pointer
++;
1094 else if (*input_line_pointer
== ',')
1096 input_line_pointer
++;
1099 else if (*input_line_pointer
== '-')
1101 /* We have encountered a range of registers: rX - rY. */
1105 /* Skip the dash. */
1106 ++input_line_pointer
;
1108 /* Get the second register in the range. */
1109 if (! register_name (&exp2
))
1111 return _("second register should follow dash in register list");
1112 exp2
.X_add_number
= exp
.X_add_number
;
1115 /* Add the rest of the registers in the range. */
1116 for (j
= exp
.X_add_number
+ 1; j
<= exp2
.X_add_number
; j
++)
1120 /* Locate the given register in the list, and if it is there,
1121 insert the corresponding bit into the instruction. */
1122 for (i
= 0; i
< 32; i
++)
1132 return _("illegal register included in list");
1138 skip_white_space ();
1144 const char *md_shortopts
= "m:";
1146 struct option md_longopts
[] = {
1147 {NULL
, no_argument
, NULL
, 0}
1150 size_t md_longopts_size
= sizeof (md_longopts
);
1153 md_show_usage (stream
)
1156 fprintf (stream
, _(" V850 options:\n"));
1157 fprintf (stream
, _(" -mwarn-signed-overflow Warn if signed immediate values overflow\n"));
1158 fprintf (stream
, _(" -mwarn-unsigned-overflow Warn if unsigned immediate values overflow\n"));
1159 fprintf (stream
, _(" -mv850 The code is targeted at the v850\n"));
1160 fprintf (stream
, _(" -mv850e The code is targeted at the v850e\n"));
1161 fprintf (stream
, _(" -mv850any The code is generic, despite any processor specific instructions\n"));
1162 fprintf (stream
, _(" -mrelax Enable relaxation\n"));
1167 md_parse_option (c
, arg
)
1174 /* xgettext:c-format */
1175 fprintf (stderr
, _("unknown command line option: -%c%s\n"), c
, arg
);
1179 if (strcmp (arg
, "warn-signed-overflow") == 0)
1181 warn_signed_overflows
= TRUE
;
1183 else if (strcmp (arg
, "warn-unsigned-overflow") == 0)
1185 warn_unsigned_overflows
= TRUE
;
1187 else if (strcmp (arg
, "v850") == 0)
1190 processor_mask
= PROCESSOR_V850
;
1192 else if (strcmp (arg
, "v850e") == 0)
1194 machine
= bfd_mach_v850e
;
1195 processor_mask
= PROCESSOR_V850E
;
1197 else if (strcmp (arg
, "v850any") == 0)
1199 /* Tell the world that this is for any v850 chip. */
1202 /* But support instructions for the extended versions. */
1203 processor_mask
= PROCESSOR_V850E
;
1205 else if (strcmp (arg
, "relax") == 0)
1209 /* xgettext:c-format */
1210 fprintf (stderr
, _("unknown command line option: -%c%s\n"), c
, arg
);
1218 md_undefined_symbol (name
)
1219 char *name ATTRIBUTE_UNUSED
;
1225 md_atof (type
, litp
, sizep
)
1231 LITTLENUM_TYPE words
[4];
1247 return _("bad call to md_atof");
1250 t
= atof_ieee (input_line_pointer
, type
, words
);
1252 input_line_pointer
= t
;
1256 for (i
= prec
- 1; i
>= 0; i
--)
1258 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
1268 md_convert_frag (abfd
, sec
, fragP
)
1269 bfd
*abfd ATTRIBUTE_UNUSED
;
1273 subseg_change (sec
, 0);
1275 /* In range conditional or unconditional branch. */
1276 if (fragP
->fr_subtype
== 0 || fragP
->fr_subtype
== 2)
1278 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
1279 fragP
->fr_offset
, 1, BFD_RELOC_UNUSED
+ (int)fragP
->fr_opcode
);
1282 /* Out of range conditional branch. Emit a branch around a jump. */
1283 else if (fragP
->fr_subtype
== 1)
1285 unsigned char *buffer
=
1286 (unsigned char *) (fragP
->fr_fix
+ fragP
->fr_literal
);
1288 /* Reverse the condition of the first branch. */
1290 /* Mask off all the displacement bits. */
1293 /* Now set the displacement bits so that we branch
1294 around the unconditional branch. */
1297 /* Now create the unconditional branch + fixup to the final
1299 md_number_to_chars (buffer
+ 2, 0x00000780, 4);
1300 fix_new (fragP
, fragP
->fr_fix
+ 2, 4, fragP
->fr_symbol
,
1301 fragP
->fr_offset
, 1, BFD_RELOC_UNUSED
+
1302 (int) fragP
->fr_opcode
+ 1);
1305 /* Out of range unconditional branch. Emit a jump. */
1306 else if (fragP
->fr_subtype
== 3)
1308 md_number_to_chars (fragP
->fr_fix
+ fragP
->fr_literal
, 0x00000780, 4);
1309 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
1310 fragP
->fr_offset
, 1, BFD_RELOC_UNUSED
+
1311 (int) fragP
->fr_opcode
+ 1);
1319 md_section_align (seg
, addr
)
1323 int align
= bfd_get_section_alignment (stdoutput
, seg
);
1324 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
1330 char *prev_name
= "";
1331 const struct v850_opcode
*op
;
1333 if (strncmp (TARGET_CPU
, "v850e", 5) == 0)
1336 machine
= bfd_mach_v850e
;
1338 if (processor_mask
== -1)
1339 processor_mask
= PROCESSOR_V850E
;
1341 else if (strncmp (TARGET_CPU
, "v850", 4) == 0)
1346 if (processor_mask
== -1)
1347 processor_mask
= PROCESSOR_V850
;
1350 /* xgettext:c-format */
1351 as_bad (_("Unable to determine default target processor from string: %s"),
1354 v850_hash
= hash_new ();
1356 /* Insert unique names into hash table. The V850 instruction set
1357 has many identical opcode names that have different opcodes based
1358 on the operands. This hash table then provides a quick index to
1359 the first opcode with a particular name in the opcode table. */
1363 if (strcmp (prev_name
, op
->name
))
1365 prev_name
= (char *) op
->name
;
1366 hash_insert (v850_hash
, op
->name
, (char *) op
);
1371 v850_seg_table
[BSS_SECTION
].s
= bss_section
;
1372 bfd_set_arch_mach (stdoutput
, TARGET_ARCH
, machine
);
1375 static bfd_reloc_code_real_type handle_ctoff
1376 PARAMS ((const struct v850_operand
*));
1378 static bfd_reloc_code_real_type
1379 handle_ctoff (operand
)
1380 const struct v850_operand
*operand
;
1382 if (operand
== NULL
)
1383 return BFD_RELOC_V850_CALLT_16_16_OFFSET
;
1385 if (operand
->bits
!= 6
1386 || operand
->shift
!= 0)
1388 as_bad (_("ctoff() relocation used on an instruction which does not support it"));
1389 return BFD_RELOC_64
; /* Used to indicate an error condition. */
1392 return BFD_RELOC_V850_CALLT_6_7_OFFSET
;
1395 static bfd_reloc_code_real_type handle_sdaoff
1396 PARAMS ((const struct v850_operand
*));
1398 static bfd_reloc_code_real_type
1399 handle_sdaoff (operand
)
1400 const struct v850_operand
*operand
;
1402 if (operand
== NULL
)
1403 return BFD_RELOC_V850_SDA_16_16_OFFSET
;
1405 if (operand
->bits
== 15 && operand
->shift
== 17)
1406 return BFD_RELOC_V850_SDA_15_16_OFFSET
;
1408 if (operand
->bits
== -1)
1409 return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
;
1411 if (operand
->bits
!= 16
1412 || operand
->shift
!= 16)
1414 as_bad (_("sdaoff() relocation used on an instruction which does not support it"));
1415 return BFD_RELOC_64
; /* Used to indicate an error condition. */
1418 return BFD_RELOC_V850_SDA_16_16_OFFSET
;
1421 static bfd_reloc_code_real_type handle_zdaoff
1422 PARAMS ((const struct v850_operand
*));
1424 static bfd_reloc_code_real_type
1425 handle_zdaoff (operand
)
1426 const struct v850_operand
*operand
;
1428 if (operand
== NULL
)
1429 return BFD_RELOC_V850_ZDA_16_16_OFFSET
;
1431 if (operand
->bits
== 15 && operand
->shift
== 17)
1432 return BFD_RELOC_V850_ZDA_15_16_OFFSET
;
1434 if (operand
->bits
== -1)
1435 return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
;
1437 if (operand
->bits
!= 16
1438 || operand
->shift
!= 16)
1440 as_bad (_("zdaoff() relocation used on an instruction which does not support it"));
1441 /* Used to indicate an error condition. */
1442 return BFD_RELOC_64
;
1445 return BFD_RELOC_V850_ZDA_16_16_OFFSET
;
1448 static bfd_reloc_code_real_type handle_tdaoff
1449 PARAMS ((const struct v850_operand
*));
1451 static bfd_reloc_code_real_type
1452 handle_tdaoff (operand
)
1453 const struct v850_operand
*operand
;
1455 if (operand
== NULL
)
1456 /* Data item, not an instruction. */
1457 return BFD_RELOC_V850_TDA_7_7_OFFSET
;
1459 if (operand
->bits
== 6 && operand
->shift
== 1)
1460 /* sld.w/sst.w, operand: D8_6 */
1461 return BFD_RELOC_V850_TDA_6_8_OFFSET
;
1463 if (operand
->bits
== 4 && operand
->insert
!= NULL
)
1464 /* sld.hu, operand: D5-4 */
1465 return BFD_RELOC_V850_TDA_4_5_OFFSET
;
1467 if (operand
->bits
== 4 && operand
->insert
== NULL
)
1468 /* sld.bu, operand: D4 */
1469 return BFD_RELOC_V850_TDA_4_4_OFFSET
;
1471 if (operand
->bits
== 16 && operand
->shift
== 16)
1472 /* set1 & chums, operands: D16 */
1473 return BFD_RELOC_V850_TDA_16_16_OFFSET
;
1475 if (operand
->bits
!= 7)
1477 as_bad (_("tdaoff() relocation used on an instruction which does not support it"));
1478 /* Used to indicate an error condition. */
1479 return BFD_RELOC_64
;
1482 return operand
->insert
!= NULL
1483 ? BFD_RELOC_V850_TDA_7_8_OFFSET
/* sld.h/sst.h, operand: D8_7 */
1484 : BFD_RELOC_V850_TDA_7_7_OFFSET
; /* sld.b/sst.b, opreand: D7 */
1487 /* Warning: The code in this function relies upon the definitions
1488 in the v850_operands[] array (defined in opcodes/v850-opc.c)
1489 matching the hard coded values contained herein. */
1491 static bfd_reloc_code_real_type v850_reloc_prefix
1492 PARAMS ((const struct v850_operand
*));
1494 static bfd_reloc_code_real_type
1495 v850_reloc_prefix (operand
)
1496 const struct v850_operand
*operand
;
1498 bfd_boolean paren_skipped
= FALSE
;
1500 /* Skip leading opening parenthesis. */
1501 if (*input_line_pointer
== '(')
1503 ++input_line_pointer
;
1504 paren_skipped
= TRUE
;
1507 #define CHECK_(name, reloc) \
1508 if (strncmp (input_line_pointer, name "(", strlen (name) + 1) == 0) \
1510 input_line_pointer += strlen (name); \
1514 CHECK_ ("hi0", BFD_RELOC_HI16
);
1515 CHECK_ ("hi", BFD_RELOC_HI16_S
);
1516 CHECK_ ("lo", BFD_RELOC_LO16
);
1517 CHECK_ ("sdaoff", handle_sdaoff (operand
));
1518 CHECK_ ("zdaoff", handle_zdaoff (operand
));
1519 CHECK_ ("tdaoff", handle_tdaoff (operand
));
1520 CHECK_ ("hilo", BFD_RELOC_32
);
1521 CHECK_ ("ctoff", handle_ctoff (operand
) );
1523 /* Restore skipped parenthesis. */
1525 --input_line_pointer
;
1527 return BFD_RELOC_UNUSED
;
1530 /* Insert an operand value into an instruction. */
1532 static unsigned long v850_insert_operand
1533 PARAMS ((unsigned long, const struct v850_operand
*, offsetT
, char *,
1534 unsigned int, char *));
1536 static unsigned long
1537 v850_insert_operand (insn
, operand
, val
, file
, line
, str
)
1539 const struct v850_operand
*operand
;
1545 if (operand
->insert
)
1547 const char *message
= NULL
;
1549 insn
= operand
->insert (insn
, val
, &message
);
1550 if (message
!= NULL
)
1552 if ((operand
->flags
& V850_OPERAND_SIGNED
)
1553 && ! warn_signed_overflows
1554 && strstr (message
, "out of range") != NULL
)
1556 /* Skip warning... */
1558 else if ((operand
->flags
& V850_OPERAND_SIGNED
) == 0
1559 && ! warn_unsigned_overflows
1560 && strstr (message
, "out of range") != NULL
)
1562 /* Skip warning... */
1566 if (file
== (char *) NULL
)
1567 as_warn ("%s: %s", str
, message
);
1569 as_warn_where (file
, line
, "%s: %s", str
, message
);
1573 if (file
== (char *) NULL
)
1576 as_warn_where (file
, line
, message
);
1582 if (operand
->bits
!= 32)
1586 if ((operand
->flags
& V850_OPERAND_SIGNED
) != 0)
1588 if (! warn_signed_overflows
)
1589 max
= (1 << operand
->bits
) - 1;
1591 max
= (1 << (operand
->bits
- 1)) - 1;
1593 min
= -(1 << (operand
->bits
- 1));
1597 max
= (1 << operand
->bits
) - 1;
1599 if (! warn_unsigned_overflows
)
1600 min
= -(1 << (operand
->bits
- 1));
1605 if (val
< (offsetT
) min
|| val
> (offsetT
) max
)
1607 /* xgettext:c-format */
1609 _("operand out of range (%s not between %ld and %ld)");
1612 /* Restore min and mix to expected values for decimal ranges. */
1613 if ((operand
->flags
& V850_OPERAND_SIGNED
)
1614 && ! warn_signed_overflows
)
1615 max
= (1 << (operand
->bits
- 1)) - 1;
1617 if (! (operand
->flags
& V850_OPERAND_SIGNED
)
1618 && ! warn_unsigned_overflows
)
1623 sprintf (buf
, "%s: ", str
);
1625 sprint_value (buf
+ strlen (buf
), val
);
1628 sprint_value (buf
, val
);
1630 if (file
== (char *) NULL
)
1631 as_warn (err
, buf
, min
, max
);
1633 as_warn_where (file
, line
, err
, buf
, min
, max
);
1637 insn
|= (((long) val
& ((1 << operand
->bits
) - 1)) << operand
->shift
);
1643 static char copy_of_instruction
[128];
1650 char *start_of_operands
;
1651 struct v850_opcode
*opcode
;
1652 struct v850_opcode
*next_opcode
;
1653 const unsigned char *opindex_ptr
;
1657 unsigned long insn_size
;
1661 bfd_boolean extra_data_after_insn
= FALSE
;
1662 unsigned extra_data_len
= 0;
1663 unsigned long extra_data
= 0;
1664 char *saved_input_line_pointer
;
1666 strncpy (copy_of_instruction
, str
, sizeof (copy_of_instruction
) - 1);
1668 /* Get the opcode. */
1669 for (s
= str
; *s
!= '\0' && ! ISSPACE (*s
); s
++)
1675 /* Find the first opcode with the proper name. */
1676 opcode
= (struct v850_opcode
*) hash_find (v850_hash
, str
);
1679 /* xgettext:c-format */
1680 as_bad (_("Unrecognized opcode: `%s'"), str
);
1681 ignore_rest_of_line ();
1686 while (ISSPACE (*str
))
1689 start_of_operands
= str
;
1691 saved_input_line_pointer
= input_line_pointer
;
1695 const char *errmsg
= NULL
;
1699 if ((opcode
->processors
& processor_mask
) == 0)
1701 errmsg
= _("Target processor does not support this instruction.");
1708 insn
= opcode
->opcode
;
1709 extra_data_after_insn
= FALSE
;
1711 input_line_pointer
= str
= start_of_operands
;
1713 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1715 const struct v850_operand
*operand
;
1718 bfd_reloc_code_real_type reloc
;
1720 if (next_opindex
== 0)
1722 operand
= &v850_operands
[*opindex_ptr
];
1726 operand
= &v850_operands
[next_opindex
];
1732 while (*str
== ' ' || *str
== ',' || *str
== '[' || *str
== ']')
1735 if (operand
->flags
& V850_OPERAND_RELAX
)
1738 /* Gather the operand. */
1739 hold
= input_line_pointer
;
1740 input_line_pointer
= str
;
1742 /* lo(), hi(), hi0(), etc... */
1743 if ((reloc
= v850_reloc_prefix (operand
)) != BFD_RELOC_UNUSED
)
1745 /* This is a fake reloc, used to indicate an error condition. */
1746 if (reloc
== BFD_RELOC_64
)
1754 if (ex
.X_op
== O_constant
)
1758 case BFD_RELOC_V850_ZDA_16_16_OFFSET
:
1759 /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
1763 case BFD_RELOC_LO16
:
1765 /* Truncate, then sign extend the value. */
1766 ex
.X_add_number
= SEXT16 (ex
.X_add_number
);
1770 case BFD_RELOC_HI16
:
1772 /* Truncate, then sign extend the value. */
1773 ex
.X_add_number
= SEXT16 (ex
.X_add_number
>> 16);
1777 case BFD_RELOC_HI16_S
:
1779 /* Truncate, then sign extend the value. */
1780 int temp
= (ex
.X_add_number
>> 16) & 0xffff;
1782 temp
+= (ex
.X_add_number
>> 15) & 1;
1784 ex
.X_add_number
= SEXT16 (temp
);
1789 if ((operand
->flags
& V850E_IMMEDIATE32
) == 0)
1791 errmsg
= _("immediate operand is too large");
1795 extra_data_after_insn
= TRUE
;
1801 fprintf (stderr
, "reloc: %d\n", reloc
);
1802 as_bad (_("AAARG -> unhandled constant reloc"));
1806 if (fc
> MAX_INSN_FIXUPS
)
1807 as_fatal (_("too many fixups"));
1809 fixups
[fc
].exp
= ex
;
1810 fixups
[fc
].opindex
= *opindex_ptr
;
1811 fixups
[fc
].reloc
= reloc
;
1816 if (reloc
== BFD_RELOC_32
)
1818 if ((operand
->flags
& V850E_IMMEDIATE32
) == 0)
1820 errmsg
= _("immediate operand is too large");
1824 extra_data_after_insn
= TRUE
;
1826 extra_data
= ex
.X_add_number
;
1829 if (fc
> MAX_INSN_FIXUPS
)
1830 as_fatal (_("too many fixups"));
1832 fixups
[fc
].exp
= ex
;
1833 fixups
[fc
].opindex
= *opindex_ptr
;
1834 fixups
[fc
].reloc
= reloc
;
1842 if ((operand
->flags
& V850_OPERAND_REG
) != 0)
1844 if (!register_name (&ex
))
1846 errmsg
= _("invalid register name");
1848 else if ((operand
->flags
& V850_NOT_R0
)
1849 && ex
.X_add_number
== 0)
1851 errmsg
= _("register r0 cannot be used here");
1853 /* Force an error message to be generated by
1854 skipping over any following potential matches
1859 else if ((operand
->flags
& V850_OPERAND_SRG
) != 0)
1861 if (!system_register_name (&ex
, TRUE
, FALSE
))
1863 errmsg
= _("invalid system register name");
1866 else if ((operand
->flags
& V850_OPERAND_EP
) != 0)
1868 char *start
= input_line_pointer
;
1869 char c
= get_symbol_end ();
1871 if (strcmp (start
, "ep") != 0 && strcmp (start
, "r30") != 0)
1873 /* Put things back the way we found them. */
1874 *input_line_pointer
= c
;
1875 input_line_pointer
= start
;
1876 errmsg
= _("expected EP register");
1880 *input_line_pointer
= c
;
1881 str
= input_line_pointer
;
1882 input_line_pointer
= hold
;
1884 while (*str
== ' ' || *str
== ','
1885 || *str
== '[' || *str
== ']')
1889 else if ((operand
->flags
& V850_OPERAND_CC
) != 0)
1893 errmsg
= _("invalid condition code name");
1896 else if (operand
->flags
& V850E_PUSH_POP
)
1898 errmsg
= parse_register_list (&insn
, operand
);
1900 /* The parse_register_list() function has already done
1901 everything, so fake a dummy expression. */
1902 ex
.X_op
= O_constant
;
1903 ex
.X_add_number
= 0;
1905 else if (operand
->flags
& V850E_IMMEDIATE16
)
1909 if (ex
.X_op
!= O_constant
)
1910 errmsg
= _("constant expression expected");
1911 else if (ex
.X_add_number
& 0xffff0000)
1913 if (ex
.X_add_number
& 0xffff)
1914 errmsg
= _("constant too big to fit into instruction");
1915 else if ((insn
& 0x001fffc0) == 0x00130780)
1916 ex
.X_add_number
>>= 16;
1918 errmsg
= _("constant too big to fit into instruction");
1921 extra_data_after_insn
= TRUE
;
1923 extra_data
= ex
.X_add_number
;
1924 ex
.X_add_number
= 0;
1926 else if (operand
->flags
& V850E_IMMEDIATE32
)
1930 if (ex
.X_op
!= O_constant
)
1931 errmsg
= _("constant expression expected");
1933 extra_data_after_insn
= TRUE
;
1935 extra_data
= ex
.X_add_number
;
1936 ex
.X_add_number
= 0;
1938 else if (register_name (&ex
)
1939 && (operand
->flags
& V850_OPERAND_REG
) == 0)
1944 /* It is possible that an alias has been defined that
1945 matches a register name. For example the code may
1946 include a ".set ZERO, 0" directive, which matches
1947 the register name "zero". Attempt to reparse the
1948 field as an expression, and only complain if we
1949 cannot generate a constant. */
1951 input_line_pointer
= str
;
1953 c
= get_symbol_end ();
1955 if (symbol_find (str
) != NULL
)
1958 *input_line_pointer
= c
;
1959 input_line_pointer
= str
;
1963 if (ex
.X_op
!= O_constant
)
1965 /* If this register is actually occuring too early on
1966 the parsing of the instruction, (because another
1967 field is missing) then report this. */
1968 if (opindex_ptr
[1] != 0
1969 && (v850_operands
[opindex_ptr
[1]].flags
1970 & V850_OPERAND_REG
))
1971 errmsg
= _("syntax error: value is missing before the register name");
1973 errmsg
= _("syntax error: register not expected");
1975 /* If we created a symbol in the process of this
1976 test then delete it now, so that it will not
1977 be output with the real symbols... */
1979 && ex
.X_op
== O_symbol
)
1980 symbol_remove (ex
.X_add_symbol
,
1981 &symbol_rootP
, &symbol_lastP
);
1984 else if (system_register_name (&ex
, FALSE
, FALSE
)
1985 && (operand
->flags
& V850_OPERAND_SRG
) == 0)
1987 errmsg
= _("syntax error: system register not expected");
1989 else if (cc_name (&ex
)
1990 && (operand
->flags
& V850_OPERAND_CC
) == 0)
1992 errmsg
= _("syntax error: condition code not expected");
1998 If we are assembling a MOV instruction and the immediate
1999 value does not fit into the bits available then create a
2000 fake error so that the next MOV instruction will be
2001 selected. This one has a 32 bit immediate field. */
2003 if (((insn
& 0x07e0) == 0x0200)
2004 && operand
->bits
== 5 /* Do not match the CALLT instruction. */
2005 && ex
.X_op
== O_constant
2006 && (ex
.X_add_number
< (-(1 << (operand
->bits
- 1)))
2007 || ex
.X_add_number
> ((1 << (operand
->bits
- 1)) - 1)))
2008 errmsg
= _("immediate operand is too large");
2016 " insn: %x, operand %d, op: %d, add_number: %d\n",
2017 insn
, opindex_ptr
- opcode
->operands
,
2018 ex
.X_op
, ex
.X_add_number
);
2024 errmsg
= _("illegal operand");
2027 errmsg
= _("missing operand");
2031 & (V850_OPERAND_REG
| V850_OPERAND_SRG
)) == 0)
2033 errmsg
= _("invalid operand");
2036 insn
= v850_insert_operand (insn
, operand
, ex
.X_add_number
,
2038 copy_of_instruction
);
2042 insn
= v850_insert_operand (insn
, operand
, ex
.X_add_number
,
2044 copy_of_instruction
);
2048 /* We need to generate a fixup for this expression. */
2049 if (fc
>= MAX_INSN_FIXUPS
)
2050 as_fatal (_("too many fixups"));
2052 fixups
[fc
].exp
= ex
;
2053 fixups
[fc
].opindex
= *opindex_ptr
;
2054 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
2060 str
= input_line_pointer
;
2061 input_line_pointer
= hold
;
2063 while (*str
== ' ' || *str
== ',' || *str
== '[' || *str
== ']'
2072 next_opcode
= opcode
+ 1;
2073 if (next_opcode
->name
!= NULL
2074 && strcmp (next_opcode
->name
, opcode
->name
) == 0)
2076 opcode
= next_opcode
;
2078 /* Skip versions that are not supported by the target
2080 if ((opcode
->processors
& processor_mask
) == 0)
2086 as_bad ("%s: %s", copy_of_instruction
, errmsg
);
2088 if (*input_line_pointer
== ']')
2089 ++input_line_pointer
;
2091 ignore_rest_of_line ();
2092 input_line_pointer
= saved_input_line_pointer
;
2098 while (ISSPACE (*str
))
2102 /* xgettext:c-format */
2103 as_bad (_("junk at end of line: `%s'"), str
);
2105 input_line_pointer
= str
;
2107 /* Tie dwarf2 debug info to the address at the start of the insn.
2108 We can't do this after the insn has been output as the current
2109 frag may have been closed off. eg. by frag_var. */
2110 dwarf2_emit_insn (0);
2112 /* Write out the instruction. */
2114 if (relaxable
&& fc
> 0)
2119 if (!strcmp (opcode
->name
, "br"))
2121 f
= frag_var (rs_machine_dependent
, 4, 2, 2,
2122 fixups
[0].exp
.X_add_symbol
,
2123 fixups
[0].exp
.X_add_number
,
2124 (char *) fixups
[0].opindex
);
2125 md_number_to_chars (f
, insn
, insn_size
);
2126 md_number_to_chars (f
+ 2, 0, 2);
2130 f
= frag_var (rs_machine_dependent
, 6, 4, 0,
2131 fixups
[0].exp
.X_add_symbol
,
2132 fixups
[0].exp
.X_add_number
,
2133 (char *) fixups
[0].opindex
);
2134 md_number_to_chars (f
, insn
, insn_size
);
2135 md_number_to_chars (f
+ 2, 0, 4);
2140 /* Four byte insns have an opcode with the two high bits on. */
2141 if ((insn
& 0x0600) == 0x0600)
2146 /* Special case: 32 bit MOV. */
2147 if ((insn
& 0xffe0) == 0x0620)
2150 f
= frag_more (insn_size
);
2151 md_number_to_chars (f
, insn
, insn_size
);
2153 if (extra_data_after_insn
)
2155 f
= frag_more (extra_data_len
);
2156 md_number_to_chars (f
, extra_data
, extra_data_len
);
2158 extra_data_after_insn
= FALSE
;
2162 /* Create any fixups. At this point we do not use a
2163 bfd_reloc_code_real_type, but instead just use the
2164 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2165 handle fixups for any operand type, although that is admittedly
2166 not a very exciting feature. We pick a BFD reloc type in
2168 for (i
= 0; i
< fc
; i
++)
2170 const struct v850_operand
*operand
;
2171 bfd_reloc_code_real_type reloc
;
2173 operand
= &v850_operands
[fixups
[i
].opindex
];
2175 reloc
= fixups
[i
].reloc
;
2177 if (reloc
!= BFD_RELOC_UNUSED
)
2179 reloc_howto_type
*reloc_howto
=
2180 bfd_reloc_type_lookup (stdoutput
, reloc
);
2188 size
= bfd_get_reloc_size (reloc_howto
);
2190 /* XXX This will abort on an R_V850_8 reloc -
2191 is this reloc actually used? */
2192 if (size
!= 2 && size
!= 4)
2195 address
= (f
- frag_now
->fr_literal
) + insn_size
- size
;
2197 if (reloc
== BFD_RELOC_32
)
2200 fixP
= fix_new_exp (frag_now
, address
, size
,
2202 reloc_howto
->pc_relative
,
2207 case BFD_RELOC_LO16
:
2208 case BFD_RELOC_HI16
:
2209 case BFD_RELOC_HI16_S
:
2210 fixP
->fx_no_overflow
= 1;
2218 fix_new_exp (frag_now
,
2219 f
- frag_now
->fr_literal
, 4,
2221 1 /* FIXME: V850_OPERAND_RELATIVE ??? */,
2222 (bfd_reloc_code_real_type
) (fixups
[i
].opindex
2223 + (int) BFD_RELOC_UNUSED
));
2227 input_line_pointer
= saved_input_line_pointer
;
2230 /* If while processing a fixup, a reloc really needs to be created
2231 then it is done here. */
2234 tc_gen_reloc (seg
, fixp
)
2235 asection
*seg ATTRIBUTE_UNUSED
;
2240 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
2241 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
2242 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
2243 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2244 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
2246 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
2248 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2249 /* xgettext:c-format */
2250 _("reloc %d not supported by object file format"),
2251 (int) fixp
->fx_r_type
);
2258 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
2259 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
)
2260 reloc
->addend
= fixp
->fx_offset
;
2261 else if ( fixp
->fx_r_type
== BFD_RELOC_V850_LONGCALL
2262 || fixp
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
2263 || fixp
->fx_r_type
== BFD_RELOC_V850_ALIGN
)
2264 reloc
->addend
= fixp
->fx_offset
;
2266 reloc
->addend
= fixp
->fx_addnumber
;
2272 v850_handle_align (frag
)
2276 && frag
->fr_type
== rs_align
2277 && frag
->fr_address
+ frag
->fr_fix
> 0
2278 && frag
->fr_offset
> 1
2279 && now_seg
!= bss_section
2280 && now_seg
!= v850_seg_table
[SBSS_SECTION
].s
2281 && now_seg
!= v850_seg_table
[TBSS_SECTION
].s
2282 && now_seg
!= v850_seg_table
[ZBSS_SECTION
].s
)
2283 fix_new (frag
, frag
->fr_fix
, 2, & abs_symbol
, frag
->fr_offset
, 0,
2284 BFD_RELOC_V850_ALIGN
);
2287 /* Return current size of variable part of frag. */
2290 md_estimate_size_before_relax (fragp
, seg
)
2292 asection
*seg ATTRIBUTE_UNUSED
;
2294 if (fragp
->fr_subtype
>= sizeof (md_relax_table
) / sizeof (md_relax_table
[0]))
2297 return md_relax_table
[fragp
->fr_subtype
].rlx_length
;
2301 v850_pcrel_from_section (fixp
, section
)
2305 /* If the symbol is undefined, or in a section other than our own,
2306 or it is weak (in which case it may well be in another section,
2307 then let the linker figure it out. */
2308 if (fixp
->fx_addsy
!= (symbolS
*) NULL
2309 && (! S_IS_DEFINED (fixp
->fx_addsy
)
2310 || S_IS_WEAK (fixp
->fx_addsy
)
2311 || (S_GET_SEGMENT (fixp
->fx_addsy
) != section
)))
2314 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2318 md_apply_fix3 (fixP
, valueP
, seg
)
2321 segT seg ATTRIBUTE_UNUSED
;
2323 valueT value
= * valueP
;
2326 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
2327 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGCALL
2328 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
2329 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
2335 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
2336 fixP
->fx_addnumber
= value
,
2339 else if (fixP
->fx_pcrel
)
2340 fixP
->fx_addnumber
= fixP
->fx_offset
;
2344 value
= fixP
->fx_offset
;
2345 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
2347 if (S_GET_SEGMENT (fixP
->fx_subsy
) == absolute_section
)
2348 value
-= S_GET_VALUE (fixP
->fx_subsy
);
2351 /* We don't actually support subtracting a symbol. */
2352 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
2353 _("expression too complex"));
2356 fixP
->fx_addnumber
= value
;
2359 if ((int) fixP
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
2362 const struct v850_operand
*operand
;
2365 opindex
= (int) fixP
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
2366 operand
= &v850_operands
[opindex
];
2368 /* Fetch the instruction, insert the fully resolved operand
2369 value, and stuff the instruction back again.
2371 Note the instruction has been stored in little endian
2373 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
2375 insn
= bfd_getl32 ((unsigned char *) where
);
2376 insn
= v850_insert_operand (insn
, operand
, (offsetT
) value
,
2377 fixP
->fx_file
, fixP
->fx_line
, NULL
);
2378 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
2381 /* Nothing else to do here. */
2384 /* Determine a BFD reloc value based on the operand information.
2385 We are only prepared to turn a few of the operands into relocs. */
2387 if (operand
->bits
== 22)
2388 fixP
->fx_r_type
= BFD_RELOC_V850_22_PCREL
;
2389 else if (operand
->bits
== 9)
2390 fixP
->fx_r_type
= BFD_RELOC_V850_9_PCREL
;
2394 fprintf (stderr
, "bits: %d, insn: %x\n", operand
->bits
, insn
);
2397 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
2398 _("unresolved expression that must be resolved"));
2403 else if (fixP
->fx_done
)
2405 /* We still have to insert the value into memory! */
2406 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
2408 if (fixP
->fx_size
== 1)
2409 *where
= value
& 0xff;
2410 else if (fixP
->fx_size
== 2)
2411 bfd_putl16 (value
& 0xffff, (unsigned char *) where
);
2412 else if (fixP
->fx_size
== 4)
2413 bfd_putl32 (value
, (unsigned char *) where
);
2417 /* Parse a cons expression. We have to handle hi(), lo(), etc
2421 parse_cons_expression_v850 (exp
)
2424 /* See if there's a reloc prefix like hi() we have to handle. */
2425 hold_cons_reloc
= v850_reloc_prefix (NULL
);
2427 /* Do normal expression parsing. */
2431 /* Create a fixup for a cons expression. If parse_cons_expression_v850
2432 found a reloc prefix, then we use that reloc, else we choose an
2433 appropriate one based on the size of the expression. */
2436 cons_fix_new_v850 (frag
, where
, size
, exp
)
2442 if (hold_cons_reloc
== BFD_RELOC_UNUSED
)
2445 hold_cons_reloc
= BFD_RELOC_32
;
2447 hold_cons_reloc
= BFD_RELOC_16
;
2449 hold_cons_reloc
= BFD_RELOC_8
;
2453 fix_new_exp (frag
, where
, size
, exp
, 0, hold_cons_reloc
);
2455 fix_new (frag
, where
, size
, NULL
, 0, 0, hold_cons_reloc
);
2457 hold_cons_reloc
= BFD_RELOC_UNUSED
;
2461 v850_fix_adjustable (fixP
)
2464 if (fixP
->fx_addsy
== NULL
)
2467 /* Don't adjust function names. */
2468 if (S_IS_FUNCTION (fixP
->fx_addsy
))
2471 /* We need the symbol name for the VTABLE entries. */
2472 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
2473 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
2480 v850_force_relocation (fixP
)
2483 if (fixP
->fx_r_type
== BFD_RELOC_V850_LONGCALL
2484 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
)
2489 || fixP
->fx_r_type
== BFD_RELOC_V850_ALIGN
2490 || fixP
->fx_r_type
== BFD_RELOC_V850_22_PCREL
2491 || fixP
->fx_r_type
== BFD_RELOC_V850_9_PCREL
2492 || fixP
->fx_r_type
>= BFD_RELOC_UNUSED
))
2495 return generic_force_reloc (fixP
);