1 /* tc-v850.c -- Assembler code for the NEC V850
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2009 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 3, 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, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
23 #include "safe-ctype.h"
25 #include "opcode/v850.h"
26 #include "dwarf2dbg.h"
28 /* Sign-extend a 16-bit number. */
29 #define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
31 /* Temporarily holds the reloc in a cons expression. */
32 static bfd_reloc_code_real_type hold_cons_reloc
= BFD_RELOC_UNUSED
;
34 /* Set to TRUE if we want to be pedantic about signed overflows. */
35 static bfd_boolean warn_signed_overflows
= FALSE
;
36 static bfd_boolean warn_unsigned_overflows
= FALSE
;
38 /* Indicates the target BFD machine number. */
39 static int machine
= -1;
41 /* Indicates the target processor(s) for the assemble. */
42 static int processor_mask
= -1;
44 /* 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
[] =
74 /* Conditional branches. */
76 {0x1fffff, -0x200000, 6, 0},
77 /* Unconditional branches. */
79 {0x1fffff, -0x200000, 4, 0},
82 static int v850_relax
= 0;
85 #define MAX_INSN_FIXUPS 5
91 bfd_reloc_code_real_type reloc
;
94 struct v850_fixup fixups
[MAX_INSN_FIXUPS
];
104 struct v850_seg_entry v850_seg_table
[] =
107 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
110 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
112 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
114 SEC_ALLOC
| SEC_SMALL_DATA
},
120 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_DATA
121 | SEC_HAS_CONTENTS
| SEC_SMALL_DATA
},
123 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_DATA
124 | SEC_HAS_CONTENTS
},
126 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
127 | SEC_SMALL_DATA
| SEC_IS_COMMON
},
129 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
132 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
134 { NULL
, ".call_table_data",
135 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
136 { NULL
, ".call_table_text",
137 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_CODE
143 #define SDATA_SECTION 0
144 #define TDATA_SECTION 1
145 #define ZDATA_SECTION 2
146 #define SBSS_SECTION 3
147 #define TBSS_SECTION 4
148 #define ZBSS_SECTION 5
149 #define ROSDATA_SECTION 6
150 #define ROZDATA_SECTION 7
151 #define SCOMMON_SECTION 8
152 #define TCOMMON_SECTION 9
153 #define ZCOMMON_SECTION 10
154 #define CALL_TABLE_DATA_SECTION 11
155 #define CALL_TABLE_TEXT_SECTION 12
156 #define BSS_SECTION 13
159 do_v850_seg (int i
, subsegT sub
)
161 struct v850_seg_entry
*seg
= v850_seg_table
+ i
;
163 obj_elf_section_change_hook ();
166 subseg_set (seg
->s
, sub
);
169 seg
->s
= subseg_new (seg
->name
, sub
);
170 bfd_set_section_flags (stdoutput
, seg
->s
, seg
->flags
);
171 if ((seg
->flags
& SEC_LOAD
) == 0)
172 seg_info (seg
->s
)->bss
= 1;
179 subsegT sub
= get_absolute_expression ();
181 do_v850_seg (i
, sub
);
182 demand_empty_rest_of_line ();
186 v850_offset (int ignore ATTRIBUTE_UNUSED
)
189 int temp
= get_absolute_expression ();
191 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
)0, (symbolS
*)0,
192 (offsetT
) temp
, (char *) 0);
195 demand_empty_rest_of_line ();
198 /* Copied from obj_elf_common() in gas/config/obj-elf.c. */
211 name
= input_line_pointer
;
212 c
= get_symbol_end ();
214 /* Just after name is now '\0'. */
215 p
= input_line_pointer
;
220 if (*input_line_pointer
!= ',')
222 as_bad (_("Expected comma after symbol-name"));
223 ignore_rest_of_line ();
228 input_line_pointer
++;
230 if ((temp
= get_absolute_expression ()) < 0)
232 /* xgettext:c-format */
233 as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp
);
234 ignore_rest_of_line ();
240 symbolP
= symbol_find_or_make (name
);
243 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
245 as_bad (_("Ignoring attempt to re-define symbol"));
246 ignore_rest_of_line ();
250 if (S_GET_VALUE (symbolP
) != 0)
252 if (S_GET_VALUE (symbolP
) != size
)
253 /* xgettext:c-format */
254 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
255 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), size
);
258 know (symbol_get_frag (symbolP
) == &zero_address_frag
);
260 if (*input_line_pointer
!= ',')
265 input_line_pointer
++;
269 if (! have_align
|| *input_line_pointer
!= '"')
275 temp
= get_absolute_expression ();
280 as_warn (_("Common alignment negative; 0 assumed"));
284 if (symbol_get_obj (symbolP
)->local
)
293 old_subsec
= now_subseg
;
295 applicable
= bfd_applicable_section_flags (stdoutput
);
297 applicable
&= SEC_ALLOC
;
301 case SCOMMON_SECTION
:
302 do_v850_seg (SBSS_SECTION
, 0);
305 case ZCOMMON_SECTION
:
306 do_v850_seg (ZBSS_SECTION
, 0);
309 case TCOMMON_SECTION
:
310 do_v850_seg (TBSS_SECTION
, 0);
316 /* Convert to a power of 2 alignment. */
317 for (align
= 0; (temp
& 1) == 0; temp
>>= 1, ++align
)
322 as_bad (_("Common alignment not a power of 2"));
323 ignore_rest_of_line ();
330 record_alignment (now_seg
, align
);
333 frag_align (align
, 0, 0);
337 case SCOMMON_SECTION
:
338 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[SBSS_SECTION
].s
)
339 symbol_get_frag (symbolP
)->fr_symbol
= 0;
342 case ZCOMMON_SECTION
:
343 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[ZBSS_SECTION
].s
)
344 symbol_get_frag (symbolP
)->fr_symbol
= 0;
347 case TCOMMON_SECTION
:
348 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[TBSS_SECTION
].s
)
349 symbol_get_frag (symbolP
)->fr_symbol
= 0;
356 symbol_set_frag (symbolP
, frag_now
);
357 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
358 (offsetT
) size
, (char *) 0);
360 S_SET_SIZE (symbolP
, size
);
364 case SCOMMON_SECTION
:
365 S_SET_SEGMENT (symbolP
, v850_seg_table
[SBSS_SECTION
].s
);
368 case ZCOMMON_SECTION
:
369 S_SET_SEGMENT (symbolP
, v850_seg_table
[ZBSS_SECTION
].s
);
372 case TCOMMON_SECTION
:
373 S_SET_SEGMENT (symbolP
, v850_seg_table
[TBSS_SECTION
].s
);
380 S_CLEAR_EXTERNAL (symbolP
);
381 obj_elf_section_change_hook ();
382 subseg_set (old_sec
, old_subsec
);
391 old_subsec
= now_subseg
;
393 S_SET_VALUE (symbolP
, (valueT
) size
);
394 S_SET_ALIGN (symbolP
, temp
);
395 S_SET_EXTERNAL (symbolP
);
399 case SCOMMON_SECTION
:
400 case ZCOMMON_SECTION
:
401 case TCOMMON_SECTION
:
402 do_v850_seg (area
, 0);
403 S_SET_SEGMENT (symbolP
, v850_seg_table
[area
].s
);
410 obj_elf_section_change_hook ();
411 subseg_set (old_sec
, old_subsec
);
416 input_line_pointer
++;
418 /* @@ Some use the dot, some don't. Can we get some consistency?? */
419 if (*input_line_pointer
== '.')
420 input_line_pointer
++;
422 /* @@ Some say data, some say bss. */
423 if (strncmp (input_line_pointer
, "bss\"", 4)
424 && strncmp (input_line_pointer
, "data\"", 5))
426 while (*--input_line_pointer
!= '"')
428 input_line_pointer
--;
429 goto bad_common_segment
;
432 while (*input_line_pointer
++ != '"')
435 goto allocate_common
;
438 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
440 demand_empty_rest_of_line ();
445 p
= input_line_pointer
;
446 while (*p
&& *p
!= '\n')
450 as_bad (_("bad .common segment %s"), input_line_pointer
+ 1);
452 input_line_pointer
= p
;
453 ignore_rest_of_line ();
459 set_machine (int number
)
462 bfd_set_arch_mach (stdoutput
, TARGET_ARCH
, machine
);
466 case 0: processor_mask
= PROCESSOR_V850
; break;
467 case bfd_mach_v850e
: processor_mask
= PROCESSOR_V850E
; break;
468 case bfd_mach_v850e1
: processor_mask
= PROCESSOR_V850E
; break;
473 v850_longcode (int type
)
480 as_warn (_(".longcall pseudo-op seen when not relaxing"));
482 as_warn (_(".longjump pseudo-op seen when not relaxing"));
487 if (ex
.X_op
!= O_symbol
|| ex
.X_add_number
!= 0)
489 as_bad (_("bad .longcall format"));
490 ignore_rest_of_line ();
496 fix_new_exp (frag_now
, frag_now_fix (), 4, & ex
, 1,
497 BFD_RELOC_V850_LONGCALL
);
499 fix_new_exp (frag_now
, frag_now_fix (), 4, & ex
, 1,
500 BFD_RELOC_V850_LONGJUMP
);
502 demand_empty_rest_of_line ();
505 /* The target specific pseudo-ops which we support. */
506 const pseudo_typeS md_pseudo_table
[] =
508 { "sdata", v850_seg
, SDATA_SECTION
},
509 { "tdata", v850_seg
, TDATA_SECTION
},
510 { "zdata", v850_seg
, ZDATA_SECTION
},
511 { "sbss", v850_seg
, SBSS_SECTION
},
512 { "tbss", v850_seg
, TBSS_SECTION
},
513 { "zbss", v850_seg
, ZBSS_SECTION
},
514 { "rosdata", v850_seg
, ROSDATA_SECTION
},
515 { "rozdata", v850_seg
, ROZDATA_SECTION
},
516 { "bss", v850_seg
, BSS_SECTION
},
517 { "offset", v850_offset
, 0 },
519 { "zcomm", v850_comm
, ZCOMMON_SECTION
},
520 { "scomm", v850_comm
, SCOMMON_SECTION
},
521 { "tcomm", v850_comm
, TCOMMON_SECTION
},
522 { "v850", set_machine
, 0 },
523 { "call_table_data", v850_seg
, CALL_TABLE_DATA_SECTION
},
524 { "call_table_text", v850_seg
, CALL_TABLE_TEXT_SECTION
},
525 { "v850e", set_machine
, bfd_mach_v850e
},
526 { "v850e1", set_machine
, bfd_mach_v850e1
},
527 { "longcall", v850_longcode
, 1 },
528 { "longjump", v850_longcode
, 2 },
532 /* Opcode hash table. */
533 static struct hash_control
*v850_hash
;
535 /* This table is sorted. Suitable for searching by a binary search. */
536 static const struct reg_name pre_defined_registers
[] =
538 { "ep", 30 }, /* ep - element ptr. */
539 { "gp", 4 }, /* gp - global ptr. */
540 { "hp", 2 }, /* hp - handler stack ptr. */
541 { "lp", 31 }, /* lp - link ptr. */
574 { "sp", 3 }, /* sp - stack ptr. */
575 { "tp", 5 }, /* tp - text ptr. */
579 #define REG_NAME_CNT \
580 (sizeof (pre_defined_registers) / sizeof (struct reg_name))
582 static const struct reg_name system_registers
[] =
604 #define SYSREG_NAME_CNT \
605 (sizeof (system_registers) / sizeof (struct reg_name))
607 static const struct reg_name system_list_registers
[] =
613 #define SYSREGLIST_NAME_CNT \
614 (sizeof (system_list_registers) / sizeof (struct reg_name))
616 static const struct reg_name cc_names
[] =
642 #define CC_NAME_CNT \
643 (sizeof (cc_names) / sizeof (struct reg_name))
645 /* Do a binary search of the given register table to see if NAME is a
646 valid regiter name. Return the register number from the array on
647 success, or -1 on failure. */
650 reg_name_search (const struct reg_name
*regs
,
653 bfd_boolean accept_numbers
)
655 int middle
, low
, high
;
659 /* If the register name is a symbol, then evaluate it. */
660 if ((symbolP
= symbol_find (name
)) != NULL
)
662 /* If the symbol is an alias for another name then use that.
663 If the symbol is an alias for a number, then return the number. */
664 if (symbol_equated_p (symbolP
))
666 = S_GET_NAME (symbol_get_value_expression (symbolP
)->X_add_symbol
);
667 else if (accept_numbers
)
669 int reg
= S_GET_VALUE (symbolP
);
671 if (reg
>= 0 && reg
<= 31)
675 /* Otherwise drop through and try parsing name normally. */
683 middle
= (low
+ high
) / 2;
684 cmp
= strcasecmp (name
, regs
[middle
].name
);
690 return regs
[middle
].value
;
696 /* Summary of register_name().
698 in: Input_line_pointer points to 1st char of operand.
701 The operand may have been a register: in this case, X_op == O_register,
702 X_add_number is set to the register number, and truth is returned.
703 Input_line_pointer->(next non-blank) char after operand, or is in
704 its original state. */
707 register_name (expressionS
*expressionP
)
714 /* Find the spelling of the operand. */
715 start
= name
= input_line_pointer
;
717 c
= get_symbol_end ();
719 reg_number
= reg_name_search (pre_defined_registers
, REG_NAME_CNT
,
722 /* Put back the delimiting char. */
723 *input_line_pointer
= c
;
725 /* Look to see if it's in the register table. */
728 expressionP
->X_op
= O_register
;
729 expressionP
->X_add_number
= reg_number
;
731 /* Make the rest nice. */
732 expressionP
->X_add_symbol
= NULL
;
733 expressionP
->X_op_symbol
= NULL
;
739 /* Reset the line as if we had not done anything. */
740 input_line_pointer
= start
;
746 /* Summary of system_register_name().
748 in: INPUT_LINE_POINTER points to 1st char of operand.
749 EXPRESSIONP points to an expression structure to be filled in.
750 ACCEPT_NUMBERS is true iff numerical register names may be used.
751 ACCEPT_LIST_NAMES is true iff the special names PS and SR may be
754 out: An expressionS structure in expressionP.
755 The operand may have been a register: in this case, X_op == O_register,
756 X_add_number is set to the register number, and truth is returned.
757 Input_line_pointer->(next non-blank) char after operand, or is in
758 its original state. */
761 system_register_name (expressionS
*expressionP
,
762 bfd_boolean accept_numbers
,
763 bfd_boolean accept_list_names
)
770 /* Find the spelling of the operand. */
771 start
= name
= input_line_pointer
;
773 c
= get_symbol_end ();
774 reg_number
= reg_name_search (system_registers
, SYSREG_NAME_CNT
, name
,
777 /* Put back the delimiting char. */
778 *input_line_pointer
= c
;
783 /* Reset input_line pointer. */
784 input_line_pointer
= start
;
786 if (ISDIGIT (*input_line_pointer
))
788 reg_number
= strtol (input_line_pointer
, &input_line_pointer
, 10);
790 /* Make sure that the register number is allowable. */
792 || (reg_number
> 5 && reg_number
< 16)
796 else if (accept_list_names
)
798 c
= get_symbol_end ();
799 reg_number
= reg_name_search (system_list_registers
,
800 SYSREGLIST_NAME_CNT
, name
, FALSE
);
802 /* Put back the delimiting char. */
803 *input_line_pointer
= c
;
807 /* Look to see if it's in the register table. */
810 expressionP
->X_op
= O_register
;
811 expressionP
->X_add_number
= reg_number
;
813 /* Make the rest nice. */
814 expressionP
->X_add_symbol
= NULL
;
815 expressionP
->X_op_symbol
= NULL
;
821 /* Reset the line as if we had not done anything. */
822 input_line_pointer
= start
;
828 /* Summary of cc_name().
830 in: INPUT_LINE_POINTER points to 1st char of operand.
833 The operand may have been a register: in this case, X_op == O_register,
834 X_add_number is set to the register number, and truth is returned.
835 Input_line_pointer->(next non-blank) char after operand, or is in
836 its original state. */
839 cc_name (expressionS
*expressionP
)
846 /* Find the spelling of the operand. */
847 start
= name
= input_line_pointer
;
849 c
= get_symbol_end ();
850 reg_number
= reg_name_search (cc_names
, CC_NAME_CNT
, name
, FALSE
);
852 /* Put back the delimiting char. */
853 *input_line_pointer
= c
;
855 /* Look to see if it's in the register table. */
858 expressionP
->X_op
= O_constant
;
859 expressionP
->X_add_number
= reg_number
;
861 /* Make the rest nice. */
862 expressionP
->X_add_symbol
= NULL
;
863 expressionP
->X_op_symbol
= NULL
;
869 /* Reset the line as if we had not done anything. */
870 input_line_pointer
= start
;
877 skip_white_space (void)
879 while (*input_line_pointer
== ' '
880 || *input_line_pointer
== '\t')
881 ++input_line_pointer
;
884 /* Summary of parse_register_list ().
886 in: INPUT_LINE_POINTER points to 1st char of a list of registers.
887 INSN is the partially constructed instruction.
888 OPERAND is the operand being inserted.
890 out: NULL if the parse completed successfully, otherwise a
891 pointer to an error message is returned. If the parse
892 completes the correct bit fields in the instruction
895 Parses register lists with the syntax:
903 and also parses constant expressions whoes bits indicate the
904 registers in the lists. The LSB in the expression refers to
905 the lowest numbered permissible register in the register list,
906 and so on upwards. System registers are considered to be very
910 parse_register_list (unsigned long *insn
,
911 const struct v850_operand
*operand
)
913 static int type1_regs
[32] =
915 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
916 0, 0, 0, 0, 0, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
918 static int type2_regs
[32] =
920 19, 18, 17, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
921 0, 0, 0, 0, 30, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
923 static int type3_regs
[32] =
925 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
926 0, 0, 0, 0, 14, 15, 13, 12, 7, 6, 5, 4, 11, 10, 9, 8
931 /* Select a register array to parse. */
932 switch (operand
->shift
)
934 case 0xffe00001: regs
= type1_regs
; break;
935 case 0xfff8000f: regs
= type2_regs
; break;
936 case 0xfff8001f: regs
= type3_regs
; break;
938 as_bad (_("unknown operand shift: %x\n"), operand
->shift
);
939 return _("internal failure in parse_register_list");
944 /* If the expression starts with a curly brace it is a register list.
945 Otherwise it is a constant expression, whoes bits indicate which
946 registers are to be included in the list. */
947 if (*input_line_pointer
!= '{')
954 if (exp
.X_op
!= O_constant
)
955 return _("constant expression or register list expected");
957 if (regs
== type1_regs
)
959 if (exp
.X_add_number
& 0xFFFFF000)
960 return _("high bits set in register list expression");
962 for (reg
= 20; reg
< 32; reg
++)
963 if (exp
.X_add_number
& (1 << (reg
- 20)))
965 for (i
= 0; i
< 32; i
++)
970 else if (regs
== type2_regs
)
972 if (exp
.X_add_number
& 0xFFFE0000)
973 return _("high bits set in register list expression");
975 for (reg
= 1; reg
< 16; reg
++)
976 if (exp
.X_add_number
& (1 << (reg
- 1)))
978 for (i
= 0; i
< 32; i
++)
983 if (exp
.X_add_number
& (1 << 15))
986 if (exp
.X_add_number
& (1 << 16))
989 else /* regs == type3_regs */
991 if (exp
.X_add_number
& 0xFFFE0000)
992 return _("high bits set in register list expression");
994 for (reg
= 16; reg
< 32; reg
++)
995 if (exp
.X_add_number
& (1 << (reg
- 16)))
997 for (i
= 0; i
< 32; i
++)
1002 if (exp
.X_add_number
& (1 << 16))
1009 input_line_pointer
++;
1011 /* Parse the register list until a terminator (closing curly brace or
1012 new-line) is found. */
1015 if (register_name (&exp
))
1019 /* Locate the given register in the list, and if it is there,
1020 insert the corresponding bit into the instruction. */
1021 for (i
= 0; i
< 32; i
++)
1023 if (regs
[i
] == exp
.X_add_number
)
1031 return _("illegal register included in list");
1033 else if (system_register_name (&exp
, TRUE
, TRUE
))
1035 if (regs
== type1_regs
)
1037 return _("system registers cannot be included in list");
1039 else if (exp
.X_add_number
== 5)
1041 if (regs
== type2_regs
)
1042 return _("PSW cannot be included in list");
1046 else if (exp
.X_add_number
< 4)
1049 return _("High value system registers cannot be included in list");
1051 else if (*input_line_pointer
== '}')
1053 input_line_pointer
++;
1056 else if (*input_line_pointer
== ',')
1058 input_line_pointer
++;
1061 else if (*input_line_pointer
== '-')
1063 /* We have encountered a range of registers: rX - rY. */
1067 /* Skip the dash. */
1068 ++input_line_pointer
;
1070 /* Get the second register in the range. */
1071 if (! register_name (&exp2
))
1073 return _("second register should follow dash in register list");
1074 exp2
.X_add_number
= exp
.X_add_number
;
1077 /* Add the rest of the registers in the range. */
1078 for (j
= exp
.X_add_number
+ 1; j
<= exp2
.X_add_number
; j
++)
1082 /* Locate the given register in the list, and if it is there,
1083 insert the corresponding bit into the instruction. */
1084 for (i
= 0; i
< 32; i
++)
1094 return _("illegal register included in list");
1100 skip_white_space ();
1106 const char *md_shortopts
= "m:";
1108 struct option md_longopts
[] =
1110 {NULL
, no_argument
, NULL
, 0}
1113 size_t md_longopts_size
= sizeof (md_longopts
);
1116 md_show_usage (FILE *stream
)
1118 fprintf (stream
, _(" V850 options:\n"));
1119 fprintf (stream
, _(" -mwarn-signed-overflow Warn if signed immediate values overflow\n"));
1120 fprintf (stream
, _(" -mwarn-unsigned-overflow Warn if unsigned immediate values overflow\n"));
1121 fprintf (stream
, _(" -mv850 The code is targeted at the v850\n"));
1122 fprintf (stream
, _(" -mv850e The code is targeted at the v850e\n"));
1123 fprintf (stream
, _(" -mv850e1 The code is targeted at the v850e1\n"));
1124 fprintf (stream
, _(" -mv850any The code is generic, despite any processor specific instructions\n"));
1125 fprintf (stream
, _(" -mrelax Enable relaxation\n"));
1129 md_parse_option (int c
, char *arg
)
1134 if (strcmp (arg
, "warn-signed-overflow") == 0)
1135 warn_signed_overflows
= TRUE
;
1137 else if (strcmp (arg
, "warn-unsigned-overflow") == 0)
1138 warn_unsigned_overflows
= TRUE
;
1140 else if (strcmp (arg
, "v850") == 0)
1143 processor_mask
= PROCESSOR_V850
;
1145 else if (strcmp (arg
, "v850e") == 0)
1147 machine
= bfd_mach_v850e
;
1148 processor_mask
= PROCESSOR_V850E
;
1150 else if (strcmp (arg
, "v850e1") == 0)
1152 machine
= bfd_mach_v850e1
;
1153 processor_mask
= PROCESSOR_V850E1
;
1155 else if (strcmp (arg
, "v850any") == 0)
1157 /* Tell the world that this is for any v850 chip. */
1160 /* But support instructions for the extended versions. */
1161 processor_mask
= PROCESSOR_V850E
;
1162 processor_mask
|= PROCESSOR_V850E1
;
1164 else if (strcmp (arg
, "relax") == 0)
1173 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
1179 md_atof (int type
, char *litp
, int *sizep
)
1181 return ieee_md_atof (type
, litp
, sizep
, FALSE
);
1187 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
1191 /* This code performs some nasty type punning between the
1192 fr_opcode field of the frag structure (a char *) and the
1193 fx_r_type field of the fix structure (a bfd_reloc_code_real_type)
1194 On a 64bit host this causes problems because these two fields
1195 are not the same size, but since we know that we are only
1196 ever storing small integers in the fields, it is safe to use
1197 a union to convert between them. */
1200 bfd_reloc_code_real_type fx_r_type
;
1204 subseg_change (sec
, 0);
1206 opcode_converter
.fr_opcode
= fragP
->fr_opcode
;
1208 /* In range conditional or unconditional branch. */
1209 if (fragP
->fr_subtype
== 0 || fragP
->fr_subtype
== 2)
1211 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
1212 fragP
->fr_offset
, 1,
1213 BFD_RELOC_UNUSED
+ opcode_converter
.fx_r_type
);
1216 /* Out of range conditional branch. Emit a branch around a jump. */
1217 else if (fragP
->fr_subtype
== 1)
1219 unsigned char *buffer
=
1220 (unsigned char *) (fragP
->fr_fix
+ fragP
->fr_literal
);
1222 /* Reverse the condition of the first branch. */
1224 /* Mask off all the displacement bits. */
1227 /* Now set the displacement bits so that we branch
1228 around the unconditional branch. */
1231 /* Now create the unconditional branch + fixup to the final
1233 md_number_to_chars ((char *) buffer
+ 2, 0x00000780, 4);
1234 fix_new (fragP
, fragP
->fr_fix
+ 2, 4, fragP
->fr_symbol
,
1235 fragP
->fr_offset
, 1,
1236 BFD_RELOC_UNUSED
+ opcode_converter
.fx_r_type
+ 1);
1239 /* Out of range unconditional branch. Emit a jump. */
1240 else if (fragP
->fr_subtype
== 3)
1242 md_number_to_chars (fragP
->fr_fix
+ fragP
->fr_literal
, 0x00000780, 4);
1243 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
1244 fragP
->fr_offset
, 1,
1245 BFD_RELOC_UNUSED
+ opcode_converter
.fx_r_type
+ 1);
1253 md_section_align (asection
*seg
, valueT addr
)
1255 int align
= bfd_get_section_alignment (stdoutput
, seg
);
1256 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
1262 char *prev_name
= "";
1263 const struct v850_opcode
*op
;
1265 if (strncmp (TARGET_CPU
, "v850e1", 6) == 0)
1268 machine
= bfd_mach_v850e1
;
1270 if (processor_mask
== -1)
1271 processor_mask
= PROCESSOR_V850E1
;
1273 else if (strncmp (TARGET_CPU
, "v850e", 5) == 0)
1276 machine
= bfd_mach_v850e
;
1278 if (processor_mask
== -1)
1279 processor_mask
= PROCESSOR_V850E
;
1281 else if (strncmp (TARGET_CPU
, "v850", 4) == 0)
1286 if (processor_mask
== -1)
1287 processor_mask
= PROCESSOR_V850
;
1290 /* xgettext:c-format */
1291 as_bad (_("Unable to determine default target processor from string: %s"),
1294 v850_hash
= hash_new ();
1296 /* Insert unique names into hash table. The V850 instruction set
1297 has many identical opcode names that have different opcodes based
1298 on the operands. This hash table then provides a quick index to
1299 the first opcode with a particular name in the opcode table. */
1303 if (strcmp (prev_name
, op
->name
))
1305 prev_name
= (char *) op
->name
;
1306 hash_insert (v850_hash
, op
->name
, (char *) op
);
1311 v850_seg_table
[BSS_SECTION
].s
= bss_section
;
1312 bfd_set_arch_mach (stdoutput
, TARGET_ARCH
, machine
);
1315 static bfd_reloc_code_real_type
1316 handle_lo16 (const struct v850_operand
*operand
)
1318 if (operand
!= NULL
)
1320 if (operand
->bits
== -1)
1321 return BFD_RELOC_V850_LO16_SPLIT_OFFSET
;
1323 if (!(operand
->bits
== 16 && operand
->shift
== 16)
1324 && !(operand
->bits
== 15 && operand
->shift
== 17))
1326 as_bad (_("lo() relocation used on an instruction which does "
1328 return BFD_RELOC_64
; /* Used to indicate an error condition. */
1331 return BFD_RELOC_LO16
;
1334 static bfd_reloc_code_real_type
1335 handle_ctoff (const struct v850_operand
*operand
)
1337 if (operand
== NULL
)
1338 return BFD_RELOC_V850_CALLT_16_16_OFFSET
;
1340 if (operand
->bits
!= 6
1341 || operand
->shift
!= 0)
1343 as_bad (_("ctoff() relocation used on an instruction which does not support it"));
1344 return BFD_RELOC_64
; /* Used to indicate an error condition. */
1347 return BFD_RELOC_V850_CALLT_6_7_OFFSET
;
1350 static bfd_reloc_code_real_type
1351 handle_sdaoff (const struct v850_operand
*operand
)
1353 if (operand
== NULL
)
1354 return BFD_RELOC_V850_SDA_16_16_OFFSET
;
1356 if (operand
->bits
== 15 && operand
->shift
== 17)
1357 return BFD_RELOC_V850_SDA_15_16_OFFSET
;
1359 if (operand
->bits
== -1)
1360 return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
;
1362 if (operand
->bits
!= 16
1363 || operand
->shift
!= 16)
1365 as_bad (_("sdaoff() relocation used on an instruction which does not support it"));
1366 return BFD_RELOC_64
; /* Used to indicate an error condition. */
1369 return BFD_RELOC_V850_SDA_16_16_OFFSET
;
1372 static bfd_reloc_code_real_type
1373 handle_zdaoff (const struct v850_operand
*operand
)
1375 if (operand
== NULL
)
1376 return BFD_RELOC_V850_ZDA_16_16_OFFSET
;
1378 if (operand
->bits
== 15 && operand
->shift
== 17)
1379 return BFD_RELOC_V850_ZDA_15_16_OFFSET
;
1381 if (operand
->bits
== -1)
1382 return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
;
1384 if (operand
->bits
!= 16
1385 || operand
->shift
!= 16)
1387 as_bad (_("zdaoff() relocation used on an instruction which does not support it"));
1388 /* Used to indicate an error condition. */
1389 return BFD_RELOC_64
;
1392 return BFD_RELOC_V850_ZDA_16_16_OFFSET
;
1395 static bfd_reloc_code_real_type
1396 handle_tdaoff (const struct v850_operand
*operand
)
1398 if (operand
== NULL
)
1399 /* Data item, not an instruction. */
1400 return BFD_RELOC_V850_TDA_7_7_OFFSET
;
1402 if (operand
->bits
== 6 && operand
->shift
== 1)
1403 /* sld.w/sst.w, operand: D8_6. */
1404 return BFD_RELOC_V850_TDA_6_8_OFFSET
;
1406 if (operand
->bits
== 4 && operand
->insert
!= NULL
)
1407 /* sld.hu, operand: D5-4. */
1408 return BFD_RELOC_V850_TDA_4_5_OFFSET
;
1410 if (operand
->bits
== 4 && operand
->insert
== NULL
)
1411 /* sld.bu, operand: D4. */
1412 return BFD_RELOC_V850_TDA_4_4_OFFSET
;
1414 if (operand
->bits
== 16 && operand
->shift
== 16)
1415 /* set1 & chums, operands: D16. */
1416 return BFD_RELOC_V850_TDA_16_16_OFFSET
;
1418 if (operand
->bits
!= 7)
1420 as_bad (_("tdaoff() relocation used on an instruction which does not support it"));
1421 /* Used to indicate an error condition. */
1422 return BFD_RELOC_64
;
1425 return operand
->insert
!= NULL
1426 ? BFD_RELOC_V850_TDA_7_8_OFFSET
/* sld.h/sst.h, operand: D8_7. */
1427 : BFD_RELOC_V850_TDA_7_7_OFFSET
; /* sld.b/sst.b, operand: D7. */
1430 /* Warning: The code in this function relies upon the definitions
1431 in the v850_operands[] array (defined in opcodes/v850-opc.c)
1432 matching the hard coded values contained herein. */
1434 static bfd_reloc_code_real_type
1435 v850_reloc_prefix (const struct v850_operand
*operand
)
1437 bfd_boolean paren_skipped
= FALSE
;
1439 /* Skip leading opening parenthesis. */
1440 if (*input_line_pointer
== '(')
1442 ++input_line_pointer
;
1443 paren_skipped
= TRUE
;
1446 #define CHECK_(name, reloc) \
1447 if (strncmp (input_line_pointer, name "(", strlen (name) + 1) == 0) \
1449 input_line_pointer += strlen (name); \
1453 CHECK_ ("hi0", BFD_RELOC_HI16
);
1454 CHECK_ ("hi", BFD_RELOC_HI16_S
);
1455 CHECK_ ("lo", handle_lo16 (operand
) );
1456 CHECK_ ("sdaoff", handle_sdaoff (operand
));
1457 CHECK_ ("zdaoff", handle_zdaoff (operand
));
1458 CHECK_ ("tdaoff", handle_tdaoff (operand
));
1459 CHECK_ ("hilo", BFD_RELOC_32
);
1460 CHECK_ ("ctoff", handle_ctoff (operand
) );
1462 /* Restore skipped parenthesis. */
1464 --input_line_pointer
;
1466 return BFD_RELOC_UNUSED
;
1469 /* Insert an operand value into an instruction. */
1471 static unsigned long
1472 v850_insert_operand (unsigned long insn
,
1473 const struct v850_operand
*operand
,
1479 if (operand
->insert
)
1481 const char *message
= NULL
;
1483 insn
= operand
->insert (insn
, val
, &message
);
1484 if (message
!= NULL
)
1486 if ((operand
->flags
& V850_OPERAND_SIGNED
)
1487 && ! warn_signed_overflows
1488 && strstr (message
, "out of range") != NULL
)
1490 /* Skip warning... */
1492 else if ((operand
->flags
& V850_OPERAND_SIGNED
) == 0
1493 && ! warn_unsigned_overflows
1494 && strstr (message
, "out of range") != NULL
)
1496 /* Skip warning... */
1500 if (file
== (char *) NULL
)
1501 as_warn ("%s: %s", str
, message
);
1503 as_warn_where (file
, line
, "%s: %s", str
, message
);
1507 if (file
== (char *) NULL
)
1508 as_warn ("%s", message
);
1510 as_warn_where (file
, line
, "%s", message
);
1516 if (operand
->bits
!= 32)
1520 if ((operand
->flags
& V850_OPERAND_SIGNED
) != 0)
1522 if (! warn_signed_overflows
)
1523 max
= (1 << operand
->bits
) - 1;
1525 max
= (1 << (operand
->bits
- 1)) - 1;
1527 min
= -(1 << (operand
->bits
- 1));
1531 max
= (1 << operand
->bits
) - 1;
1533 if (! warn_unsigned_overflows
)
1534 min
= -(1 << (operand
->bits
- 1));
1539 /* Some people write constants with the sign extension done by
1540 hand but only up to 32 bits. This shouldn't really be valid,
1541 but, to permit this code to assemble on a 64-bit host, we
1542 sign extend the 32-bit value to 64 bits if so doing makes the
1545 && (offsetT
) (val
- 0x80000000 - 0x80000000) >= min
1546 && (offsetT
) (val
- 0x80000000 - 0x80000000) <= max
)
1547 val
= val
- 0x80000000 - 0x80000000;
1549 /* Similarly, people write expressions like ~(1<<15), and expect
1550 this to be OK for a 32-bit unsigned value. */
1552 && (offsetT
) (val
+ 0x80000000 + 0x80000000) >= min
1553 && (offsetT
) (val
+ 0x80000000 + 0x80000000) <= max
)
1554 val
= val
+ 0x80000000 + 0x80000000;
1556 else if (val
< (offsetT
) min
|| val
> (offsetT
) max
)
1560 /* Restore min and mix to expected values for decimal ranges. */
1561 if ((operand
->flags
& V850_OPERAND_SIGNED
)
1562 && ! warn_signed_overflows
)
1563 max
= (1 << (operand
->bits
- 1)) - 1;
1565 if (! (operand
->flags
& V850_OPERAND_SIGNED
)
1566 && ! warn_unsigned_overflows
)
1570 sprintf (buf
, "%s: ", str
);
1573 strcat (buf
, _("operand"));
1575 as_bad_value_out_of_range (buf
, val
, (offsetT
) min
, (offsetT
) max
, file
, line
);
1579 insn
|= (((long) val
& ((1 << operand
->bits
) - 1)) << operand
->shift
);
1585 static char copy_of_instruction
[128];
1588 md_assemble (char *str
)
1591 char *start_of_operands
;
1592 struct v850_opcode
*opcode
;
1593 struct v850_opcode
*next_opcode
;
1594 const unsigned char *opindex_ptr
;
1598 unsigned long insn_size
;
1602 bfd_boolean extra_data_after_insn
= FALSE
;
1603 unsigned extra_data_len
= 0;
1604 unsigned long extra_data
= 0;
1605 char *saved_input_line_pointer
;
1607 strncpy (copy_of_instruction
, str
, sizeof (copy_of_instruction
) - 1);
1609 /* Get the opcode. */
1610 for (s
= str
; *s
!= '\0' && ! ISSPACE (*s
); s
++)
1616 /* Find the first opcode with the proper name. */
1617 opcode
= (struct v850_opcode
*) hash_find (v850_hash
, str
);
1620 /* xgettext:c-format */
1621 as_bad (_("Unrecognized opcode: `%s'"), str
);
1622 ignore_rest_of_line ();
1627 while (ISSPACE (*str
))
1630 start_of_operands
= str
;
1632 saved_input_line_pointer
= input_line_pointer
;
1636 const char *errmsg
= NULL
;
1640 if ((opcode
->processors
& processor_mask
) == 0)
1642 errmsg
= _("Target processor does not support this instruction.");
1649 insn
= opcode
->opcode
;
1650 extra_data_after_insn
= FALSE
;
1652 input_line_pointer
= str
= start_of_operands
;
1654 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
1656 const struct v850_operand
*operand
;
1659 bfd_reloc_code_real_type reloc
;
1661 if (next_opindex
== 0)
1662 operand
= &v850_operands
[*opindex_ptr
];
1665 operand
= &v850_operands
[next_opindex
];
1671 while (*str
== ' ' || *str
== ',' || *str
== '[' || *str
== ']')
1674 if (operand
->flags
& V850_OPERAND_RELAX
)
1677 /* Gather the operand. */
1678 hold
= input_line_pointer
;
1679 input_line_pointer
= str
;
1681 /* lo(), hi(), hi0(), etc... */
1682 if ((reloc
= v850_reloc_prefix (operand
)) != BFD_RELOC_UNUSED
)
1684 /* This is a fake reloc, used to indicate an error condition. */
1685 if (reloc
== BFD_RELOC_64
)
1693 if (ex
.X_op
== O_constant
)
1697 case BFD_RELOC_V850_ZDA_16_16_OFFSET
:
1698 /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
1702 case BFD_RELOC_LO16
:
1703 case BFD_RELOC_V850_LO16_SPLIT_OFFSET
:
1705 /* Truncate, then sign extend the value. */
1706 ex
.X_add_number
= SEXT16 (ex
.X_add_number
);
1710 case BFD_RELOC_HI16
:
1712 /* Truncate, then sign extend the value. */
1713 ex
.X_add_number
= SEXT16 (ex
.X_add_number
>> 16);
1717 case BFD_RELOC_HI16_S
:
1719 /* Truncate, then sign extend the value. */
1720 int temp
= (ex
.X_add_number
>> 16) & 0xffff;
1722 temp
+= (ex
.X_add_number
>> 15) & 1;
1724 ex
.X_add_number
= SEXT16 (temp
);
1729 if ((operand
->flags
& V850E_IMMEDIATE32
) == 0)
1731 errmsg
= _("immediate operand is too large");
1735 extra_data_after_insn
= TRUE
;
1741 fprintf (stderr
, "reloc: %d\n", reloc
);
1742 as_bad (_("AAARG -> unhandled constant reloc"));
1746 if (fc
> MAX_INSN_FIXUPS
)
1747 as_fatal (_("too many fixups"));
1749 fixups
[fc
].exp
= ex
;
1750 fixups
[fc
].opindex
= *opindex_ptr
;
1751 fixups
[fc
].reloc
= reloc
;
1756 if (reloc
== BFD_RELOC_32
)
1758 if ((operand
->flags
& V850E_IMMEDIATE32
) == 0)
1760 errmsg
= _("immediate operand is too large");
1764 extra_data_after_insn
= TRUE
;
1766 extra_data
= ex
.X_add_number
;
1769 if (fc
> MAX_INSN_FIXUPS
)
1770 as_fatal (_("too many fixups"));
1772 fixups
[fc
].exp
= ex
;
1773 fixups
[fc
].opindex
= *opindex_ptr
;
1774 fixups
[fc
].reloc
= reloc
;
1782 if ((operand
->flags
& V850_OPERAND_REG
) != 0)
1784 if (!register_name (&ex
))
1785 errmsg
= _("invalid register name");
1786 else if ((operand
->flags
& V850_NOT_R0
)
1787 && ex
.X_add_number
== 0)
1789 errmsg
= _("register r0 cannot be used here");
1791 /* Force an error message to be generated by
1792 skipping over any following potential matches
1797 else if ((operand
->flags
& V850_OPERAND_SRG
) != 0)
1799 if (!system_register_name (&ex
, TRUE
, FALSE
))
1800 errmsg
= _("invalid system register name");
1802 else if ((operand
->flags
& V850_OPERAND_EP
) != 0)
1804 char *start
= input_line_pointer
;
1805 char c
= get_symbol_end ();
1807 if (strcmp (start
, "ep") != 0 && strcmp (start
, "r30") != 0)
1809 /* Put things back the way we found them. */
1810 *input_line_pointer
= c
;
1811 input_line_pointer
= start
;
1812 errmsg
= _("expected EP register");
1816 *input_line_pointer
= c
;
1817 str
= input_line_pointer
;
1818 input_line_pointer
= hold
;
1820 while (*str
== ' ' || *str
== ','
1821 || *str
== '[' || *str
== ']')
1825 else if ((operand
->flags
& V850_OPERAND_CC
) != 0)
1828 errmsg
= _("invalid condition code name");
1830 else if (operand
->flags
& V850E_PUSH_POP
)
1832 errmsg
= parse_register_list (&insn
, operand
);
1834 /* The parse_register_list() function has already done
1835 everything, so fake a dummy expression. */
1836 ex
.X_op
= O_constant
;
1837 ex
.X_add_number
= 0;
1839 else if (operand
->flags
& V850E_IMMEDIATE16
)
1843 if (ex
.X_op
!= O_constant
)
1844 errmsg
= _("constant expression expected");
1845 else if (ex
.X_add_number
& 0xffff0000)
1847 if (ex
.X_add_number
& 0xffff)
1848 errmsg
= _("constant too big to fit into instruction");
1849 else if ((insn
& 0x001fffc0) == 0x00130780)
1850 ex
.X_add_number
>>= 16;
1852 errmsg
= _("constant too big to fit into instruction");
1855 extra_data_after_insn
= TRUE
;
1857 extra_data
= ex
.X_add_number
;
1858 ex
.X_add_number
= 0;
1860 else if (operand
->flags
& V850E_IMMEDIATE32
)
1864 if (ex
.X_op
!= O_constant
)
1865 errmsg
= _("constant expression expected");
1867 extra_data_after_insn
= TRUE
;
1869 extra_data
= ex
.X_add_number
;
1870 ex
.X_add_number
= 0;
1872 else if (register_name (&ex
)
1873 && (operand
->flags
& V850_OPERAND_REG
) == 0)
1878 /* It is possible that an alias has been defined that
1879 matches a register name. For example the code may
1880 include a ".set ZERO, 0" directive, which matches
1881 the register name "zero". Attempt to reparse the
1882 field as an expression, and only complain if we
1883 cannot generate a constant. */
1885 input_line_pointer
= str
;
1887 c
= get_symbol_end ();
1889 if (symbol_find (str
) != NULL
)
1892 *input_line_pointer
= c
;
1893 input_line_pointer
= str
;
1897 if (ex
.X_op
!= O_constant
)
1899 /* If this register is actually occurring too early on
1900 the parsing of the instruction, (because another
1901 field is missing) then report this. */
1902 if (opindex_ptr
[1] != 0
1903 && (v850_operands
[opindex_ptr
[1]].flags
1904 & V850_OPERAND_REG
))
1905 errmsg
= _("syntax error: value is missing before the register name");
1907 errmsg
= _("syntax error: register not expected");
1909 /* If we created a symbol in the process of this
1910 test then delete it now, so that it will not
1911 be output with the real symbols... */
1913 && ex
.X_op
== O_symbol
)
1914 symbol_remove (ex
.X_add_symbol
,
1915 &symbol_rootP
, &symbol_lastP
);
1918 else if (system_register_name (&ex
, FALSE
, FALSE
)
1919 && (operand
->flags
& V850_OPERAND_SRG
) == 0)
1920 errmsg
= _("syntax error: system register not expected");
1922 else if (cc_name (&ex
)
1923 && (operand
->flags
& V850_OPERAND_CC
) == 0)
1924 errmsg
= _("syntax error: condition code not expected");
1930 If we are assembling a MOV instruction and the immediate
1931 value does not fit into the bits available then create a
1932 fake error so that the next MOV instruction will be
1933 selected. This one has a 32 bit immediate field. */
1935 if (((insn
& 0x07e0) == 0x0200)
1936 && operand
->bits
== 5 /* Do not match the CALLT instruction. */
1937 && ex
.X_op
== O_constant
1938 && (ex
.X_add_number
< (-(1 << (operand
->bits
- 1)))
1939 || ex
.X_add_number
> ((1 << (operand
->bits
- 1)) - 1)))
1940 errmsg
= _("immediate operand is too large");
1949 errmsg
= _("illegal operand");
1952 errmsg
= _("missing operand");
1956 & (V850_OPERAND_REG
| V850_OPERAND_SRG
)) == 0)
1958 errmsg
= _("invalid operand");
1961 insn
= v850_insert_operand (insn
, operand
, ex
.X_add_number
,
1962 NULL
, 0, copy_of_instruction
);
1966 insn
= v850_insert_operand (insn
, operand
, ex
.X_add_number
,
1967 NULL
, 0, copy_of_instruction
);
1971 /* We need to generate a fixup for this expression. */
1972 if (fc
>= MAX_INSN_FIXUPS
)
1973 as_fatal (_("too many fixups"));
1975 fixups
[fc
].exp
= ex
;
1976 fixups
[fc
].opindex
= *opindex_ptr
;
1977 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
1983 str
= input_line_pointer
;
1984 input_line_pointer
= hold
;
1986 while (*str
== ' ' || *str
== ',' || *str
== '[' || *str
== ']'
1995 next_opcode
= opcode
+ 1;
1996 if (next_opcode
->name
!= NULL
1997 && strcmp (next_opcode
->name
, opcode
->name
) == 0)
1999 opcode
= next_opcode
;
2001 /* Skip versions that are not supported by the target
2003 if ((opcode
->processors
& processor_mask
) == 0)
2009 as_bad ("%s: %s", copy_of_instruction
, errmsg
);
2011 if (*input_line_pointer
== ']')
2012 ++input_line_pointer
;
2014 ignore_rest_of_line ();
2015 input_line_pointer
= saved_input_line_pointer
;
2021 while (ISSPACE (*str
))
2025 /* xgettext:c-format */
2026 as_bad (_("junk at end of line: `%s'"), str
);
2028 input_line_pointer
= str
;
2030 /* Tie dwarf2 debug info to the address at the start of the insn.
2031 We can't do this after the insn has been output as the current
2032 frag may have been closed off. eg. by frag_var. */
2033 dwarf2_emit_insn (0);
2035 /* Write out the instruction. */
2037 if (relaxable
&& fc
> 0)
2039 /* On a 64-bit host the size of an 'int' is not the same
2040 as the size of a pointer, so we need a union to convert
2041 the opindex field of the fr_cgen structure into a char *
2042 so that it can be stored in the frag. We do not have
2043 to worry about loosing accuracy as we are not going to
2044 be even close to the 32bit limit of the int. */
2052 opindex_converter
.opindex
= fixups
[0].opindex
;
2056 if (!strcmp (opcode
->name
, "br"))
2058 f
= frag_var (rs_machine_dependent
, 4, 2, 2,
2059 fixups
[0].exp
.X_add_symbol
,
2060 fixups
[0].exp
.X_add_number
,
2061 opindex_converter
.ptr
);
2062 md_number_to_chars (f
, insn
, insn_size
);
2063 md_number_to_chars (f
+ 2, 0, 2);
2067 f
= frag_var (rs_machine_dependent
, 6, 4, 0,
2068 fixups
[0].exp
.X_add_symbol
,
2069 fixups
[0].exp
.X_add_number
,
2070 opindex_converter
.ptr
);
2071 md_number_to_chars (f
, insn
, insn_size
);
2072 md_number_to_chars (f
+ 2, 0, 4);
2077 /* Four byte insns have an opcode with the two high bits on. */
2078 if ((insn
& 0x0600) == 0x0600)
2083 /* Special case: 32 bit MOV. */
2084 if ((insn
& 0xffe0) == 0x0620)
2087 f
= frag_more (insn_size
);
2088 md_number_to_chars (f
, insn
, insn_size
);
2090 if (extra_data_after_insn
)
2092 f
= frag_more (extra_data_len
);
2093 md_number_to_chars (f
, extra_data
, extra_data_len
);
2095 extra_data_after_insn
= FALSE
;
2099 /* Create any fixups. At this point we do not use a
2100 bfd_reloc_code_real_type, but instead just use the
2101 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2102 handle fixups for any operand type, although that is admittedly
2103 not a very exciting feature. We pick a BFD reloc type in
2105 for (i
= 0; i
< fc
; i
++)
2107 const struct v850_operand
*operand
;
2108 bfd_reloc_code_real_type reloc
;
2110 operand
= &v850_operands
[fixups
[i
].opindex
];
2112 reloc
= fixups
[i
].reloc
;
2114 if (reloc
!= BFD_RELOC_UNUSED
)
2116 reloc_howto_type
*reloc_howto
=
2117 bfd_reloc_type_lookup (stdoutput
, reloc
);
2125 size
= bfd_get_reloc_size (reloc_howto
);
2127 /* XXX This will abort on an R_V850_8 reloc -
2128 is this reloc actually used? */
2129 if (size
!= 2 && size
!= 4)
2132 address
= (f
- frag_now
->fr_literal
) + insn_size
- size
;
2134 if (reloc
== BFD_RELOC_32
)
2137 fixP
= fix_new_exp (frag_now
, address
, size
,
2139 reloc_howto
->pc_relative
,
2142 fixP
->tc_fix_data
= (void *) operand
;
2146 case BFD_RELOC_LO16
:
2147 case BFD_RELOC_V850_LO16_SPLIT_OFFSET
:
2148 case BFD_RELOC_HI16
:
2149 case BFD_RELOC_HI16_S
:
2150 fixP
->fx_no_overflow
= 1;
2158 fix_new_exp (frag_now
,
2159 f
- frag_now
->fr_literal
, 4,
2161 (operand
->flags
& V850_OPERAND_DISP
) != 0,
2162 (bfd_reloc_code_real_type
) (fixups
[i
].opindex
2163 + (int) BFD_RELOC_UNUSED
));
2167 input_line_pointer
= saved_input_line_pointer
;
2170 /* If while processing a fixup, a reloc really needs to be created
2171 then it is done here. */
2174 tc_gen_reloc (asection
*seg ATTRIBUTE_UNUSED
, fixS
*fixp
)
2178 reloc
= xmalloc (sizeof (arelent
));
2179 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
2180 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
2181 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2183 if ( fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
2184 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
2185 || fixp
->fx_r_type
== BFD_RELOC_V850_LONGCALL
2186 || fixp
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
2187 || fixp
->fx_r_type
== BFD_RELOC_V850_ALIGN
)
2188 reloc
->addend
= fixp
->fx_offset
;
2191 if (fixp
->fx_r_type
== BFD_RELOC_32
2193 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
2195 reloc
->addend
= fixp
->fx_addnumber
;
2198 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
2200 if (reloc
->howto
== NULL
)
2202 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
2203 /* xgettext:c-format */
2204 _("reloc %d not supported by object file format"),
2205 (int) fixp
->fx_r_type
);
2216 v850_handle_align (fragS
* frag
)
2219 && frag
->fr_type
== rs_align
2220 && frag
->fr_address
+ frag
->fr_fix
> 0
2221 && frag
->fr_offset
> 1
2222 && now_seg
!= bss_section
2223 && now_seg
!= v850_seg_table
[SBSS_SECTION
].s
2224 && now_seg
!= v850_seg_table
[TBSS_SECTION
].s
2225 && now_seg
!= v850_seg_table
[ZBSS_SECTION
].s
)
2226 fix_new (frag
, frag
->fr_fix
, 2, & abs_symbol
, frag
->fr_offset
, 0,
2227 BFD_RELOC_V850_ALIGN
);
2230 /* Return current size of variable part of frag. */
2233 md_estimate_size_before_relax (fragS
*fragp
, asection
*seg ATTRIBUTE_UNUSED
)
2235 if (fragp
->fr_subtype
>= sizeof (md_relax_table
) / sizeof (md_relax_table
[0]))
2238 return md_relax_table
[fragp
->fr_subtype
].rlx_length
;
2242 v850_pcrel_from_section (fixS
*fixp
, segT section
)
2244 /* If the symbol is undefined, or in a section other than our own,
2245 or it is weak (in which case it may well be in another section,
2246 then let the linker figure it out. */
2247 if (fixp
->fx_addsy
!= (symbolS
*) NULL
2248 && (! S_IS_DEFINED (fixp
->fx_addsy
)
2249 || S_IS_WEAK (fixp
->fx_addsy
)
2250 || (S_GET_SEGMENT (fixp
->fx_addsy
) != section
)))
2253 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
2257 md_apply_fix (fixS
*fixP
, valueT
*valueP
, segT seg ATTRIBUTE_UNUSED
)
2259 valueT value
= * valueP
;
2262 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
2263 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGCALL
2264 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
2265 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
2271 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
2272 fixP
->fx_addnumber
= value
,
2275 else if (fixP
->fx_pcrel
)
2276 fixP
->fx_addnumber
= fixP
->fx_offset
;
2280 value
= fixP
->fx_offset
;
2281 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
2283 if (S_GET_SEGMENT (fixP
->fx_subsy
) == absolute_section
)
2284 value
-= S_GET_VALUE (fixP
->fx_subsy
);
2286 /* We don't actually support subtracting a symbol. */
2287 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
2288 _("expression too complex"));
2290 fixP
->fx_addnumber
= value
;
2293 if ((int) fixP
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
2296 const struct v850_operand
*operand
;
2299 opindex
= (int) fixP
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
2300 operand
= &v850_operands
[opindex
];
2302 /* Fetch the instruction, insert the fully resolved operand
2303 value, and stuff the instruction back again.
2305 Note the instruction has been stored in little endian
2307 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
2309 insn
= bfd_getl32 ((unsigned char *) where
);
2310 insn
= v850_insert_operand (insn
, operand
, (offsetT
) value
,
2311 fixP
->fx_file
, fixP
->fx_line
, NULL
);
2312 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
2315 /* Nothing else to do here. */
2318 /* Determine a BFD reloc value based on the operand information.
2319 We are only prepared to turn a few of the operands into relocs. */
2321 if (operand
->bits
== 22)
2322 fixP
->fx_r_type
= BFD_RELOC_V850_22_PCREL
;
2323 else if (operand
->bits
== 9)
2324 fixP
->fx_r_type
= BFD_RELOC_V850_9_PCREL
;
2327 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
2328 _("unresolved expression that must be resolved"));
2333 else if (fixP
->fx_done
)
2335 /* We still have to insert the value into memory! */
2336 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
2338 if (fixP
->tc_fix_data
!= NULL
2339 && ((struct v850_operand
*) fixP
->tc_fix_data
)->insert
!= NULL
)
2341 const char * message
= NULL
;
2342 struct v850_operand
* operand
= (struct v850_operand
*) fixP
->tc_fix_data
;
2345 /* The variable "where" currently points at the exact point inside
2346 the insn where we need to insert the value. But we need to
2347 extract the entire insn so we probably need to move "where"
2348 back a few bytes. */
2349 if (fixP
->fx_size
== 2)
2351 else if (fixP
->fx_size
== 1)
2354 insn
= bfd_getl32 ((unsigned char *) where
);
2356 /* Use the operand's insertion procedure, if present, in order to
2357 make sure that the value is correctly stored in the insn. */
2358 insn
= operand
->insert (insn
, (offsetT
) value
, & message
);
2359 /* Ignore message even if it is set. */
2361 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
2365 if (fixP
->fx_r_type
== BFD_RELOC_V850_LO16_SPLIT_OFFSET
)
2366 bfd_putl32 (((value
<< 16) & 0xfffe0000)
2367 | ((value
<< 5) & 0x20)
2368 | (bfd_getl32 (where
) & ~0xfffe0020), where
);
2369 else if (fixP
->fx_size
== 1)
2370 *where
= value
& 0xff;
2371 else if (fixP
->fx_size
== 2)
2372 bfd_putl16 (value
& 0xffff, (unsigned char *) where
);
2373 else if (fixP
->fx_size
== 4)
2374 bfd_putl32 (value
, (unsigned char *) where
);
2379 /* Parse a cons expression. We have to handle hi(), lo(), etc
2383 parse_cons_expression_v850 (expressionS
*exp
)
2385 /* See if there's a reloc prefix like hi() we have to handle. */
2386 hold_cons_reloc
= v850_reloc_prefix (NULL
);
2388 /* Do normal expression parsing. */
2392 /* Create a fixup for a cons expression. If parse_cons_expression_v850
2393 found a reloc prefix, then we use that reloc, else we choose an
2394 appropriate one based on the size of the expression. */
2397 cons_fix_new_v850 (fragS
*frag
,
2402 if (hold_cons_reloc
== BFD_RELOC_UNUSED
)
2405 hold_cons_reloc
= BFD_RELOC_32
;
2407 hold_cons_reloc
= BFD_RELOC_16
;
2409 hold_cons_reloc
= BFD_RELOC_8
;
2413 fix_new_exp (frag
, where
, size
, exp
, 0, hold_cons_reloc
);
2415 fix_new (frag
, where
, size
, NULL
, 0, 0, hold_cons_reloc
);
2417 hold_cons_reloc
= BFD_RELOC_UNUSED
;
2421 v850_fix_adjustable (fixS
*fixP
)
2423 if (fixP
->fx_addsy
== NULL
)
2426 /* Don't adjust function names. */
2427 if (S_IS_FUNCTION (fixP
->fx_addsy
))
2430 /* We need the symbol name for the VTABLE entries. */
2431 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
2432 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
2439 v850_force_relocation (struct fix
*fixP
)
2441 if (fixP
->fx_r_type
== BFD_RELOC_V850_LONGCALL
2442 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
)
2447 || fixP
->fx_r_type
== BFD_RELOC_V850_ALIGN
2448 || fixP
->fx_r_type
== BFD_RELOC_V850_22_PCREL
2449 || fixP
->fx_r_type
== BFD_RELOC_V850_9_PCREL
2450 || fixP
->fx_r_type
>= BFD_RELOC_UNUSED
))
2453 return generic_force_reloc (fixP
);