1 /* tc-v850.c -- Assembler code for the NEC V850
2 Copyright (C) 1996-2024 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
19 Boston, MA 02110-1301, USA. */
22 #include "safe-ctype.h"
24 #include "opcode/v850.h"
25 #include "dwarf2dbg.h"
27 /* Sign-extend a 16-bit number. */
28 #define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
30 /* Set to TRUE if we want to be pedantic about signed overflows. */
31 static bool warn_signed_overflows
= false;
32 static bool warn_unsigned_overflows
= false;
34 /* Non-zero if floating point insns are not being used. */
35 static signed int soft_float
= -1;
37 /* Indicates the target BFD machine number. */
38 static int machine
= -1;
41 /* Indicates the target BFD architecture. */
42 enum bfd_architecture v850_target_arch
= bfd_arch_v850_rh850
;
43 const char * v850_target_format
= "elf32-v850-rh850";
44 static flagword v850_e_flags
= 0;
46 /* Indicates the target processor(s) for the assemble. */
47 static int processor_mask
= 0;
49 /* Structure to hold information about predefined registers. */
54 unsigned int processors
;
57 /* Generic assembler global variables which must be defined by all
60 /* Characters which always start a comment. */
61 const char comment_chars
[] = "#";
63 /* Characters which start a comment at the beginning of a line. */
64 const char line_comment_chars
[] = ";#";
66 /* Characters which may be used to separate multiple commands on a
68 const char line_separator_chars
[] = ";";
70 /* Characters which are used to indicate an exponent in a floating
72 const char EXP_CHARS
[] = "eE";
74 /* Characters which mean that a number is a floating point constant,
76 const char FLT_CHARS
[] = "dD";
78 const relax_typeS md_relax_table
[] =
80 /* Conditional branches.(V850/V850E, max 22bit) */
81 #define SUBYPTE_COND_9_22 0
82 {0xfe, -0x100, 2, SUBYPTE_COND_9_22
+ 1},
83 {0x1ffffe + 2, -0x200000 + 2, 6, 0},
84 /* Conditional branches.(V850/V850E, max 22bit) */
85 #define SUBYPTE_SA_9_22 2
86 {0xfe, -0x100, 2, SUBYPTE_SA_9_22
+ 1},
87 {0x1ffffe + 4, -0x200000 + 4, 8, 0},
88 /* Unconditional branches.(V850/V850E, max 22bit) */
89 #define SUBYPTE_UNCOND_9_22 4
90 {0xfe, -0x100, 2, SUBYPTE_UNCOND_9_22
+ 1},
91 {0x1ffffe, -0x200000, 4, 0},
92 /* Conditional branches.(V850E2, max 32bit) */
93 #define SUBYPTE_COND_9_22_32 6
94 {0xfe, -0x100, 2, SUBYPTE_COND_9_22_32
+ 1},
95 {0x1fffff + 2, -0x200000 + 2, 6, SUBYPTE_COND_9_22_32
+ 2},
96 {0x7ffffffe, -0x80000000, 8, 0},
97 /* Conditional branches.(V850E2, max 32bit) */
98 #define SUBYPTE_SA_9_22_32 9
99 {0xfe, -0x100, 2, SUBYPTE_SA_9_22_32
+ 1},
100 {0x1ffffe + 4, -0x200000 + 4, 8, SUBYPTE_SA_9_22_32
+ 2},
101 {0x7ffffffe, -0x80000000, 10, 0},
102 /* Unconditional branches.(V850E2, max 32bit) */
103 #define SUBYPTE_UNCOND_9_22_32 12
104 {0xfe, -0x100, 2, SUBYPTE_UNCOND_9_22_32
+ 1},
105 {0x1ffffe, -0x200000, 4, SUBYPTE_UNCOND_9_22_32
+ 2},
106 {0x7ffffffe, -0x80000000, 6, 0},
107 /* Conditional branches.(V850E2R max 22bit) */
108 #define SUBYPTE_COND_9_17_22 15
109 {0xfe, -0x100, 2, SUBYPTE_COND_9_17_22
+ 1},
110 {0xfffe, -0x10000, 4, SUBYPTE_COND_9_17_22
+ 2},
111 {0x1ffffe + 2, -0x200000 + 2, 6, 0},
112 /* Conditional branches.(V850E2R max 22bit) */
113 #define SUBYPTE_SA_9_17_22 18
114 {0xfe, -0x100, 2, SUBYPTE_SA_9_17_22
+ 1},
115 {0xfffe, -0x10000, 4, SUBYPTE_SA_9_17_22
+ 2},
116 {0x1ffffe + 4, -0x200000 + 4, 8, 0},
117 /* Conditional branches.(V850E2R max 32bit) */
118 #define SUBYPTE_COND_9_17_22_32 21
119 {0xfe, -0x100, 2, SUBYPTE_COND_9_17_22_32
+ 1},
120 {0xfffe, -0x10000, 4, SUBYPTE_COND_9_17_22_32
+ 2},
121 {0x1ffffe + 2, -0x200000 + 2, 6, SUBYPTE_COND_9_17_22_32
+ 3},
122 {0x7ffffffe, -0x80000000, 8, 0},
123 /* Conditional branches.(V850E2R max 32bit) */
124 #define SUBYPTE_SA_9_17_22_32 25
125 {0xfe, -0x100, 2, SUBYPTE_SA_9_17_22_32
+ 1},
126 {0xfffe, -0x10000, 4, SUBYPTE_SA_9_17_22_32
+ 2},
127 {0x1ffffe + 4, -0x200000 + 4, 8, SUBYPTE_SA_9_17_22_32
+ 3},
128 {0x7ffffffe, -0x80000000, 10, 0},
129 /* Loop. (V850E2V4_UP, max 22-bit). */
130 #define SUBYPTE_LOOP_16_22 29
131 {0x0, -0x0fffe, 4, SUBYPTE_LOOP_16_22
+ 1},
132 {0x1ffffe + 2, -0x200000 + 2, 6, 0},
135 static int v850_relax
= 0;
137 /* Default branch disp size 22 or 32. */
138 static int default_disp_size
= 22;
140 /* Default no using bcond17. */
141 static int no_bcond17
= 0;
143 /* Default no using ld/st 23bit offset. */
144 static int no_stld23
= 0;
147 #define MAX_INSN_FIXUPS 5
153 bfd_reloc_code_real_type reloc
;
156 struct v850_fixup fixups
[MAX_INSN_FIXUPS
];
159 struct v850_seg_entry
166 struct v850_seg_entry v850_seg_table
[] =
169 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
172 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
174 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
176 SEC_ALLOC
| SEC_SMALL_DATA
},
182 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_DATA
183 | SEC_HAS_CONTENTS
| SEC_SMALL_DATA
},
185 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_DATA
186 | SEC_HAS_CONTENTS
},
188 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
189 | SEC_SMALL_DATA
| SEC_IS_COMMON
},
191 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
194 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
196 { NULL
, ".call_table_data",
197 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_DATA
| SEC_HAS_CONTENTS
},
198 { NULL
, ".call_table_text",
199 SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_READONLY
| SEC_CODE
205 #define SDATA_SECTION 0
206 #define TDATA_SECTION 1
207 #define ZDATA_SECTION 2
208 #define SBSS_SECTION 3
209 #define TBSS_SECTION 4
210 #define ZBSS_SECTION 5
211 #define ROSDATA_SECTION 6
212 #define ROZDATA_SECTION 7
213 #define SCOMMON_SECTION 8
214 #define TCOMMON_SECTION 9
215 #define ZCOMMON_SECTION 10
216 #define CALL_TABLE_DATA_SECTION 11
217 #define CALL_TABLE_TEXT_SECTION 12
218 #define BSS_SECTION 13
221 do_v850_seg (int i
, subsegT sub
)
223 struct v850_seg_entry
*seg
= v850_seg_table
+ i
;
225 obj_elf_section_change_hook ();
228 subseg_set (seg
->s
, sub
);
231 seg
->s
= subseg_new (seg
->name
, sub
);
232 bfd_set_section_flags (seg
->s
, seg
->flags
);
233 if ((seg
->flags
& SEC_LOAD
) == 0)
234 seg_info (seg
->s
)->bss
= 1;
241 subsegT sub
= get_absolute_expression ();
243 do_v850_seg (i
, sub
);
244 demand_empty_rest_of_line ();
248 v850_offset (int ignore ATTRIBUTE_UNUSED
)
251 int temp
= get_absolute_expression ();
253 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
)0, (symbolS
*)0,
254 (offsetT
) temp
, (char *) 0);
257 demand_empty_rest_of_line ();
260 /* Copied from obj_elf_common() in gas/config/obj-elf.c. */
273 c
= get_symbol_name (&name
);
275 /* Just after name is now '\0'. */
276 p
= input_line_pointer
;
281 if (*input_line_pointer
!= ',')
283 as_bad (_("Expected comma after symbol-name"));
284 ignore_rest_of_line ();
289 input_line_pointer
++;
291 if ((temp
= get_absolute_expression ()) < 0)
293 /* xgettext:c-format */
294 as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp
);
295 ignore_rest_of_line ();
301 symbolP
= symbol_find_or_make (name
);
304 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
306 as_bad (_("Ignoring attempt to re-define symbol"));
307 ignore_rest_of_line ();
311 if (S_GET_VALUE (symbolP
) != 0)
313 if (S_GET_VALUE (symbolP
) != size
)
314 /* xgettext:c-format */
315 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
316 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), size
);
319 know (symbol_get_frag (symbolP
) == &zero_address_frag
);
321 if (*input_line_pointer
!= ',')
326 input_line_pointer
++;
330 if (! have_align
|| *input_line_pointer
!= '"')
336 temp
= get_absolute_expression ();
341 as_warn (_("Common alignment negative; 0 assumed"));
345 if (symbol_get_obj (symbolP
)->local
)
354 old_subsec
= now_subseg
;
356 applicable
= bfd_applicable_section_flags (stdoutput
);
358 applicable
&= SEC_ALLOC
;
362 case SCOMMON_SECTION
:
363 do_v850_seg (SBSS_SECTION
, 0);
366 case ZCOMMON_SECTION
:
367 do_v850_seg (ZBSS_SECTION
, 0);
370 case TCOMMON_SECTION
:
371 do_v850_seg (TBSS_SECTION
, 0);
377 /* Convert to a power of 2 alignment. */
378 for (align
= 0; (temp
& 1) == 0; temp
>>= 1, ++align
)
383 as_bad (_("Common alignment not a power of 2"));
384 ignore_rest_of_line ();
391 record_alignment (now_seg
, align
);
394 frag_align (align
, 0, 0);
398 case SCOMMON_SECTION
:
399 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[SBSS_SECTION
].s
)
400 symbol_get_frag (symbolP
)->fr_symbol
= 0;
403 case ZCOMMON_SECTION
:
404 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[ZBSS_SECTION
].s
)
405 symbol_get_frag (symbolP
)->fr_symbol
= 0;
408 case TCOMMON_SECTION
:
409 if (S_GET_SEGMENT (symbolP
) == v850_seg_table
[TBSS_SECTION
].s
)
410 symbol_get_frag (symbolP
)->fr_symbol
= 0;
417 symbol_set_frag (symbolP
, frag_now
);
418 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
419 (offsetT
) size
, (char *) 0);
421 S_SET_SIZE (symbolP
, size
);
425 case SCOMMON_SECTION
:
426 S_SET_SEGMENT (symbolP
, v850_seg_table
[SBSS_SECTION
].s
);
429 case ZCOMMON_SECTION
:
430 S_SET_SEGMENT (symbolP
, v850_seg_table
[ZBSS_SECTION
].s
);
433 case TCOMMON_SECTION
:
434 S_SET_SEGMENT (symbolP
, v850_seg_table
[TBSS_SECTION
].s
);
441 S_CLEAR_EXTERNAL (symbolP
);
442 obj_elf_section_change_hook ();
443 subseg_set (old_sec
, old_subsec
);
452 old_subsec
= now_subseg
;
454 S_SET_VALUE (symbolP
, (valueT
) size
);
455 S_SET_ALIGN (symbolP
, temp
);
456 S_SET_EXTERNAL (symbolP
);
460 case SCOMMON_SECTION
:
461 case ZCOMMON_SECTION
:
462 case TCOMMON_SECTION
:
463 do_v850_seg (area
, 0);
464 S_SET_SEGMENT (symbolP
, v850_seg_table
[area
].s
);
471 obj_elf_section_change_hook ();
472 subseg_set (old_sec
, old_subsec
);
477 input_line_pointer
++;
479 /* @@ Some use the dot, some don't. Can we get some consistency?? */
480 if (*input_line_pointer
== '.')
481 input_line_pointer
++;
483 /* @@ Some say data, some say bss. */
484 if (!startswith (input_line_pointer
, "bss\"")
485 && !startswith (input_line_pointer
, "data\""))
487 while (*--input_line_pointer
!= '"')
489 input_line_pointer
--;
490 goto bad_common_segment
;
493 while (*input_line_pointer
++ != '"')
496 goto allocate_common
;
499 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
501 demand_empty_rest_of_line ();
506 p
= input_line_pointer
;
507 while (*p
&& *p
!= '\n')
511 as_bad (_("bad .common segment %s"), input_line_pointer
+ 1);
513 input_line_pointer
= p
;
514 ignore_rest_of_line ();
520 set_machine (int number
)
523 bfd_set_arch_mach (stdoutput
, v850_target_arch
, machine
);
527 case 0: SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850
); break;
528 case bfd_mach_v850
: SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850
); break;
529 case bfd_mach_v850e
: SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E
); break;
530 case bfd_mach_v850e1
: SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E
); break;
531 case bfd_mach_v850e2
: SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E2
); break;
532 case bfd_mach_v850e2v3
:SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E2V3
); break;
533 case bfd_mach_v850e3v5
: SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E3V5
); break;
538 v850_longcode (int type
)
545 as_warn (_(".longcall pseudo-op seen when not relaxing"));
547 as_warn (_(".longjump pseudo-op seen when not relaxing"));
552 if (ex
.X_op
!= O_symbol
|| ex
.X_add_number
!= 0)
554 as_bad (_("bad .longcall format"));
555 ignore_rest_of_line ();
561 fix_new_exp (frag_now
, frag_now_fix (), 4, & ex
, 1,
562 BFD_RELOC_V850_LONGCALL
);
564 fix_new_exp (frag_now
, frag_now_fix (), 4, & ex
, 1,
565 BFD_RELOC_V850_LONGJUMP
);
567 demand_empty_rest_of_line ();
570 /* The target specific pseudo-ops which we support. */
571 const pseudo_typeS md_pseudo_table
[] =
573 { "sdata", v850_seg
, SDATA_SECTION
},
574 { "tdata", v850_seg
, TDATA_SECTION
},
575 { "zdata", v850_seg
, ZDATA_SECTION
},
576 { "sbss", v850_seg
, SBSS_SECTION
},
577 { "tbss", v850_seg
, TBSS_SECTION
},
578 { "zbss", v850_seg
, ZBSS_SECTION
},
579 { "rosdata", v850_seg
, ROSDATA_SECTION
},
580 { "rozdata", v850_seg
, ROZDATA_SECTION
},
581 { "bss", v850_seg
, BSS_SECTION
},
582 { "offset", v850_offset
, 0 },
584 { "zcomm", v850_comm
, ZCOMMON_SECTION
},
585 { "scomm", v850_comm
, SCOMMON_SECTION
},
586 { "tcomm", v850_comm
, TCOMMON_SECTION
},
587 { "v850", set_machine
, 0 },
588 { "call_table_data", v850_seg
, CALL_TABLE_DATA_SECTION
},
589 { "call_table_text", v850_seg
, CALL_TABLE_TEXT_SECTION
},
590 { "v850e", set_machine
, bfd_mach_v850e
},
591 { "v850e1", set_machine
, bfd_mach_v850e1
},
592 { "v850e2", set_machine
, bfd_mach_v850e2
},
593 { "v850e2v3", set_machine
, bfd_mach_v850e2v3
},
594 { "v850e2v4", set_machine
, bfd_mach_v850e3v5
},
595 { "v850e3v5", set_machine
, bfd_mach_v850e3v5
},
596 { "longcall", v850_longcode
, 1 },
597 { "longjump", v850_longcode
, 2 },
601 /* Opcode hash table. */
602 static htab_t v850_hash
;
604 /* This table is sorted. Suitable for searching by a binary search. */
605 static const struct reg_name pre_defined_registers
[] =
607 { "ep", 30, PROCESSOR_ALL
}, /* ep - element ptr. */
608 { "gp", 4, PROCESSOR_ALL
}, /* gp - global ptr. */
609 { "hp", 2, PROCESSOR_ALL
}, /* hp - handler stack ptr. */
610 { "lp", 31, PROCESSOR_ALL
}, /* lp - link ptr. */
611 { "r0", 0, PROCESSOR_ALL
},
612 { "r1", 1, PROCESSOR_ALL
},
613 { "r10", 10, PROCESSOR_ALL
},
614 { "r11", 11, PROCESSOR_ALL
},
615 { "r12", 12, PROCESSOR_ALL
},
616 { "r13", 13, PROCESSOR_ALL
},
617 { "r14", 14, PROCESSOR_ALL
},
618 { "r15", 15, PROCESSOR_ALL
},
619 { "r16", 16, PROCESSOR_ALL
},
620 { "r17", 17, PROCESSOR_ALL
},
621 { "r18", 18, PROCESSOR_ALL
},
622 { "r19", 19, PROCESSOR_ALL
},
623 { "r2", 2, PROCESSOR_ALL
},
624 { "r20", 20, PROCESSOR_ALL
},
625 { "r21", 21, PROCESSOR_ALL
},
626 { "r22", 22, PROCESSOR_ALL
},
627 { "r23", 23, PROCESSOR_ALL
},
628 { "r24", 24, PROCESSOR_ALL
},
629 { "r25", 25, PROCESSOR_ALL
},
630 { "r26", 26, PROCESSOR_ALL
},
631 { "r27", 27, PROCESSOR_ALL
},
632 { "r28", 28, PROCESSOR_ALL
},
633 { "r29", 29, PROCESSOR_ALL
},
634 { "r3", 3, PROCESSOR_ALL
},
635 { "r30", 30, PROCESSOR_ALL
},
636 { "r31", 31, PROCESSOR_ALL
},
637 { "r4", 4, PROCESSOR_ALL
},
638 { "r5", 5, PROCESSOR_ALL
},
639 { "r6", 6, PROCESSOR_ALL
},
640 { "r7", 7, PROCESSOR_ALL
},
641 { "r8", 8, PROCESSOR_ALL
},
642 { "r9", 9, PROCESSOR_ALL
},
643 { "sp", 3, PROCESSOR_ALL
}, /* sp - stack ptr. */
644 { "tp", 5, PROCESSOR_ALL
}, /* tp - text ptr. */
645 { "zero", 0, PROCESSOR_ALL
},
648 #define REG_NAME_CNT \
649 (sizeof (pre_defined_registers) / sizeof (struct reg_name))
651 static const struct reg_name system_registers
[] =
653 { "asid", 23, PROCESSOR_NOT_V850
},
654 { "bpam", 25, PROCESSOR_NOT_V850
},
655 { "bpav", 24, PROCESSOR_NOT_V850
},
656 { "bpc", 22, PROCESSOR_NOT_V850
},
657 { "bpdm", 27, PROCESSOR_NOT_V850
},
658 { "bpdv", 26, PROCESSOR_NOT_V850
},
659 { "bsel", 31, PROCESSOR_V850E2_UP
},
660 { "cfg", 7, PROCESSOR_V850E2V3_UP
},
661 { "ctbp", 20, PROCESSOR_NOT_V850
},
662 { "ctpc", 16, PROCESSOR_NOT_V850
},
663 { "ctpsw", 17, PROCESSOR_NOT_V850
},
664 { "dbic", 15, PROCESSOR_V850E2_UP
},
665 { "dbpc", 18, PROCESSOR_NOT_V850
},
666 { "dbpsw", 19, PROCESSOR_NOT_V850
},
667 { "dbwr", 30, PROCESSOR_V850E2_UP
},
668 { "dir", 21, PROCESSOR_NOT_V850
},
669 { "dpa0l", 16, PROCESSOR_V850E2V3_UP
},
670 { "dpa0u", 17, PROCESSOR_V850E2V3_UP
},
671 { "dpa1l", 18, PROCESSOR_V850E2V3_UP
},
672 { "dpa1u", 19, PROCESSOR_V850E2V3_UP
},
673 { "dpa2l", 20, PROCESSOR_V850E2V3_UP
},
674 { "dpa2u", 21, PROCESSOR_V850E2V3_UP
},
675 { "dpa3l", 22, PROCESSOR_V850E2V3_UP
},
676 { "dpa3u", 23, PROCESSOR_V850E2V3_UP
},
677 { "dpa4l", 24, PROCESSOR_V850E2V3_UP
},
678 { "dpa4u", 25, PROCESSOR_V850E2V3_UP
},
679 { "dpa5l", 26, PROCESSOR_V850E2V3_UP
},
680 { "dpa5u", 27, PROCESSOR_V850E2V3_UP
},
681 { "ecr", 4, PROCESSOR_ALL
},
682 { "eh_base", 3, PROCESSOR_V850E2V3_UP
},
683 { "eh_cfg", 1, PROCESSOR_V850E2V3_UP
},
684 { "eh_reset", 2, PROCESSOR_V850E2V3_UP
},
685 { "eiic", 13, PROCESSOR_V850E2_UP
},
686 { "eipc", 0, PROCESSOR_ALL
},
687 { "eipsw", 1, PROCESSOR_ALL
},
688 { "eiwr", 28, PROCESSOR_V850E2_UP
},
689 { "feic", 14, PROCESSOR_V850E2_UP
},
690 { "fepc", 2, PROCESSOR_ALL
},
691 { "fepsw", 3, PROCESSOR_ALL
},
692 { "fewr", 29, PROCESSOR_V850E2_UP
},
693 { "fpcc", 9, PROCESSOR_V850E2V3_UP
},
694 { "fpcfg", 10, PROCESSOR_V850E2V3_UP
},
695 { "fpec", 11, PROCESSOR_V850E2V3_UP
},
696 { "fpepc", 7, PROCESSOR_V850E2V3_UP
},
697 { "fpspc", 27, PROCESSOR_V850E2V3_UP
},
698 { "fpsr", 6, PROCESSOR_V850E2V3_UP
},
699 { "fpst", 8, PROCESSOR_V850E2V3_UP
},
700 { "ipa0l", 6, PROCESSOR_V850E2V3_UP
},
701 { "ipa0u", 7, PROCESSOR_V850E2V3_UP
},
702 { "ipa1l", 8, PROCESSOR_V850E2V3_UP
},
703 { "ipa1u", 9, PROCESSOR_V850E2V3_UP
},
704 { "ipa2l", 10, PROCESSOR_V850E2V3_UP
},
705 { "ipa2u", 11, PROCESSOR_V850E2V3_UP
},
706 { "ipa3l", 12, PROCESSOR_V850E2V3_UP
},
707 { "ipa3u", 13, PROCESSOR_V850E2V3_UP
},
708 { "ipa4l", 14, PROCESSOR_V850E2V3_UP
},
709 { "ipa4u", 15, PROCESSOR_V850E2V3_UP
},
710 { "mca", 24, PROCESSOR_V850E2V3_UP
},
711 { "mcc", 26, PROCESSOR_V850E2V3_UP
},
712 { "mcr", 27, PROCESSOR_V850E2V3_UP
},
713 { "mcs", 25, PROCESSOR_V850E2V3_UP
},
714 { "mpc", 1, PROCESSOR_V850E2V3_UP
},
715 { "mpm", 0, PROCESSOR_V850E2V3_UP
},
716 { "mpu10_dpa0l", 16, PROCESSOR_V850E2V3_UP
},
717 { "mpu10_dpa0u", 17, PROCESSOR_V850E2V3_UP
},
718 { "mpu10_dpa1l", 18, PROCESSOR_V850E2V3_UP
},
719 { "mpu10_dpa1u", 19, PROCESSOR_V850E2V3_UP
},
720 { "mpu10_dpa2l", 20, PROCESSOR_V850E2V3_UP
},
721 { "mpu10_dpa2u", 21, PROCESSOR_V850E2V3_UP
},
722 { "mpu10_dpa3l", 22, PROCESSOR_V850E2V3_UP
},
723 { "mpu10_dpa3u", 23, PROCESSOR_V850E2V3_UP
},
724 { "mpu10_dpa4l", 24, PROCESSOR_V850E2V3_UP
},
725 { "mpu10_dpa4u", 25, PROCESSOR_V850E2V3_UP
},
726 { "mpu10_dpa5l", 26, PROCESSOR_V850E2V3_UP
},
727 { "mpu10_dpa5u", 27, PROCESSOR_V850E2V3_UP
},
728 { "mpu10_ipa0l", 6, PROCESSOR_V850E2V3_UP
},
729 { "mpu10_ipa0u", 7, PROCESSOR_V850E2V3_UP
},
730 { "mpu10_ipa1l", 8, PROCESSOR_V850E2V3_UP
},
731 { "mpu10_ipa1u", 9, PROCESSOR_V850E2V3_UP
},
732 { "mpu10_ipa2l", 10, PROCESSOR_V850E2V3_UP
},
733 { "mpu10_ipa2u", 11, PROCESSOR_V850E2V3_UP
},
734 { "mpu10_ipa3l", 12, PROCESSOR_V850E2V3_UP
},
735 { "mpu10_ipa3u", 13, PROCESSOR_V850E2V3_UP
},
736 { "mpu10_ipa4l", 14, PROCESSOR_V850E2V3_UP
},
737 { "mpu10_ipa4u", 15, PROCESSOR_V850E2V3_UP
},
738 { "mpu10_mpc", 1, PROCESSOR_V850E2V3_UP
},
739 { "mpu10_mpm", 0, PROCESSOR_V850E2V3_UP
},
740 { "mpu10_tid", 2, PROCESSOR_V850E2V3_UP
},
741 { "mpu10_vmadr", 5, PROCESSOR_V850E2V3_UP
},
742 { "mpu10_vmecr", 3, PROCESSOR_V850E2V3_UP
},
743 { "mpu10_vmtid", 4, PROCESSOR_V850E2V3_UP
},
744 { "pid", 6, PROCESSOR_V850E2V3_UP
},
745 { "pmcr0", 4, PROCESSOR_V850E2V3_UP
},
746 { "pmis2", 14, PROCESSOR_V850E2V3_UP
},
747 { "psw", 5, PROCESSOR_ALL
},
748 { "scbp", 12, PROCESSOR_V850E2V3_UP
},
749 { "sccfg", 11, PROCESSOR_V850E2V3_UP
},
750 { "sr0", 0, PROCESSOR_ALL
},
751 { "sr1", 1, PROCESSOR_ALL
},
752 { "sr10", 10, PROCESSOR_ALL
},
753 { "sr11", 11, PROCESSOR_ALL
},
754 { "sr12", 12, PROCESSOR_ALL
},
755 { "sr13", 13, PROCESSOR_ALL
},
756 { "sr14", 14, PROCESSOR_ALL
},
757 { "sr15", 15, PROCESSOR_ALL
},
758 { "sr16", 16, PROCESSOR_ALL
},
759 { "sr17", 17, PROCESSOR_ALL
},
760 { "sr18", 18, PROCESSOR_ALL
},
761 { "sr19", 19, PROCESSOR_ALL
},
762 { "sr2", 2, PROCESSOR_ALL
},
763 { "sr20", 20, PROCESSOR_ALL
},
764 { "sr21", 21, PROCESSOR_ALL
},
765 { "sr22", 22, PROCESSOR_ALL
},
766 { "sr23", 23, PROCESSOR_ALL
},
767 { "sr24", 24, PROCESSOR_ALL
},
768 { "sr25", 25, PROCESSOR_ALL
},
769 { "sr26", 26, PROCESSOR_ALL
},
770 { "sr27", 27, PROCESSOR_ALL
},
771 { "sr28", 28, PROCESSOR_ALL
},
772 { "sr29", 29, PROCESSOR_ALL
},
773 { "sr3", 3, PROCESSOR_ALL
},
774 { "sr30", 30, PROCESSOR_ALL
},
775 { "sr31", 31, PROCESSOR_ALL
},
776 { "sr4", 4, PROCESSOR_ALL
},
777 { "sr5", 5, PROCESSOR_ALL
},
778 { "sr6", 6, PROCESSOR_ALL
},
779 { "sr7", 7, PROCESSOR_ALL
},
780 { "sr8", 8, PROCESSOR_ALL
},
781 { "sr9", 9, PROCESSOR_ALL
},
782 { "sw_base", 3, PROCESSOR_V850E2V3_UP
},
783 { "sw_cfg", 1, PROCESSOR_V850E2V3_UP
},
784 { "sw_ctl", 0, PROCESSOR_V850E2V3_UP
},
785 { "tid", 2, PROCESSOR_V850E2V3_UP
},
786 { "vmadr", 6, PROCESSOR_V850E2V3_UP
},
787 { "vmecr", 4, PROCESSOR_V850E2V3_UP
},
788 { "vmtid", 5, PROCESSOR_V850E2V3_UP
},
789 { "vsadr", 2, PROCESSOR_V850E2V3_UP
},
790 { "vsecr", 0, PROCESSOR_V850E2V3_UP
},
791 { "vstid", 1, PROCESSOR_V850E2V3_UP
},
794 #define SYSREG_NAME_CNT \
795 (sizeof (system_registers) / sizeof (struct reg_name))
798 static const struct reg_name cc_names
[] =
800 { "c", 0x1, PROCESSOR_ALL
},
801 { "e", 0x2, PROCESSOR_ALL
},
802 { "ge", 0xe, PROCESSOR_ALL
},
803 { "gt", 0xf, PROCESSOR_ALL
},
804 { "h", 0xb, PROCESSOR_ALL
},
805 { "l", 0x1, PROCESSOR_ALL
},
806 { "le", 0x7, PROCESSOR_ALL
},
807 { "lt", 0x6, PROCESSOR_ALL
},
808 { "n", 0x4, PROCESSOR_ALL
},
809 { "nc", 0x9, PROCESSOR_ALL
},
810 { "ne", 0xa, PROCESSOR_ALL
},
811 { "nh", 0x3, PROCESSOR_ALL
},
812 { "nl", 0x9, PROCESSOR_ALL
},
813 { "ns", 0xc, PROCESSOR_ALL
},
814 { "nv", 0x8, PROCESSOR_ALL
},
815 { "nz", 0xa, PROCESSOR_ALL
},
816 { "p", 0xc, PROCESSOR_ALL
},
817 { "s", 0x4, PROCESSOR_ALL
},
818 #define COND_SA_NUM 0xd
819 { "sa", COND_SA_NUM
, PROCESSOR_ALL
},
820 { "t", 0x5, PROCESSOR_ALL
},
821 { "v", 0x0, PROCESSOR_ALL
},
822 { "z", 0x2, PROCESSOR_ALL
},
825 #define CC_NAME_CNT \
826 (sizeof (cc_names) / sizeof (struct reg_name))
828 static const struct reg_name float_cc_names
[] =
830 { "eq", 0x2, PROCESSOR_V850E2V3_UP
}, /* true. */
831 { "f", 0x0, PROCESSOR_V850E2V3_UP
}, /* true. */
832 { "ge", 0xd, PROCESSOR_V850E2V3_UP
}, /* false. */
833 { "gl", 0xb, PROCESSOR_V850E2V3_UP
}, /* false. */
834 { "gle", 0x9, PROCESSOR_V850E2V3_UP
}, /* false. */
835 { "gt", 0xf, PROCESSOR_V850E2V3_UP
}, /* false. */
836 { "le", 0xe, PROCESSOR_V850E2V3_UP
}, /* true. */
837 { "lt", 0xc, PROCESSOR_V850E2V3_UP
}, /* true. */
838 { "neq", 0x2, PROCESSOR_V850E2V3_UP
}, /* false. */
839 { "nge", 0xd, PROCESSOR_V850E2V3_UP
}, /* true. */
840 { "ngl", 0xb, PROCESSOR_V850E2V3_UP
}, /* true. */
841 { "ngle",0x9, PROCESSOR_V850E2V3_UP
}, /* true. */
842 { "ngt", 0xf, PROCESSOR_V850E2V3_UP
}, /* true. */
843 { "nle", 0xe, PROCESSOR_V850E2V3_UP
}, /* false. */
844 { "nlt", 0xc, PROCESSOR_V850E2V3_UP
}, /* false. */
845 { "oge", 0x5, PROCESSOR_V850E2V3_UP
}, /* false. */
846 { "ogl", 0x3, PROCESSOR_V850E2V3_UP
}, /* false. */
847 { "ogt", 0x7, PROCESSOR_V850E2V3_UP
}, /* false. */
848 { "ole", 0x6, PROCESSOR_V850E2V3_UP
}, /* true. */
849 { "olt", 0x4, PROCESSOR_V850E2V3_UP
}, /* true. */
850 { "or", 0x1, PROCESSOR_V850E2V3_UP
}, /* false. */
851 { "seq", 0xa, PROCESSOR_V850E2V3_UP
}, /* true. */
852 { "sf", 0x8, PROCESSOR_V850E2V3_UP
}, /* true. */
853 { "sne", 0xa, PROCESSOR_V850E2V3_UP
}, /* false. */
854 { "st", 0x8, PROCESSOR_V850E2V3_UP
}, /* false. */
855 { "t", 0x0, PROCESSOR_V850E2V3_UP
}, /* false. */
856 { "ueq", 0x3, PROCESSOR_V850E2V3_UP
}, /* true. */
857 { "uge", 0x4, PROCESSOR_V850E2V3_UP
}, /* false. */
858 { "ugt", 0x6, PROCESSOR_V850E2V3_UP
}, /* false. */
859 { "ule", 0x7, PROCESSOR_V850E2V3_UP
}, /* true. */
860 { "ult", 0x5, PROCESSOR_V850E2V3_UP
}, /* true. */
861 { "un", 0x1, PROCESSOR_V850E2V3_UP
}, /* true. */
864 #define FLOAT_CC_NAME_CNT \
865 (sizeof (float_cc_names) / sizeof (struct reg_name))
868 static const struct reg_name cacheop_names
[] =
870 { "cfald", 0x44, PROCESSOR_V850E3V5_UP
},
871 { "cfali", 0x40, PROCESSOR_V850E3V5_UP
},
872 { "chbid", 0x04, PROCESSOR_V850E3V5_UP
},
873 { "chbii", 0x00, PROCESSOR_V850E3V5_UP
},
874 { "chbiwbd", 0x06, PROCESSOR_V850E3V5_UP
},
875 { "chbwbd", 0x07, PROCESSOR_V850E3V5_UP
},
876 { "cibid", 0x24, PROCESSOR_V850E3V5_UP
},
877 { "cibii", 0x20, PROCESSOR_V850E3V5_UP
},
878 { "cibiwbd", 0x26, PROCESSOR_V850E3V5_UP
},
879 { "cibwbd", 0x27, PROCESSOR_V850E3V5_UP
},
880 { "cildd", 0x65, PROCESSOR_V850E3V5_UP
},
881 { "cildi", 0x61, PROCESSOR_V850E3V5_UP
},
882 { "cistd", 0x64, PROCESSOR_V850E3V5_UP
},
883 { "cisti", 0x60, PROCESSOR_V850E3V5_UP
},
886 #define CACHEOP_NAME_CNT \
887 (sizeof (cacheop_names) / sizeof (struct reg_name))
889 static const struct reg_name prefop_names
[] =
891 { "prefd", 0x04, PROCESSOR_V850E3V5_UP
},
892 { "prefi", 0x00, PROCESSOR_V850E3V5_UP
},
895 #define PREFOP_NAME_CNT \
896 (sizeof (prefop_names) / sizeof (struct reg_name))
898 static const struct reg_name vector_registers
[] =
900 { "vr0", 0, PROCESSOR_V850E3V5_UP
},
901 { "vr1", 1, PROCESSOR_V850E3V5_UP
},
902 { "vr10", 10, PROCESSOR_V850E3V5_UP
},
903 { "vr11", 11, PROCESSOR_V850E3V5_UP
},
904 { "vr12", 12, PROCESSOR_V850E3V5_UP
},
905 { "vr13", 13, PROCESSOR_V850E3V5_UP
},
906 { "vr14", 14, PROCESSOR_V850E3V5_UP
},
907 { "vr15", 15, PROCESSOR_V850E3V5_UP
},
908 { "vr16", 16, PROCESSOR_V850E3V5_UP
},
909 { "vr17", 17, PROCESSOR_V850E3V5_UP
},
910 { "vr18", 18, PROCESSOR_V850E3V5_UP
},
911 { "vr19", 19, PROCESSOR_V850E3V5_UP
},
912 { "vr2", 2, PROCESSOR_V850E3V5_UP
},
913 { "vr20", 20, PROCESSOR_V850E3V5_UP
},
914 { "vr21", 21, PROCESSOR_V850E3V5_UP
},
915 { "vr22", 22, PROCESSOR_V850E3V5_UP
},
916 { "vr23", 23, PROCESSOR_V850E3V5_UP
},
917 { "vr24", 24, PROCESSOR_V850E3V5_UP
},
918 { "vr25", 25, PROCESSOR_V850E3V5_UP
},
919 { "vr26", 26, PROCESSOR_V850E3V5_UP
},
920 { "vr27", 27, PROCESSOR_V850E3V5_UP
},
921 { "vr28", 28, PROCESSOR_V850E3V5_UP
},
922 { "vr29", 29, PROCESSOR_V850E3V5_UP
},
923 { "vr3", 3, PROCESSOR_V850E3V5_UP
},
924 { "vr30", 30, PROCESSOR_V850E3V5_UP
},
925 { "vr31", 31, PROCESSOR_V850E3V5_UP
},
926 { "vr4", 4, PROCESSOR_V850E3V5_UP
},
927 { "vr5", 5, PROCESSOR_V850E3V5_UP
},
928 { "vr6", 6, PROCESSOR_V850E3V5_UP
},
929 { "vr7", 7, PROCESSOR_V850E3V5_UP
},
930 { "vr8", 8, PROCESSOR_V850E3V5_UP
},
931 { "vr9", 9, PROCESSOR_V850E3V5_UP
},
934 #define VREG_NAME_CNT \
935 (sizeof (vector_registers) / sizeof (struct reg_name))
937 /* Do a binary search of the given register table to see if NAME is a
938 valid register name. Return the register number from the array on
939 success, or -1 on failure. */
942 reg_name_search (const struct reg_name
*regs
,
947 int middle
, low
, high
;
951 /* If the register name is a symbol, then evaluate it. */
952 if ((symbolP
= symbol_find (name
)) != NULL
)
954 /* If the symbol is an alias for another name then use that.
955 If the symbol is an alias for a number, then return the number. */
956 if (symbol_equated_p (symbolP
))
958 = S_GET_NAME (symbol_get_value_expression (symbolP
)->X_add_symbol
);
959 else if (accept_numbers
)
961 int reg
= S_GET_VALUE (symbolP
);
965 /* Otherwise drop through and try parsing name normally. */
973 middle
= (low
+ high
) / 2;
974 cmp
= strcasecmp (name
, regs
[middle
].name
);
980 return ((regs
[middle
].processors
& processor_mask
)
988 /* Summary of register_name().
990 in: Input_line_pointer points to 1st char of operand.
993 The operand may have been a register: in this case, X_op == O_register,
994 X_add_number is set to the register number, and truth is returned.
995 Input_line_pointer->(next non-blank) char after operand, or is in
996 its original state. */
999 register_name (expressionS
*expressionP
)
1006 /* Find the spelling of the operand. */
1007 start
= input_line_pointer
;
1008 c
= get_symbol_name (&name
);
1010 reg_number
= reg_name_search (pre_defined_registers
, REG_NAME_CNT
,
1013 /* Put back the delimiting char. */
1014 (void) restore_line_pointer (c
);
1016 expressionP
->X_add_symbol
= NULL
;
1017 expressionP
->X_op_symbol
= NULL
;
1019 /* Look to see if it's in the register table. */
1020 if (reg_number
>= 0)
1022 expressionP
->X_op
= O_register
;
1023 expressionP
->X_add_number
= reg_number
;
1028 /* Reset the line as if we had not done anything. */
1029 input_line_pointer
= start
;
1031 expressionP
->X_op
= O_illegal
;
1036 /* Summary of system_register_name().
1038 in: INPUT_LINE_POINTER points to 1st char of operand.
1039 EXPRESSIONP points to an expression structure to be filled in.
1040 ACCEPT_NUMBERS is true iff numerical register names may be used.
1042 out: An expressionS structure in expressionP.
1043 The operand may have been a register: in this case, X_op == O_register,
1044 X_add_number is set to the register number, and truth is returned.
1045 Input_line_pointer->(next non-blank) char after operand, or is in
1046 its original state. */
1049 system_register_name (expressionS
*expressionP
,
1050 bool accept_numbers
)
1057 /* Find the spelling of the operand. */
1058 start
= input_line_pointer
;
1059 c
= get_symbol_name (&name
);
1060 reg_number
= reg_name_search (system_registers
, SYSREG_NAME_CNT
, name
,
1063 /* Put back the delimiting char. */
1064 (void) restore_line_pointer (c
);
1069 /* Reset input_line pointer. */
1070 input_line_pointer
= start
;
1072 if (ISDIGIT (*input_line_pointer
))
1074 reg_number
= strtol (input_line_pointer
, &input_line_pointer
, 0);
1078 expressionP
->X_add_symbol
= NULL
;
1079 expressionP
->X_op_symbol
= NULL
;
1081 /* Look to see if it's in the register table. */
1082 if (reg_number
>= 0)
1084 expressionP
->X_op
= O_register
;
1085 expressionP
->X_add_number
= reg_number
;
1090 /* Reset the line as if we had not done anything. */
1091 input_line_pointer
= start
;
1093 expressionP
->X_op
= O_illegal
;
1098 /* Summary of cc_name().
1100 in: INPUT_LINE_POINTER points to 1st char of operand.
1102 out: An expressionS.
1103 The operand may have been a register: in this case, X_op == O_register,
1104 X_add_number is set to the register number, and truth is returned.
1105 Input_line_pointer->(next non-blank) char after operand, or is in
1106 its original state. */
1109 cc_name (expressionS
*expressionP
,
1110 bool accept_numbers
)
1117 /* Find the spelling of the operand. */
1118 start
= input_line_pointer
;
1119 c
= get_symbol_name (&name
);
1120 reg_number
= reg_name_search (cc_names
, CC_NAME_CNT
, name
, accept_numbers
);
1122 /* Put back the delimiting char. */
1123 (void) restore_line_pointer (c
);
1128 /* Reset input_line pointer. */
1129 input_line_pointer
= start
;
1131 if (ISDIGIT (*input_line_pointer
))
1133 reg_number
= strtol (input_line_pointer
, &input_line_pointer
, 0);
1137 expressionP
->X_add_symbol
= NULL
;
1138 expressionP
->X_op_symbol
= NULL
;
1140 /* Look to see if it's in the register table. */
1141 if (reg_number
>= 0)
1143 expressionP
->X_op
= O_constant
;
1144 expressionP
->X_add_number
= reg_number
;
1149 /* Reset the line as if we had not done anything. */
1150 input_line_pointer
= start
;
1152 expressionP
->X_op
= O_illegal
;
1153 expressionP
->X_add_number
= 0;
1159 float_cc_name (expressionS
*expressionP
,
1160 bool accept_numbers
)
1167 /* Find the spelling of the operand. */
1168 start
= input_line_pointer
;
1169 c
= get_symbol_name (&name
);
1170 reg_number
= reg_name_search (float_cc_names
, FLOAT_CC_NAME_CNT
, name
, accept_numbers
);
1172 /* Put back the delimiting char. */
1173 (void) restore_line_pointer (c
);
1178 /* Reset input_line pointer. */
1179 input_line_pointer
= start
;
1181 if (ISDIGIT (*input_line_pointer
))
1183 reg_number
= strtol (input_line_pointer
, &input_line_pointer
, 0);
1187 expressionP
->X_add_symbol
= NULL
;
1188 expressionP
->X_op_symbol
= NULL
;
1190 /* Look to see if it's in the register table. */
1191 if (reg_number
>= 0)
1193 expressionP
->X_op
= O_constant
;
1194 expressionP
->X_add_number
= reg_number
;
1199 /* Reset the line as if we had not done anything. */
1200 input_line_pointer
= start
;
1202 expressionP
->X_op
= O_illegal
;
1203 expressionP
->X_add_number
= 0;
1209 cacheop_name (expressionS
* expressionP
,
1210 bool accept_numbers
)
1217 /* Find the spelling of the operand. */
1218 start
= input_line_pointer
;
1219 c
= get_symbol_name (&name
);
1220 reg_number
= reg_name_search (cacheop_names
, CACHEOP_NAME_CNT
, name
, accept_numbers
);
1222 /* Put back the delimiting char. */
1223 (void) restore_line_pointer (c
);
1228 /* Reset input_line pointer. */
1229 input_line_pointer
= start
;
1231 if (ISDIGIT (*input_line_pointer
))
1232 reg_number
= strtol (input_line_pointer
, &input_line_pointer
, 0);
1235 expressionP
->X_add_symbol
= NULL
;
1236 expressionP
->X_op_symbol
= NULL
;
1238 /* Look to see if it's in the register table. */
1239 if (reg_number
>= 0)
1241 expressionP
->X_op
= O_constant
;
1242 expressionP
->X_add_number
= reg_number
;
1247 /* Reset the line as if we had not done anything. */
1248 input_line_pointer
= start
;
1250 expressionP
->X_op
= O_illegal
;
1251 expressionP
->X_add_number
= 0;
1257 prefop_name (expressionS
* expressionP
,
1258 bool accept_numbers
)
1265 /* Find the spelling of the operand. */
1266 start
= input_line_pointer
;
1267 c
= get_symbol_name (&name
);
1268 reg_number
= reg_name_search (prefop_names
, PREFOP_NAME_CNT
, name
, accept_numbers
);
1270 /* Put back the delimiting char. */
1271 (void) restore_line_pointer (c
);
1276 /* Reset input_line pointer. */
1277 input_line_pointer
= start
;
1279 if (ISDIGIT (*input_line_pointer
))
1280 reg_number
= strtol (input_line_pointer
, &input_line_pointer
, 0);
1283 expressionP
->X_add_symbol
= NULL
;
1284 expressionP
->X_op_symbol
= NULL
;
1286 /* Look to see if it's in the register table. */
1287 if (reg_number
>= 0)
1289 expressionP
->X_op
= O_constant
;
1290 expressionP
->X_add_number
= reg_number
;
1295 /* Reset the line as if we had not done anything. */
1296 input_line_pointer
= start
;
1298 expressionP
->X_op
= O_illegal
;
1299 expressionP
->X_add_number
= 0;
1305 vector_register_name (expressionS
*expressionP
)
1312 /* Find the spelling of the operand. */
1313 start
= input_line_pointer
;
1314 c
= get_symbol_name (&name
);
1316 reg_number
= reg_name_search (vector_registers
, VREG_NAME_CNT
,
1319 /* Put back the delimiting char. */
1320 (void) restore_line_pointer (c
);
1322 expressionP
->X_add_symbol
= NULL
;
1323 expressionP
->X_op_symbol
= NULL
;
1325 /* Look to see if it's in the register table. */
1326 if (reg_number
>= 0)
1328 expressionP
->X_op
= O_register
;
1329 expressionP
->X_add_number
= reg_number
;
1334 /* Reset the line as if we had not done anything. */
1335 input_line_pointer
= start
;
1337 expressionP
->X_op
= O_illegal
;
1343 skip_white_space (void)
1345 while (*input_line_pointer
== ' '
1346 || *input_line_pointer
== '\t')
1347 ++input_line_pointer
;
1350 /* Summary of parse_register_list ().
1352 in: INPUT_LINE_POINTER points to 1st char of a list of registers.
1353 INSN is the partially constructed instruction.
1354 OPERAND is the operand being inserted.
1356 out: NULL if the parse completed successfully, otherwise a
1357 pointer to an error message is returned. If the parse
1358 completes the correct bit fields in the instruction
1361 Parses register lists with the syntax:
1369 and also parses constant expressions whose bits indicate the
1370 registers in the lists. The LSB in the expression refers to
1371 the lowest numbered permissible register in the register list,
1372 and so on upwards. System registers are considered to be very
1376 parse_register_list (unsigned long *insn
,
1377 const struct v850_operand
*operand
)
1379 static int type1_regs
[32] =
1381 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1382 0, 0, 0, 0, 0, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
1388 /* Select a register array to parse. */
1389 switch (operand
->shift
)
1391 case 0xffe00001: regs
= type1_regs
; break;
1393 as_bad (_("unknown operand shift: %x\n"), operand
->shift
);
1394 return _("internal failure in parse_register_list");
1397 skip_white_space ();
1399 /* If the expression starts with a curly brace it is a register list.
1400 Otherwise it is a constant expression, whose bits indicate which
1401 registers are to be included in the list. */
1402 if (*input_line_pointer
!= '{')
1409 if (exp
.X_op
!= O_constant
)
1410 return _("constant expression or register list expected");
1412 if (regs
== type1_regs
)
1414 if (exp
.X_add_number
& 0xFFFFF000)
1415 return _("high bits set in register list expression");
1417 for (reg
= 20; reg
< 32; reg
++)
1418 if (exp
.X_add_number
& (1 << (reg
- 20)))
1420 for (i
= 0; i
< 32; i
++)
1429 input_line_pointer
++;
1431 /* Parse the register list until a terminator (closing curly brace or
1432 new-line) is found. */
1435 skip_white_space ();
1437 if (register_name (&exp
))
1441 /* Locate the given register in the list, and if it is there,
1442 insert the corresponding bit into the instruction. */
1443 for (i
= 0; i
< 32; i
++)
1445 if (regs
[i
] == exp
.X_add_number
)
1453 return _("illegal register included in list");
1455 else if (system_register_name (&exp
, true))
1457 if (regs
== type1_regs
)
1459 return _("system registers cannot be included in list");
1463 if (*input_line_pointer
== '}')
1465 input_line_pointer
++;
1468 else if (*input_line_pointer
== ',')
1470 input_line_pointer
++;
1473 else if (*input_line_pointer
== '-')
1475 /* We have encountered a range of registers: rX - rY. */
1479 /* Skip the dash. */
1480 ++input_line_pointer
;
1482 /* Get the second register in the range. */
1483 if (! register_name (&exp2
))
1485 return _("second register should follow dash in register list");
1488 if (exp
.X_add_number
> exp2
.X_add_number
)
1490 return _("second register should be greater than first register");
1493 /* Add the rest of the registers in the range. */
1494 for (j
= exp
.X_add_number
+ 1; j
<= exp2
.X_add_number
; j
++)
1498 /* Locate the given register in the list, and if it is there,
1499 insert the corresponding bit into the instruction. */
1500 for (i
= 0; i
< 32; i
++)
1510 return _("illegal register included in list");
1522 const char *md_shortopts
= "m:";
1524 struct option md_longopts
[] =
1526 #define OPTION_DISP_SIZE_DEFAULT_22 (OPTION_MD_BASE)
1527 {"disp-size-default-22", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_22
},
1528 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 1)
1529 {"disp-size-default-32", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_32
},
1530 {NULL
, no_argument
, NULL
, 0}
1533 size_t md_longopts_size
= sizeof (md_longopts
);
1535 static bool v850_data_8
= false;
1538 md_show_usage (FILE *stream
)
1540 fprintf (stream
, _(" V850 options:\n"));
1541 fprintf (stream
, _(" -mwarn-signed-overflow Warn if signed immediate values overflow\n"));
1542 fprintf (stream
, _(" -mwarn-unsigned-overflow Warn if unsigned immediate values overflow\n"));
1543 fprintf (stream
, _(" -mv850 The code is targeted at the v850\n"));
1544 fprintf (stream
, _(" -mv850e The code is targeted at the v850e\n"));
1545 fprintf (stream
, _(" -mv850e1 The code is targeted at the v850e1\n"));
1546 fprintf (stream
, _(" -mv850e2 The code is targeted at the v850e2\n"));
1547 fprintf (stream
, _(" -mv850e2v3 The code is targeted at the v850e2v3\n"));
1548 fprintf (stream
, _(" -mv850e2v4 Alias for -mv850e3v5\n"));
1549 fprintf (stream
, _(" -mv850e3v5 The code is targeted at the v850e3v5\n"));
1550 fprintf (stream
, _(" -mrelax Enable relaxation\n"));
1551 fprintf (stream
, _(" --disp-size-default-22 branch displacement with unknown size is 22 bits (default)\n"));
1552 fprintf (stream
, _(" --disp-size-default-32 branch displacement with unknown size is 32 bits\n"));
1553 fprintf (stream
, _(" -mextension enable extension opcode support\n"));
1554 fprintf (stream
, _(" -mno-bcond17 disable b<cond> disp17 instruction\n"));
1555 fprintf (stream
, _(" -mno-stld23 disable st/ld offset23 instruction\n"));
1556 fprintf (stream
, _(" -mgcc-abi Mark the binary as using the old GCC ABI\n"));
1557 fprintf (stream
, _(" -mrh850-abi Mark the binary as using the RH850 ABI (default)\n"));
1558 fprintf (stream
, _(" -m8byte-align Mark the binary as using 64-bit alignment\n"));
1559 fprintf (stream
, _(" -m4byte-align Mark the binary as using 32-bit alignment (default)\n"));
1560 fprintf (stream
, _(" -msoft-float Mark the binary as not using FP insns (default for pre e2v3)\n"));
1561 fprintf (stream
, _(" -mhard-float Mark the binary as using FP insns (default for e2v3 and up)\n"));
1565 md_parse_option (int c
, const char *arg
)
1571 case OPTION_DISP_SIZE_DEFAULT_22
:
1572 default_disp_size
= 22;
1575 case OPTION_DISP_SIZE_DEFAULT_32
:
1576 default_disp_size
= 32;
1582 if (strcmp (arg
, "warn-signed-overflow") == 0)
1583 warn_signed_overflows
= true;
1585 else if (strcmp (arg
, "warn-unsigned-overflow") == 0)
1586 warn_unsigned_overflows
= true;
1588 else if (strcmp (arg
, "v850") == 0)
1591 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850
);
1593 else if (strcmp (arg
, "v850e") == 0)
1595 machine
= bfd_mach_v850e
;
1596 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E
);
1598 else if (strcmp (arg
, "v850e1") == 0)
1600 machine
= bfd_mach_v850e1
;
1601 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E1
);
1603 else if (strcmp (arg
, "v850e2") == 0)
1605 machine
= bfd_mach_v850e2
;
1606 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E2
);
1608 else if (strcmp (arg
, "v850e2v3") == 0)
1610 machine
= bfd_mach_v850e2v3
;
1611 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E2V3
);
1613 else if (strcmp (arg
, "v850e2v4") == 0)
1615 machine
= bfd_mach_v850e3v5
;
1616 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E3V5
);
1618 else if (strcmp (arg
, "v850e3v5") == 0)
1620 machine
= bfd_mach_v850e3v5
;
1621 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E3V5
);
1623 else if (strcmp (arg
, "extension") == 0)
1625 processor_mask
|= PROCESSOR_OPTION_EXTENSION
| PROCESSOR_OPTION_ALIAS
;
1627 else if (strcmp (arg
, "no-bcond17") == 0)
1631 else if (strcmp (arg
, "no-stld23") == 0)
1635 else if (strcmp (arg
, "relax") == 0)
1637 else if (strcmp (arg
, "gcc-abi") == 0)
1639 v850_target_arch
= bfd_arch_v850
;
1640 v850_target_format
= "elf32-v850";
1642 else if (strcmp (arg
, "rh850-abi") == 0)
1644 v850_target_arch
= bfd_arch_v850_rh850
;
1645 v850_target_format
= "elf32-v850-rh850";
1647 else if (strcmp (arg
, "8byte-align") == 0)
1650 v850_e_flags
|= EF_RH850_DATA_ALIGN8
;
1652 else if (strcmp (arg
, "4byte-align") == 0)
1654 v850_data_8
= false;
1655 v850_e_flags
&= ~ EF_RH850_DATA_ALIGN8
;
1657 else if (strcmp (arg
, "soft-float") == 0)
1659 else if (strcmp (arg
, "hard-float") == 0)
1668 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
1674 md_atof (int type
, char *litp
, int *sizep
)
1676 return ieee_md_atof (type
, litp
, sizep
, false);
1682 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
1688 bfd_reloc_code_real_type fx_r_type
;
1692 subseg_change (sec
, 0);
1694 opcode_converter
.fr_opcode
= fragP
->fr_opcode
;
1696 subseg_change (sec
, 0);
1698 if (fragP
->fr_subtype
== SUBYPTE_LOOP_16_22
)
1700 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
1701 fragP
->fr_offset
, 1,
1702 BFD_RELOC_UNUSED
+ opcode_converter
.fx_r_type
);
1705 else if (fragP
->fr_subtype
== SUBYPTE_LOOP_16_22
+ 1)
1707 unsigned char * buffer
=
1708 (unsigned char *) (fragP
->fr_fix
+ &fragP
->fr_literal
[0]);
1709 int loop_reg
= (buffer
[0] & 0x1f);
1712 md_number_to_chars ((char *) buffer
, 0x025f | (loop_reg
<< 11), 2);
1713 /* Now create the conditional branch + fixup to the final target. */
1714 /* 0x000107ea = bne LBL(disp17). */
1715 md_number_to_chars ((char *) buffer
+ 2, 0x000107ea, 4);
1716 fix_new (fragP
, fragP
->fr_fix
+ 2, 4, fragP
->fr_symbol
,
1717 fragP
->fr_offset
, 1,
1718 BFD_RELOC_V850_17_PCREL
);
1721 /* In range conditional or unconditional branch. */
1722 else if (fragP
->fr_subtype
== SUBYPTE_COND_9_22
1723 || fragP
->fr_subtype
== SUBYPTE_UNCOND_9_22
1724 || fragP
->fr_subtype
== SUBYPTE_COND_9_22_32
1725 || fragP
->fr_subtype
== SUBYPTE_UNCOND_9_22_32
1726 || fragP
->fr_subtype
== SUBYPTE_COND_9_17_22
1727 || fragP
->fr_subtype
== SUBYPTE_COND_9_17_22_32
1728 || fragP
->fr_subtype
== SUBYPTE_SA_9_22
1729 || fragP
->fr_subtype
== SUBYPTE_SA_9_22_32
1730 || fragP
->fr_subtype
== SUBYPTE_SA_9_17_22
1731 || fragP
->fr_subtype
== SUBYPTE_SA_9_17_22_32
)
1734 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
1735 fragP
->fr_offset
, 1,
1736 BFD_RELOC_UNUSED
+ opcode_converter
.fx_r_type
);
1739 /* V850e2r-v3 17bit conditional branch. */
1740 else if (fragP
->fr_subtype
== SUBYPTE_COND_9_17_22
+ 1
1741 || fragP
->fr_subtype
== SUBYPTE_COND_9_17_22_32
+ 1
1742 || fragP
->fr_subtype
== SUBYPTE_SA_9_17_22
+ 1
1743 || fragP
->fr_subtype
== SUBYPTE_SA_9_17_22_32
+ 1)
1745 unsigned char *buffer
=
1746 (unsigned char *) (fragP
->fr_fix
+ &fragP
->fr_literal
[0]);
1748 buffer
[0] &= 0x0f; /* Use condition. */
1752 /* Now create the unconditional branch + fixup to the final
1754 md_number_to_chars ((char *) buffer
+ 2, 0x0001, 2);
1755 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
1756 fragP
->fr_offset
, 1, BFD_RELOC_V850_17_PCREL
);
1759 /* Out of range conditional branch. Emit a branch around a 22bit jump. */
1760 else if (fragP
->fr_subtype
== SUBYPTE_COND_9_22
+ 1
1761 || fragP
->fr_subtype
== SUBYPTE_COND_9_22_32
+ 1
1762 || fragP
->fr_subtype
== SUBYPTE_COND_9_17_22
+ 2
1763 || fragP
->fr_subtype
== SUBYPTE_COND_9_17_22_32
+ 2)
1765 unsigned char *buffer
=
1766 (unsigned char *) (fragP
->fr_fix
+ fragP
->fr_literal
);
1768 /* Reverse the condition of the first branch. */
1770 /* Mask off all the displacement bits. */
1773 /* Now set the displacement bits so that we branch
1774 around the unconditional branch. */
1777 /* Now create the unconditional branch + fixup to the final
1779 md_number_to_chars ((char *) buffer
+ 2, 0x00000780, 4);
1780 fix_new (fragP
, fragP
->fr_fix
+ 2, 4, fragP
->fr_symbol
,
1781 fragP
->fr_offset
, 1, BFD_RELOC_V850_22_PCREL
);
1784 /* Out of range conditional branch. Emit a branch around a 32bit jump. */
1785 else if (fragP
->fr_subtype
== SUBYPTE_COND_9_22_32
+ 2
1786 || fragP
->fr_subtype
== SUBYPTE_COND_9_17_22_32
+ 3)
1788 unsigned char *buffer
=
1789 (unsigned char *) (fragP
->fr_fix
+ fragP
->fr_literal
);
1791 /* Reverse the condition of the first branch. */
1793 /* Mask off all the displacement bits. */
1796 /* Now set the displacement bits so that we branch
1797 around the unconditional branch. */
1800 /* Now create the unconditional branch + fixup to the final
1802 md_number_to_chars ((char *) buffer
+ 2, 0x02e0, 2);
1803 fix_new (fragP
, fragP
->fr_fix
+ 4, 4, fragP
->fr_symbol
,
1804 fragP
->fr_offset
+ 2, 1, BFD_RELOC_V850_32_PCREL
);
1807 /* Out of range unconditional branch. Emit a 22bit jump. */
1808 else if (fragP
->fr_subtype
== SUBYPTE_UNCOND_9_22
+ 1
1809 || fragP
->fr_subtype
== SUBYPTE_UNCOND_9_22_32
+ 1)
1811 md_number_to_chars (fragP
->fr_fix
+ fragP
->fr_literal
, 0x00000780, 4);
1812 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
1813 fragP
->fr_offset
, 1, BFD_RELOC_V850_22_PCREL
);
1816 /* Out of range unconditional branch. Emit a 32bit jump. */
1817 else if (fragP
->fr_subtype
== SUBYPTE_UNCOND_9_22_32
+ 2)
1819 md_number_to_chars (fragP
->fr_fix
+ fragP
->fr_literal
, 0x02e0, 2);
1820 fix_new (fragP
, fragP
->fr_fix
+ 4, 4, fragP
->fr_symbol
,
1821 fragP
->fr_offset
+ 2, 1, BFD_RELOC_V850_32_PCREL
);
1824 /* Out of range SA conditional branch. Emit a branch to a 22bit jump. */
1825 else if (fragP
->fr_subtype
== SUBYPTE_SA_9_22
+ 1
1826 || fragP
->fr_subtype
== SUBYPTE_SA_9_22_32
+ 1
1827 || fragP
->fr_subtype
== SUBYPTE_SA_9_17_22
+ 2
1828 || fragP
->fr_subtype
== SUBYPTE_SA_9_17_22_32
+ 2)
1830 unsigned char *buffer
=
1831 (unsigned char *) (fragP
->fr_fix
+ fragP
->fr_literal
);
1839 md_number_to_chars ((char *) buffer
+ 2, 0x05b5, 2);
1841 /* Now create the unconditional branch + fixup to the final
1844 md_number_to_chars ((char *) buffer
+ 4, 0x00000780, 4);
1845 fix_new (fragP
, fragP
->fr_fix
+ 4, 4, fragP
->fr_symbol
,
1846 fragP
->fr_offset
, 1,
1847 BFD_RELOC_V850_22_PCREL
);
1850 /* Out of range SA conditional branch. Emit a branch around a 32bit jump. */
1851 else if (fragP
->fr_subtype
== SUBYPTE_SA_9_22_32
+ 2
1852 || fragP
->fr_subtype
== SUBYPTE_SA_9_17_22_32
+ 3)
1854 unsigned char *buffer
=
1855 (unsigned char *) (fragP
->fr_fix
+ fragP
->fr_literal
);
1863 md_number_to_chars ((char *) buffer
+ 2, 0x05c5, 2);
1865 /* Now create the unconditional branch + fixup to the final
1868 md_number_to_chars ((char *) buffer
+ 4, 0x02e0, 2);
1869 fix_new (fragP
, fragP
->fr_fix
+ 6, 4, fragP
->fr_symbol
,
1870 fragP
->fr_offset
+ 2, 1, BFD_RELOC_V850_32_PCREL
);
1872 fragP
->fr_fix
+= 10;
1879 md_section_align (asection
*seg
, valueT addr
)
1881 int align
= bfd_section_alignment (seg
);
1882 return ((addr
+ (1 << align
) - 1) & -(1 << align
));
1888 const char *prev_name
= "";
1889 const struct v850_opcode
*op
;
1891 if (startswith (TARGET_CPU
, "v850e3v5"))
1894 machine
= bfd_mach_v850e3v5
;
1896 if (!processor_mask
)
1897 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E3V5
);
1899 else if (startswith (TARGET_CPU
, "v850e2v4"))
1902 machine
= bfd_mach_v850e3v5
;
1904 if (!processor_mask
)
1905 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E3V5
);
1907 else if (startswith (TARGET_CPU
, "v850e2v3"))
1910 machine
= bfd_mach_v850e2v3
;
1912 if (!processor_mask
)
1913 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E2V3
);
1915 else if (startswith (TARGET_CPU
, "v850e2"))
1918 machine
= bfd_mach_v850e2
;
1920 if (!processor_mask
)
1921 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E2
);
1923 else if (startswith (TARGET_CPU
, "v850e1"))
1926 machine
= bfd_mach_v850e1
;
1928 if (!processor_mask
)
1929 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E1
);
1931 else if (startswith (TARGET_CPU
, "v850e"))
1934 machine
= bfd_mach_v850e
;
1936 if (!processor_mask
)
1937 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850E
);
1939 else if (startswith (TARGET_CPU
, "v850"))
1944 if (!processor_mask
)
1945 SET_PROCESSOR_MASK (processor_mask
, PROCESSOR_V850
);
1948 /* xgettext:c-format */
1949 as_bad (_("Unable to determine default target processor from string: %s"),
1952 if (soft_float
== -1)
1953 soft_float
= machine
< bfd_mach_v850e2v3
;
1955 v850_hash
= str_htab_create ();
1957 /* Insert unique names into hash table. The V850 instruction set
1958 has many identical opcode names that have different opcodes based
1959 on the operands. This hash table then provides a quick index to
1960 the first opcode with a particular name in the opcode table. */
1964 if (strcmp (prev_name
, op
->name
))
1966 prev_name
= (char *) op
->name
;
1967 str_hash_insert (v850_hash
, op
->name
, op
, 0);
1972 v850_seg_table
[BSS_SECTION
].s
= bss_section
;
1973 bfd_set_arch_mach (stdoutput
, v850_target_arch
, machine
);
1974 bfd_set_private_flags (stdoutput
, v850_e_flags
);
1978 static bfd_reloc_code_real_type
1979 handle_hi016 (const struct v850_operand
*operand
, const char **errmsg
)
1981 if (operand
== NULL
)
1982 return BFD_RELOC_HI16
;
1984 if (operand
->default_reloc
== BFD_RELOC_HI16
)
1985 return BFD_RELOC_HI16
;
1987 if (operand
->default_reloc
== BFD_RELOC_HI16_S
)
1988 return BFD_RELOC_HI16
;
1990 if (operand
->default_reloc
== BFD_RELOC_16
)
1991 return BFD_RELOC_HI16
;
1993 *errmsg
= _("hi0() relocation used on an instruction which does "
1995 return BFD_RELOC_64
; /* Used to indicate an error condition. */
1998 static bfd_reloc_code_real_type
1999 handle_hi16 (const struct v850_operand
*operand
, const char **errmsg
)
2001 if (operand
== NULL
)
2002 return BFD_RELOC_HI16_S
;
2004 if (operand
->default_reloc
== BFD_RELOC_HI16_S
)
2005 return BFD_RELOC_HI16_S
;
2007 if (operand
->default_reloc
== BFD_RELOC_HI16
)
2008 return BFD_RELOC_HI16_S
;
2010 if (operand
->default_reloc
== BFD_RELOC_16
)
2011 return BFD_RELOC_HI16_S
;
2013 *errmsg
= _("hi() relocation used on an instruction which does "
2015 return BFD_RELOC_64
; /* Used to indicate an error condition. */
2018 static bfd_reloc_code_real_type
2019 handle_lo16 (const struct v850_operand
*operand
, const char **errmsg
)
2021 if (operand
== NULL
)
2022 return BFD_RELOC_LO16
;
2024 switch (operand
->default_reloc
)
2026 case BFD_RELOC_LO16
: return BFD_RELOC_LO16
;
2027 case BFD_RELOC_V850_LO16_SPLIT_OFFSET
: return BFD_RELOC_V850_LO16_SPLIT_OFFSET
;
2028 case BFD_RELOC_V850_16_SPLIT_OFFSET
: return BFD_RELOC_V850_LO16_SPLIT_OFFSET
;
2029 case BFD_RELOC_V850_16_S1
: return BFD_RELOC_V850_LO16_S1
;
2030 case BFD_RELOC_16
: return BFD_RELOC_LO16
;
2032 *errmsg
= _("lo() relocation used on an instruction which does "
2034 return BFD_RELOC_64
; /* Used to indicate an error condition. */
2038 static bfd_reloc_code_real_type
2039 handle_ctoff (const struct v850_operand
*operand
, const char **errmsg
)
2041 if (v850_target_arch
== bfd_arch_v850_rh850
)
2043 *errmsg
= _("ctoff() is not supported by the rh850 ABI. Use -mgcc-abi instead");
2044 return BFD_RELOC_64
; /* Used to indicate an error condition. */
2047 if (operand
== NULL
)
2048 return BFD_RELOC_V850_CALLT_16_16_OFFSET
;
2050 if (operand
->default_reloc
== BFD_RELOC_V850_CALLT_6_7_OFFSET
)
2051 return operand
->default_reloc
;
2053 if (operand
->default_reloc
== BFD_RELOC_V850_16_S1
)
2054 return BFD_RELOC_V850_CALLT_15_16_OFFSET
;
2056 if (operand
->default_reloc
== BFD_RELOC_16
)
2057 return BFD_RELOC_V850_CALLT_16_16_OFFSET
;
2059 *errmsg
= _("ctoff() relocation used on an instruction which does not support it");
2060 return BFD_RELOC_64
; /* Used to indicate an error condition. */
2063 static bfd_reloc_code_real_type
2064 handle_sdaoff (const struct v850_operand
*operand
, const char **errmsg
)
2066 if (operand
== NULL
)
2067 return BFD_RELOC_V850_SDA_16_16_OFFSET
;
2069 if (operand
->default_reloc
== BFD_RELOC_V850_16_SPLIT_OFFSET
)
2070 return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
;
2072 if (operand
->default_reloc
== BFD_RELOC_16
)
2073 return BFD_RELOC_V850_SDA_16_16_OFFSET
;
2075 if (operand
->default_reloc
== BFD_RELOC_V850_16_S1
)
2076 return BFD_RELOC_V850_SDA_15_16_OFFSET
;
2078 *errmsg
= _("sdaoff() relocation used on an instruction which does not support it");
2079 return BFD_RELOC_64
; /* Used to indicate an error condition. */
2082 static bfd_reloc_code_real_type
2083 handle_zdaoff (const struct v850_operand
*operand
, const char **errmsg
)
2085 if (operand
== NULL
)
2086 return BFD_RELOC_V850_ZDA_16_16_OFFSET
;
2088 if (operand
->default_reloc
== BFD_RELOC_V850_16_SPLIT_OFFSET
)
2089 return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
;
2091 if (operand
->default_reloc
== BFD_RELOC_16
)
2092 return BFD_RELOC_V850_ZDA_16_16_OFFSET
;
2094 if (operand
->default_reloc
== BFD_RELOC_V850_16_S1
)
2095 return BFD_RELOC_V850_ZDA_15_16_OFFSET
;
2097 *errmsg
= _("zdaoff() relocation used on an instruction which does not support it");
2098 return BFD_RELOC_64
; /* Used to indicate an error condition. */
2101 static bfd_reloc_code_real_type
2102 handle_tdaoff (const struct v850_operand
*operand
, const char **errmsg
)
2104 if (operand
== NULL
)
2105 /* Data item, not an instruction. */
2106 return BFD_RELOC_V850_TDA_16_16_OFFSET
;
2108 switch (operand
->default_reloc
)
2110 /* sld.hu, operand: D5-4. */
2111 case BFD_RELOC_V850_TDA_4_5_OFFSET
:
2112 /* sld.bu, operand: D4. */
2113 case BFD_RELOC_V850_TDA_4_4_OFFSET
:
2114 /* sld.w/sst.w, operand: D8_6. */
2115 case BFD_RELOC_V850_TDA_6_8_OFFSET
:
2116 /* sld.h/sst.h, operand: D8_7. */
2117 case BFD_RELOC_V850_TDA_7_8_OFFSET
:
2118 /* sld.b/sst.b, operand: D7. */
2119 case BFD_RELOC_V850_TDA_7_7_OFFSET
:
2120 return operand
->default_reloc
;
2125 if (operand
->default_reloc
== BFD_RELOC_16
&& operand
->shift
== 16)
2126 /* set1 & chums, operands: D16. */
2127 return BFD_RELOC_V850_TDA_16_16_OFFSET
;
2129 *errmsg
= _("tdaoff() relocation used on an instruction which does not support it");
2130 /* Used to indicate an error condition. */
2131 return BFD_RELOC_64
;
2134 /* Warning: The code in this function relies upon the definitions
2135 in the v850_operands[] array (defined in opcodes/v850-opc.c)
2136 matching the hard coded values contained herein. */
2138 static bfd_reloc_code_real_type
2139 v850_reloc_prefix (const struct v850_operand
*operand
, const char **errmsg
)
2141 bool paren_skipped
= false;
2143 /* Skip leading opening parenthesis. */
2144 if (*input_line_pointer
== '(')
2146 ++input_line_pointer
;
2147 paren_skipped
= true;
2150 #define CHECK_(name, reloc) \
2151 if (strncmp (input_line_pointer, name "(", strlen (name) + 1) == 0) \
2153 input_line_pointer += strlen (name); \
2157 CHECK_ ("hi0", handle_hi016 (operand
, errmsg
));
2158 CHECK_ ("hi", handle_hi16 (operand
, errmsg
));
2159 CHECK_ ("lo", handle_lo16 (operand
, errmsg
));
2160 CHECK_ ("sdaoff", handle_sdaoff (operand
, errmsg
));
2161 CHECK_ ("zdaoff", handle_zdaoff (operand
, errmsg
));
2162 CHECK_ ("tdaoff", handle_tdaoff (operand
, errmsg
));
2163 CHECK_ ("hilo", BFD_RELOC_32
);
2164 CHECK_ ("lo23", BFD_RELOC_V850_23
);
2165 CHECK_ ("ctoff", handle_ctoff (operand
, errmsg
));
2167 /* Restore skipped parenthesis. */
2169 --input_line_pointer
;
2171 return BFD_RELOC_NONE
;
2174 /* Insert an operand value into an instruction. */
2176 static unsigned long
2177 v850_insert_operand (unsigned long insn
,
2178 const struct v850_operand
*operand
,
2180 const char **errmsg
)
2182 if (operand
->insert
)
2184 const char *message
= NULL
;
2186 insn
= operand
->insert (insn
, val
, &message
);
2187 if (message
!= NULL
)
2189 if ((operand
->flags
& V850_OPERAND_SIGNED
)
2190 && ! warn_signed_overflows
2191 && v850_msg_is_out_of_range (message
))
2193 /* Skip warning... */
2195 else if ((operand
->flags
& V850_OPERAND_SIGNED
) == 0
2196 && ! warn_unsigned_overflows
2197 && v850_msg_is_out_of_range (message
))
2199 /* Skip warning... */
2208 else if (operand
->bits
== -1
2209 || operand
->flags
& V850E_IMMEDIATE16
2210 || operand
->flags
& V850E_IMMEDIATE23
2211 || operand
->flags
& V850E_IMMEDIATE32
)
2217 if (operand
->bits
< 32)
2221 if ((operand
->flags
& V850_OPERAND_SIGNED
) != 0)
2223 if (! warn_signed_overflows
)
2224 max
= (1 << operand
->bits
) - 1;
2226 max
= (1 << (operand
->bits
- 1)) - 1;
2228 min
= -(1 << (operand
->bits
- 1));
2232 max
= (1 << operand
->bits
) - 1;
2234 if (! warn_unsigned_overflows
)
2235 min
= -(1 << (operand
->bits
- 1));
2240 /* Some people write constants with the sign extension done by
2241 hand but only up to 32 bits. This shouldn't really be valid,
2242 but, to permit this code to assemble on a 64-bit host, we
2243 sign extend the 32-bit value to 64 bits if so doing makes the
2246 && (offsetT
) (val
- 0x80000000 - 0x80000000) >= min
2247 && (offsetT
) (val
- 0x80000000 - 0x80000000) <= max
)
2248 val
= val
- 0x80000000 - 0x80000000;
2250 /* Similarly, people write expressions like ~(1<<15), and expect
2251 this to be OK for a 32-bit unsigned value. */
2253 && (offsetT
) (val
+ 0x80000000 + 0x80000000) >= min
2254 && (offsetT
) (val
+ 0x80000000 + 0x80000000) <= max
)
2255 val
= val
+ 0x80000000 + 0x80000000;
2257 else if (val
< (offsetT
) min
|| val
> (offsetT
) max
)
2259 static char buf
[128];
2261 /* Restore min and mix to expected values for decimal ranges. */
2262 if ((operand
->flags
& V850_OPERAND_SIGNED
)
2263 && ! warn_signed_overflows
)
2264 max
= (1 << (operand
->bits
- 1)) - 1;
2266 if (! (operand
->flags
& V850_OPERAND_SIGNED
)
2267 && ! warn_unsigned_overflows
)
2270 sprintf (buf
, _("operand out of range (%d is not between %d and %d)"),
2271 (int) val
, (int) min
, (int) max
);
2275 insn
|= (((long) val
& ((1 << operand
->bits
) - 1)) << operand
->shift
);
2279 insn
|= (((long) val
) << operand
->shift
);
2286 static char copy_of_instruction
[128];
2289 md_assemble (char *str
)
2292 char *start_of_operands
;
2293 struct v850_opcode
*opcode
;
2294 struct v850_opcode
*next_opcode
;
2295 const unsigned char *opindex_ptr
;
2298 unsigned long insn
= 0;
2299 unsigned long insn_size
;
2303 bool extra_data_after_insn
= false;
2304 unsigned extra_data_len
= 0;
2305 unsigned long extra_data
= 0;
2306 char *saved_input_line_pointer
;
2307 char most_match_errmsg
[1024];
2308 int most_match_count
= -1;
2310 strncpy (copy_of_instruction
, str
, sizeof (copy_of_instruction
) - 1);
2311 most_match_errmsg
[0] = 0;
2313 /* Get the opcode. */
2314 for (s
= str
; *s
!= '\0' && ! ISSPACE (*s
); s
++)
2320 /* Find the first opcode with the proper name. */
2321 opcode
= (struct v850_opcode
*) str_hash_find (v850_hash
, str
);
2324 /* xgettext:c-format */
2325 as_bad (_("Unrecognized opcode: `%s'"), str
);
2326 ignore_rest_of_line ();
2331 while (ISSPACE (*str
))
2334 start_of_operands
= str
;
2336 saved_input_line_pointer
= input_line_pointer
;
2340 const char *errmsg
= NULL
;
2341 const char *warningmsg
= NULL
;
2344 opindex_ptr
= opcode
->operands
;
2348 if ((startswith (opcode
->name
, "st.")
2349 && v850_operands
[opcode
->operands
[1]].bits
== 23)
2350 || (startswith (opcode
->name
, "ld.")
2351 && v850_operands
[opcode
->operands
[0]].bits
== 23))
2353 errmsg
= _("st/ld offset 23 instruction was disabled .");
2358 if ((opcode
->processors
& processor_mask
& PROCESSOR_MASK
) == 0
2359 || (((opcode
->processors
& ~PROCESSOR_MASK
) != 0)
2360 && ((opcode
->processors
& processor_mask
& ~PROCESSOR_MASK
) == 0)))
2362 errmsg
= _("Target processor does not support this instruction.");
2369 insn
= opcode
->opcode
;
2371 extra_data_after_insn
= false;
2373 input_line_pointer
= str
= start_of_operands
;
2375 for (opindex_ptr
= opcode
->operands
; *opindex_ptr
!= 0; opindex_ptr
++)
2377 const struct v850_operand
*operand
;
2380 bfd_reloc_code_real_type reloc
;
2382 if (next_opindex
== 0)
2383 operand
= &v850_operands
[*opindex_ptr
];
2386 operand
= &v850_operands
[next_opindex
];
2395 if (operand
->flags
& V850_OPERAND_BANG
2398 else if (operand
->flags
& V850_OPERAND_PERCENT
2402 if (*str
== ',' || *str
== '[' || *str
== ']')
2408 if ( (strcmp (opcode
->name
, "pushsp") == 0
2409 || strcmp (opcode
->name
, "popsp") == 0
2410 || strcmp (opcode
->name
, "dbpush") == 0)
2414 if (operand
->flags
& V850_OPERAND_RELAX
)
2417 /* Gather the operand. */
2418 hold
= input_line_pointer
;
2419 input_line_pointer
= str
;
2421 /* lo(), hi(), hi0(), etc... */
2422 if ((reloc
= v850_reloc_prefix (operand
, &errmsg
)) != BFD_RELOC_NONE
)
2424 /* This is a fake reloc, used to indicate an error condition. */
2425 if (reloc
== BFD_RELOC_64
)
2433 if (ex
.X_op
== O_constant
)
2437 case BFD_RELOC_V850_ZDA_16_16_OFFSET
:
2438 case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
:
2439 case BFD_RELOC_V850_ZDA_15_16_OFFSET
:
2440 /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
2444 case BFD_RELOC_LO16
:
2445 case BFD_RELOC_V850_LO16_S1
:
2446 case BFD_RELOC_V850_LO16_SPLIT_OFFSET
:
2448 /* Truncate, then sign extend the value. */
2449 ex
.X_add_number
= SEXT16 (ex
.X_add_number
);
2453 case BFD_RELOC_HI16
:
2455 /* Truncate, then sign extend the value. */
2456 ex
.X_add_number
= SEXT16 (ex
.X_add_number
>> 16);
2460 case BFD_RELOC_HI16_S
:
2462 /* Truncate, then sign extend the value. */
2463 int temp
= (ex
.X_add_number
>> 16) & 0xffff;
2465 temp
+= (ex
.X_add_number
>> 15) & 1;
2467 ex
.X_add_number
= SEXT16 (temp
);
2471 case BFD_RELOC_V850_23
:
2472 if ((operand
->flags
& V850E_IMMEDIATE23
) == 0)
2474 errmsg
= _("immediate operand is too large");
2480 case BFD_RELOC_V850_32_ABS
:
2481 case BFD_RELOC_V850_32_PCREL
:
2482 if ((operand
->flags
& V850E_IMMEDIATE32
) == 0)
2484 errmsg
= _("immediate operand is too large");
2491 as_bad (_("AAARG -> unhandled constant reloc: %d"), reloc
);
2495 if (operand
->flags
& V850E_IMMEDIATE32
)
2497 extra_data_after_insn
= true;
2501 else if (operand
->flags
& V850E_IMMEDIATE23
)
2503 if (reloc
!= BFD_RELOC_V850_23
)
2505 errmsg
= _("immediate operand is too large");
2508 extra_data_after_insn
= true;
2512 else if ((operand
->flags
& V850E_IMMEDIATE16
)
2513 || (operand
->flags
& V850E_IMMEDIATE16HI
))
2515 if (operand
->flags
& V850E_IMMEDIATE16HI
2516 && reloc
!= BFD_RELOC_HI16
2517 && reloc
!= BFD_RELOC_HI16_S
)
2519 errmsg
= _("immediate operand is too large");
2522 else if (operand
->flags
& V850E_IMMEDIATE16
2523 && reloc
!= BFD_RELOC_LO16
)
2525 errmsg
= _("immediate operand is too large");
2529 extra_data_after_insn
= true;
2534 if (fc
> MAX_INSN_FIXUPS
)
2535 as_fatal (_("too many fixups"));
2537 fixups
[fc
].exp
= ex
;
2538 fixups
[fc
].opindex
= *opindex_ptr
;
2539 fixups
[fc
].reloc
= reloc
;
2542 else /* ex.X_op != O_constant. */
2544 if ((reloc
== BFD_RELOC_32
2545 || reloc
== BFD_RELOC_V850_32_ABS
2546 || reloc
== BFD_RELOC_V850_32_PCREL
)
2547 && operand
->bits
< 32)
2549 errmsg
= _("immediate operand is too large");
2552 else if (reloc
== BFD_RELOC_V850_23
2553 && (operand
->flags
& V850E_IMMEDIATE23
) == 0)
2555 errmsg
= _("immediate operand is too large");
2558 else if ((reloc
== BFD_RELOC_HI16
2559 || reloc
== BFD_RELOC_HI16_S
)
2560 && operand
->bits
< 16)
2562 errmsg
= _("immediate operand is too large");
2566 if (operand
->flags
& V850E_IMMEDIATE32
)
2568 extra_data_after_insn
= true;
2572 else if (operand
->flags
& V850E_IMMEDIATE23
)
2574 if (reloc
!= BFD_RELOC_V850_23
)
2576 errmsg
= _("immediate operand is too large");
2579 extra_data_after_insn
= true;
2583 else if ((operand
->flags
& V850E_IMMEDIATE16
)
2584 || (operand
->flags
& V850E_IMMEDIATE16HI
))
2586 if (operand
->flags
& V850E_IMMEDIATE16HI
2587 && reloc
!= BFD_RELOC_HI16
2588 && reloc
!= BFD_RELOC_HI16_S
)
2590 errmsg
= _("immediate operand is too large");
2593 else if (operand
->flags
& V850E_IMMEDIATE16
2594 && reloc
!= BFD_RELOC_LO16
)
2596 errmsg
= _("immediate operand is too large");
2600 extra_data_after_insn
= true;
2605 if (fc
> MAX_INSN_FIXUPS
)
2606 as_fatal (_("too many fixups"));
2608 fixups
[fc
].exp
= ex
;
2609 fixups
[fc
].opindex
= *opindex_ptr
;
2610 fixups
[fc
].reloc
= reloc
;
2614 else if (operand
->flags
& V850E_IMMEDIATE16
2615 || operand
->flags
& V850E_IMMEDIATE16HI
)
2622 if (operand
->flags
& V850E_IMMEDIATE16HI
)
2624 if (ex
.X_add_number
& 0xffff)
2626 errmsg
= _("constant too big to fit into instruction");
2630 ex
.X_add_number
>>= 16;
2632 if (operand
->flags
& V850E_IMMEDIATE16
)
2634 if ((ex
.X_add_number
& 0xffff8000)
2635 && ((ex
.X_add_number
& 0xffff8000) != 0xffff8000))
2637 errmsg
= _("constant too big to fit into instruction");
2644 errmsg
= _("illegal operand");
2648 errmsg
= _("missing operand");
2652 if (fc
>= MAX_INSN_FIXUPS
)
2653 as_fatal (_("too many fixups"));
2655 fixups
[fc
].exp
= ex
;
2656 fixups
[fc
].opindex
= *opindex_ptr
;
2657 fixups
[fc
].reloc
= operand
->default_reloc
;
2660 ex
.X_add_number
= 0;
2664 extra_data_after_insn
= true;
2666 extra_data
= ex
.X_add_number
;
2668 else if (operand
->flags
& V850E_IMMEDIATE23
)
2678 errmsg
= _("illegal operand");
2682 errmsg
= _("missing operand");
2689 if (fc
>= MAX_INSN_FIXUPS
)
2690 as_fatal (_("too many fixups"));
2692 fixups
[fc
].exp
= ex
;
2693 fixups
[fc
].opindex
= *opindex_ptr
;
2694 fixups
[fc
].reloc
= operand
->default_reloc
;
2697 extra_data_after_insn
= true;
2701 else if (operand
->flags
& V850E_IMMEDIATE32
)
2708 if ((operand
->default_reloc
== BFD_RELOC_V850_32_ABS
2709 || operand
->default_reloc
== BFD_RELOC_V850_32_PCREL
)
2710 && (ex
.X_add_number
& 1))
2712 errmsg
= _("odd number cannot be used here");
2718 errmsg
= _("illegal operand");
2722 errmsg
= _("missing operand");
2726 if (fc
>= MAX_INSN_FIXUPS
)
2727 as_fatal (_("too many fixups"));
2729 fixups
[fc
].exp
= ex
;
2730 fixups
[fc
].opindex
= *opindex_ptr
;
2731 fixups
[fc
].reloc
= operand
->default_reloc
;
2734 ex
.X_add_number
= 0;
2738 extra_data_after_insn
= true;
2740 extra_data
= ex
.X_add_number
;
2742 else if (operand
->flags
& V850E_OPERAND_REG_LIST
)
2744 errmsg
= parse_register_list (&insn
, operand
);
2753 if ((operand
->flags
& V850_OPERAND_REG
) != 0)
2755 if (!register_name (&ex
))
2757 errmsg
= _("invalid register name");
2760 if ((operand
->flags
& V850_NOT_R0
)
2761 && ex
.X_add_number
== 0)
2763 errmsg
= _("register r0 cannot be used here");
2766 if (operand
->flags
& V850_REG_EVEN
)
2768 if (ex
.X_add_number
% 2)
2769 errmsg
= _("odd register cannot be used here");
2770 ex
.X_add_number
= ex
.X_add_number
/ 2;
2774 else if ((operand
->flags
& V850_OPERAND_SRG
) != 0)
2776 if (!system_register_name (&ex
, true))
2778 errmsg
= _("invalid system register name");
2781 else if ((operand
->flags
& V850_OPERAND_EP
) != 0)
2783 char *start
= input_line_pointer
;
2785 char c
= get_symbol_name (&name
);
2787 if (strcmp (name
, "ep") != 0 && strcmp (name
, "r30") != 0)
2789 /* Put things back the way we found them. */
2790 (void) restore_line_pointer (c
);
2791 input_line_pointer
= start
;
2792 errmsg
= _("expected EP register");
2796 (void) restore_line_pointer (c
);
2797 str
= input_line_pointer
;
2798 input_line_pointer
= hold
;
2800 while (*str
== ' ' || *str
== ','
2801 || *str
== '[' || *str
== ']')
2805 else if ((operand
->flags
& V850_OPERAND_CC
) != 0)
2807 if (!cc_name (&ex
, true))
2809 errmsg
= _("invalid condition code name");
2812 if ((operand
->flags
& V850_NOT_SA
)
2813 && ex
.X_add_number
== COND_SA_NUM
)
2815 errmsg
= _("condition sa cannot be used here");
2818 else if ((operand
->flags
& V850_OPERAND_FLOAT_CC
) != 0)
2820 if (!float_cc_name (&ex
, true))
2822 errmsg
= _("invalid condition code name");
2825 else if ((operand
->flags
& V850_OPERAND_CACHEOP
) != 0)
2827 if (!cacheop_name (&ex
, true))
2828 errmsg
= _("invalid cache operation name");
2830 else if ((operand
->flags
& V850_OPERAND_PREFOP
) != 0)
2832 if (!prefop_name (&ex
, true))
2833 errmsg
= _("invalid pref operation name");
2835 else if ((operand
->flags
& V850_OPERAND_VREG
) != 0)
2837 if (!vector_register_name (&ex
))
2838 errmsg
= _("invalid vector register name");
2840 else if ((register_name (&ex
)
2841 && (operand
->flags
& V850_OPERAND_REG
) == 0))
2847 /* It is possible that an alias has been defined that
2848 matches a register name. For example the code may
2849 include a ".set ZERO, 0" directive, which matches
2850 the register name "zero". Attempt to reparse the
2851 field as an expression, and only complain if we
2852 cannot generate a constant. */
2854 input_line_pointer
= str
;
2856 c
= get_symbol_name (&name
);
2858 if (symbol_find (name
) != NULL
)
2861 (void) restore_line_pointer (c
);
2862 input_line_pointer
= str
;
2866 if (ex
.X_op
!= O_constant
)
2868 /* If this register is actually occurring too early on
2869 the parsing of the instruction, (because another
2870 field is missing) then report this. */
2871 if (opindex_ptr
[1] != 0
2872 && ((v850_operands
[opindex_ptr
[1]].flags
2874 ||(v850_operands
[opindex_ptr
[1]].flags
2875 & V850_OPERAND_VREG
)))
2876 errmsg
= _("syntax error: value is missing before the register name");
2878 errmsg
= _("syntax error: register not expected");
2880 /* If we created a symbol in the process of this
2881 test then delete it now, so that it will not
2882 be output with the real symbols... */
2884 && ex
.X_op
== O_symbol
)
2885 symbol_remove (ex
.X_add_symbol
,
2886 &symbol_rootP
, &symbol_lastP
);
2889 else if (system_register_name (&ex
, false)
2890 && (operand
->flags
& V850_OPERAND_SRG
) == 0)
2892 errmsg
= _("syntax error: system register not expected");
2894 else if (cc_name (&ex
, false)
2895 && (operand
->flags
& V850_OPERAND_CC
) == 0)
2897 errmsg
= _("syntax error: condition code not expected");
2899 else if (float_cc_name (&ex
, false)
2900 && (operand
->flags
& V850_OPERAND_FLOAT_CC
) == 0)
2902 errmsg
= _("syntax error: condition code not expected");
2904 else if (vector_register_name (&ex
)
2905 && (operand
->flags
& V850_OPERAND_VREG
) == 0)
2907 errmsg
= _("syntax error: vector register not expected");
2912 resolve_register (&ex
);
2914 if ((operand
->flags
& V850_NOT_IMM0
)
2915 && ex
.X_op
== O_constant
2916 && ex
.X_add_number
== 0)
2918 errmsg
= _("immediate 0 cannot be used here");
2922 If we are assembling a MOV/JARL/JR instruction and the immediate
2923 value does not fit into the bits available then create a
2924 fake error so that the next MOV/JARL/JR instruction will be
2925 selected. This one has a 32 bit immediate field. */
2927 if ((strcmp (opcode
->name
, "mov") == 0
2928 || strcmp (opcode
->name
, "jarl") == 0
2929 || strcmp (opcode
->name
, "jr") == 0)
2930 && ex
.X_op
== O_constant
2931 && (ex
.X_add_number
< (-(1 << (operand
->bits
- 1)))
2932 || ex
.X_add_number
> ((1 << (operand
->bits
- 1)) - 1)))
2934 errmsg
= _("immediate operand is too large");
2937 if ((strcmp (opcode
->name
, "jarl") == 0
2938 || strcmp (opcode
->name
, "jr") == 0)
2939 && ex
.X_op
!= O_constant
2940 && operand
->bits
!= default_disp_size
)
2942 errmsg
= _("immediate operand is not match");
2946 If we are assembling a ld/st instruction and the immediate
2947 value does not fit into the bits available then create a
2948 fake error so that the next ld/st instruction will be
2950 if ( ( (startswith (opcode
->name
, "st."))
2951 || (startswith (opcode
->name
, "ld.")))
2952 && ex
.X_op
== O_constant
2953 && (ex
.X_add_number
< (-(1 << (operand
->bits
- 1)))
2954 || ex
.X_add_number
> ((1 << (operand
->bits
- 1)) - 1)))
2955 errmsg
= _("displacement is too large");
2964 errmsg
= _("illegal operand");
2967 errmsg
= _("missing operand");
2971 & (V850_OPERAND_REG
| V850_OPERAND_SRG
| V850_OPERAND_VREG
)) == 0)
2973 errmsg
= _("invalid operand");
2977 insn
= v850_insert_operand (insn
, operand
,
2984 insn
= v850_insert_operand (insn
, operand
, ex
.X_add_number
,
2989 /* We need to generate a fixup for this expression. */
2990 if (fc
>= MAX_INSN_FIXUPS
)
2991 as_fatal (_("too many fixups"));
2993 fixups
[fc
].exp
= ex
;
2994 fixups
[fc
].opindex
= *opindex_ptr
;
2995 fixups
[fc
].reloc
= BFD_RELOC_NONE
;
3001 str
= input_line_pointer
;
3002 input_line_pointer
= hold
;
3004 while (*str
== ' ' || *str
== ',' || *str
== '[' || *str
== ']'
3009 while (ISSPACE (*str
))
3018 if ((opindex_ptr
- opcode
->operands
) >= most_match_count
)
3020 most_match_count
= opindex_ptr
- opcode
->operands
;
3022 strncpy (most_match_errmsg
, errmsg
, sizeof (most_match_errmsg
)-1);
3025 next_opcode
= opcode
+ 1;
3026 if (next_opcode
->name
!= NULL
3027 && strcmp (next_opcode
->name
, opcode
->name
) == 0)
3029 opcode
= next_opcode
;
3031 /* Skip versions that are not supported by the target
3033 if ((opcode
->processors
& processor_mask
) == 0)
3039 if (most_match_errmsg
[0] == 0)
3040 /* xgettext:c-format. */
3041 as_bad (_("junk at end of line: `%s'"), str
);
3043 as_bad ("%s: %s", copy_of_instruction
, most_match_errmsg
);
3045 if (*input_line_pointer
== ']')
3046 ++input_line_pointer
;
3048 ignore_rest_of_line ();
3049 input_line_pointer
= saved_input_line_pointer
;
3053 if (warningmsg
!= NULL
)
3054 as_warn ("%s", warningmsg
);
3058 input_line_pointer
= str
;
3060 /* Tie dwarf2 debug info to the address at the start of the insn.
3061 We can't do this after the insn has been output as the current
3062 frag may have been closed off. eg. by frag_var. */
3063 dwarf2_emit_insn (0);
3065 /* Write out the instruction. */
3066 if (relaxable
&& fc
> 0)
3071 if (strcmp (opcode
->name
, "loop") == 0)
3073 if (((processor_mask
& PROCESSOR_V850E3V5_UP
) == 0) || default_disp_size
== 22)
3076 f
= frag_var (rs_machine_dependent
, 6, 2, SUBYPTE_LOOP_16_22
,
3077 fixups
[0].exp
.X_add_symbol
,
3078 fixups
[0].exp
.X_add_number
,
3079 (char *)(size_t) fixups
[0].opindex
);
3080 md_number_to_chars (f
, insn
, insn_size
);
3081 md_number_to_chars (f
+4, 0, 4);
3085 as_bad (_("loop: 32-bit displacement not supported"));
3088 else if (strcmp (opcode
->name
, "br") == 0
3089 || strcmp (opcode
->name
, "jbr") == 0)
3091 if ((processor_mask
& PROCESSOR_V850E2_UP
) == 0 || default_disp_size
== 22)
3093 f
= frag_var (rs_machine_dependent
, 4, 2, SUBYPTE_UNCOND_9_22
,
3094 fixups
[0].exp
.X_add_symbol
,
3095 fixups
[0].exp
.X_add_number
,
3096 (char *)(size_t) fixups
[0].opindex
);
3097 md_number_to_chars (f
, insn
, insn_size
);
3098 md_number_to_chars (f
+ 2, 0, 2);
3102 f
= frag_var (rs_machine_dependent
, 6, 4, SUBYPTE_UNCOND_9_22_32
,
3103 fixups
[0].exp
.X_add_symbol
,
3104 fixups
[0].exp
.X_add_number
,
3105 (char *)(size_t) fixups
[0].opindex
);
3106 md_number_to_chars (f
, insn
, insn_size
);
3107 md_number_to_chars (f
+ 2, 0, 4);
3110 else /* b<cond>, j<cond>. */
3112 if (default_disp_size
== 22
3113 || (processor_mask
& PROCESSOR_V850E2_UP
) == 0)
3115 if (processor_mask
& PROCESSOR_V850E2V3_UP
&& !no_bcond17
)
3117 if (strcmp (opcode
->name
, "bsa") == 0)
3119 f
= frag_var (rs_machine_dependent
, 8, 6, SUBYPTE_SA_9_17_22
,
3120 fixups
[0].exp
.X_add_symbol
,
3121 fixups
[0].exp
.X_add_number
,
3122 (char *)(size_t) fixups
[0].opindex
);
3123 md_number_to_chars (f
, insn
, insn_size
);
3124 md_number_to_chars (f
+ 2, 0, 6);
3128 f
= frag_var (rs_machine_dependent
, 6, 4, SUBYPTE_COND_9_17_22
,
3129 fixups
[0].exp
.X_add_symbol
,
3130 fixups
[0].exp
.X_add_number
,
3131 (char *)(size_t) fixups
[0].opindex
);
3132 md_number_to_chars (f
, insn
, insn_size
);
3133 md_number_to_chars (f
+ 2, 0, 4);
3138 if (strcmp (opcode
->name
, "bsa") == 0)
3140 f
= frag_var (rs_machine_dependent
, 8, 6, SUBYPTE_SA_9_22
,
3141 fixups
[0].exp
.X_add_symbol
,
3142 fixups
[0].exp
.X_add_number
,
3143 (char *)(size_t) fixups
[0].opindex
);
3144 md_number_to_chars (f
, insn
, insn_size
);
3145 md_number_to_chars (f
+ 2, 0, 6);
3149 f
= frag_var (rs_machine_dependent
, 6, 4, SUBYPTE_COND_9_22
,
3150 fixups
[0].exp
.X_add_symbol
,
3151 fixups
[0].exp
.X_add_number
,
3152 (char *)(size_t) fixups
[0].opindex
);
3153 md_number_to_chars (f
, insn
, insn_size
);
3154 md_number_to_chars (f
+ 2, 0, 4);
3160 if (processor_mask
& PROCESSOR_V850E2V3_UP
&& !no_bcond17
)
3162 if (strcmp (opcode
->name
, "bsa") == 0)
3164 f
= frag_var (rs_machine_dependent
, 10, 8, SUBYPTE_SA_9_17_22_32
,
3165 fixups
[0].exp
.X_add_symbol
,
3166 fixups
[0].exp
.X_add_number
,
3167 (char *)(size_t) fixups
[0].opindex
);
3168 md_number_to_chars (f
, insn
, insn_size
);
3169 md_number_to_chars (f
+ 2, 0, 8);
3173 f
= frag_var (rs_machine_dependent
, 8, 6, SUBYPTE_COND_9_17_22_32
,
3174 fixups
[0].exp
.X_add_symbol
,
3175 fixups
[0].exp
.X_add_number
,
3176 (char *)(size_t) fixups
[0].opindex
);
3177 md_number_to_chars (f
, insn
, insn_size
);
3178 md_number_to_chars (f
+ 2, 0, 6);
3183 if (strcmp (opcode
->name
, "bsa") == 0)
3185 f
= frag_var (rs_machine_dependent
, 10, 8, SUBYPTE_SA_9_22_32
,
3186 fixups
[0].exp
.X_add_symbol
,
3187 fixups
[0].exp
.X_add_number
,
3188 (char *)(size_t) fixups
[0].opindex
);
3189 md_number_to_chars (f
, insn
, insn_size
);
3190 md_number_to_chars (f
+ 2, 0, 8);
3194 f
= frag_var (rs_machine_dependent
, 8, 6, SUBYPTE_COND_9_22_32
,
3195 fixups
[0].exp
.X_add_symbol
,
3196 fixups
[0].exp
.X_add_number
,
3197 (char *)(size_t) fixups
[0].opindex
);
3198 md_number_to_chars (f
, insn
, insn_size
);
3199 md_number_to_chars (f
+ 2, 0, 6);
3207 /* Four byte insns have an opcode with the two high bits on. */
3208 if ((insn
& 0x0600) == 0x0600)
3213 /* Special case: 32 bit MOV. */
3214 if ((insn
& 0xffe0) == 0x0620)
3217 /* Special case: 32 bit JARL,JMP,JR. */
3218 if ((insn
& 0x1ffe0) == 0x2e0 /* JARL. */
3219 || (insn
& 0x1ffe0) == 0x6e0 /* JMP. */
3220 || (insn
& 0x1ffff) == 0x2e0) /* JR. */
3223 if (obstack_room (& frchain_now
->frch_obstack
) < (insn_size
+ extra_data_len
))
3225 frag_wane (frag_now
);
3229 f
= frag_more (insn_size
);
3230 md_number_to_chars (f
, insn
, insn_size
);
3232 if (extra_data_after_insn
)
3234 f
= frag_more (extra_data_len
);
3235 md_number_to_chars (f
, extra_data
, extra_data_len
);
3237 extra_data_after_insn
= false;
3241 /* Create any fixups. At this point we do not use a
3242 bfd_reloc_code_real_type, but instead just use the
3243 BFD_RELOC_UNUSED plus the operand index. This lets us easily
3244 handle fixups for any operand type, although that is admittedly
3245 not a very exciting feature. We pick a BFD reloc type in
3247 for (i
= 0; i
< fc
; i
++)
3249 const struct v850_operand
*operand
;
3250 bfd_reloc_code_real_type reloc
;
3252 operand
= &v850_operands
[fixups
[i
].opindex
];
3254 reloc
= fixups
[i
].reloc
;
3256 if (reloc
!= BFD_RELOC_NONE
)
3258 reloc_howto_type
*reloc_howto
=
3259 bfd_reloc_type_lookup (stdoutput
, reloc
);
3267 size
= bfd_get_reloc_size (reloc_howto
);
3269 /* XXX This will abort on an R_V850_8 reloc -
3270 is this reloc actually used? */
3271 if (size
!= 2 && size
!= 4)
3274 if (extra_data_len
== 0)
3276 address
= (f
- frag_now
->fr_literal
) + insn_size
- size
;
3280 address
= (f
- frag_now
->fr_literal
) + extra_data_len
- size
;
3283 if ((operand
->flags
& V850E_IMMEDIATE32
) && (operand
->flags
& V850_PCREL
))
3285 fixups
[i
].exp
.X_add_number
+= 2;
3287 else if (operand
->default_reloc
== BFD_RELOC_V850_16_PCREL
)
3289 fixups
[i
].exp
.X_add_number
+= 2;
3293 /* fprintf (stderr, "0x%x %d %ld\n", address, size, fixups[i].exp.X_add_number); */
3294 fixP
= fix_new_exp (frag_now
, address
, size
,
3296 reloc_howto
->pc_relative
,
3299 fixP
->tc_fix_data
= (void *) operand
;
3303 case BFD_RELOC_LO16
:
3304 case BFD_RELOC_V850_LO16_S1
:
3305 case BFD_RELOC_V850_LO16_SPLIT_OFFSET
:
3306 case BFD_RELOC_HI16
:
3307 case BFD_RELOC_HI16_S
:
3308 fixP
->fx_no_overflow
= 1;
3316 gas_assert (f
!= NULL
);
3317 fix_new_exp (frag_now
,
3318 f
- frag_now
->fr_literal
, 4,
3320 (operand
->flags
& V850_PCREL
) != 0,
3321 (bfd_reloc_code_real_type
) (fixups
[i
].opindex
3322 + (int) BFD_RELOC_UNUSED
));
3326 input_line_pointer
= saved_input_line_pointer
;
3329 /* If while processing a fixup, a reloc really needs to be created
3330 then it is done here. */
3333 tc_gen_reloc (asection
*seg ATTRIBUTE_UNUSED
, fixS
*fixp
)
3337 reloc
= XNEW (arelent
);
3338 reloc
->sym_ptr_ptr
= XNEW (asymbol
*);
3339 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
3340 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
3342 if ( fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
3343 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
3344 || fixp
->fx_r_type
== BFD_RELOC_V850_LONGCALL
3345 || fixp
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
3346 || fixp
->fx_r_type
== BFD_RELOC_V850_ALIGN
)
3347 reloc
->addend
= fixp
->fx_offset
;
3351 if (fixp
->fx_r_type
== BFD_RELOC_32
3353 fixp
->fx_r_type
= BFD_RELOC_32_PCREL
;
3356 reloc
->addend
= fixp
->fx_addnumber
;
3359 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
3361 if (reloc
->howto
== NULL
)
3363 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
3364 /* xgettext:c-format */
3365 _("reloc %d not supported by object file format"),
3366 (int) fixp
->fx_r_type
);
3377 v850_handle_align (fragS
* frag
)
3380 && frag
->fr_type
== rs_align
3381 && frag
->fr_address
+ frag
->fr_fix
> 0
3382 && frag
->fr_offset
> 1
3383 && now_seg
!= bss_section
3384 && now_seg
!= v850_seg_table
[SBSS_SECTION
].s
3385 && now_seg
!= v850_seg_table
[TBSS_SECTION
].s
3386 && now_seg
!= v850_seg_table
[ZBSS_SECTION
].s
)
3387 fix_new (frag
, frag
->fr_fix
, 2, & abs_symbol
, frag
->fr_offset
, 0,
3388 BFD_RELOC_V850_ALIGN
);
3391 /* Return current size of variable part of frag. */
3394 md_estimate_size_before_relax (fragS
*fragp
, asection
*seg ATTRIBUTE_UNUSED
)
3396 if (fragp
->fr_subtype
>= sizeof (md_relax_table
) / sizeof (md_relax_table
[0]))
3399 return md_relax_table
[fragp
->fr_subtype
].rlx_length
;
3403 v850_pcrel_from_section (fixS
*fixp
, segT section
)
3405 /* If the symbol is undefined, or in a section other than our own,
3406 or it is weak (in which case it may well be in another section,
3407 then let the linker figure it out. */
3408 if (fixp
->fx_addsy
!= (symbolS
*) NULL
3409 && (! S_IS_DEFINED (fixp
->fx_addsy
)
3410 || S_IS_WEAK (fixp
->fx_addsy
)
3411 || (S_GET_SEGMENT (fixp
->fx_addsy
) != section
)))
3414 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
3418 md_apply_fix (fixS
*fixP
, valueT
*valueP
, segT seg ATTRIBUTE_UNUSED
)
3420 valueT value
= * valueP
;
3423 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
3424 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGCALL
3425 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
3426 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
3432 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
3433 fixP
->fx_addnumber
= value
,
3436 else if (fixP
->fx_pcrel
)
3437 fixP
->fx_addnumber
= fixP
->fx_offset
;
3441 value
= fixP
->fx_offset
;
3442 if (fixP
->fx_subsy
!= (symbolS
*) NULL
)
3444 if (S_GET_SEGMENT (fixP
->fx_subsy
) == absolute_section
)
3445 value
-= S_GET_VALUE (fixP
->fx_subsy
);
3447 /* We don't actually support subtracting a symbol. */
3448 as_bad_subtract (fixP
);
3450 fixP
->fx_addnumber
= value
;
3453 if ((int) fixP
->fx_r_type
>= (int) BFD_RELOC_UNUSED
)
3456 const struct v850_operand
*operand
;
3458 const char *errmsg
= NULL
;
3460 opindex
= (int) fixP
->fx_r_type
- (int) BFD_RELOC_UNUSED
;
3461 operand
= &v850_operands
[opindex
];
3463 /* Fetch the instruction, insert the fully resolved operand
3464 value, and stuff the instruction back again.
3466 Note the instruction has been stored in little endian
3468 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
3470 if (fixP
->fx_size
> 2)
3471 insn
= bfd_getl32 ((unsigned char *) where
);
3473 insn
= bfd_getl16 ((unsigned char *) where
);
3475 /* When inserting loop offsets a backwards displacement
3476 is encoded as a positive value. */
3477 if (operand
->flags
& V850_INVERSE_PCREL
)
3480 insn
= v850_insert_operand (insn
, operand
, (offsetT
) value
,
3483 as_warn_where (fixP
->fx_file
, fixP
->fx_line
, "%s", errmsg
);
3485 if (fixP
->fx_size
> 2)
3486 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
3488 bfd_putl16 ((bfd_vma
) insn
, (unsigned char *) where
);
3491 /* Nothing else to do here. */
3494 /* Determine a BFD reloc value based on the operand information.
3495 We are only prepared to turn a few of the operands into relocs. */
3497 if (operand
->default_reloc
== BFD_RELOC_NONE
)
3499 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3500 _("unresolved expression that must be resolved"));
3506 fixP
->fx_r_type
= operand
->default_reloc
;
3507 if (operand
->default_reloc
== BFD_RELOC_V850_16_PCREL
)
3509 fixP
->fx_where
+= 2;
3511 fixP
->fx_addnumber
+= 2;
3515 else if (fixP
->fx_done
)
3517 /* We still have to insert the value into memory! */
3518 where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
3520 if (fixP
->tc_fix_data
!= NULL
3521 && ((struct v850_operand
*) fixP
->tc_fix_data
)->insert
!= NULL
)
3523 const char * message
= NULL
;
3524 struct v850_operand
* operand
= (struct v850_operand
*) fixP
->tc_fix_data
;
3527 /* The variable "where" currently points at the exact point inside
3528 the insn where we need to insert the value. But we need to
3529 extract the entire insn so we probably need to move "where"
3530 back a few bytes. */
3532 if (fixP
->fx_size
== 2)
3534 else if (fixP
->fx_size
== 1)
3537 insn
= bfd_getl32 ((unsigned char *) where
);
3539 /* Use the operand's insertion procedure, if present, in order to
3540 make sure that the value is correctly stored in the insn. */
3541 insn
= operand
->insert (insn
, (offsetT
) value
, & message
);
3542 /* Ignore message even if it is set. */
3544 bfd_putl32 ((bfd_vma
) insn
, (unsigned char *) where
);
3548 switch (fixP
->fx_r_type
)
3550 case BFD_RELOC_V850_32_ABS
:
3551 case BFD_RELOC_V850_32_PCREL
:
3552 bfd_putl32 (value
& 0xfffffffe, (unsigned char *) where
);
3556 bfd_putl32 (value
, (unsigned char *) where
);
3559 case BFD_RELOC_V850_23
:
3560 bfd_putl32 (((value
& 0x7f) << 4) | ((value
& 0x7fff80) << (16-7))
3561 | (bfd_getl32 (where
) & ~((0x7f << 4) | (0xffff << 16))),
3562 (unsigned char *) where
);
3566 case BFD_RELOC_HI16
:
3567 case BFD_RELOC_HI16_S
:
3568 case BFD_RELOC_LO16
:
3569 case BFD_RELOC_V850_ZDA_16_16_OFFSET
:
3570 case BFD_RELOC_V850_SDA_16_16_OFFSET
:
3571 case BFD_RELOC_V850_TDA_16_16_OFFSET
:
3572 case BFD_RELOC_V850_CALLT_16_16_OFFSET
:
3573 bfd_putl16 (value
& 0xffff, (unsigned char *) where
);
3577 *where
= value
& 0xff;
3580 case BFD_RELOC_V850_9_PCREL
:
3581 bfd_putl16 (((value
& 0x1f0) << 7) | ((value
& 0x0e) << 3)
3582 | (bfd_getl16 (where
) & ~((0x1f0 << 7) | (0x0e << 3))), where
);
3585 case BFD_RELOC_V850_17_PCREL
:
3586 bfd_putl32 (((value
& 0x10000) >> (16 - 4)) | ((value
& 0xfffe) << 16)
3587 | (bfd_getl32 (where
) & ~((0x10000 >> (16 - 4)) | (0xfffe << 16))), where
);
3590 case BFD_RELOC_V850_16_PCREL
:
3591 bfd_putl16 ((-value
& 0xfffe) | (bfd_getl16 (where
+ 2) & 0x0001),
3592 (unsigned char *) (where
+ 2));
3595 case BFD_RELOC_V850_22_PCREL
:
3596 bfd_putl32 (((value
& 0xfffe) << 16) | ((value
& 0x3f0000) >> 16)
3597 | (bfd_getl32 (where
) & ~((0xfffe << 16) | (0x3f0000 >> 16))), where
);
3600 case BFD_RELOC_V850_16_S1
:
3601 case BFD_RELOC_V850_LO16_S1
:
3602 case BFD_RELOC_V850_ZDA_15_16_OFFSET
:
3603 case BFD_RELOC_V850_SDA_15_16_OFFSET
:
3604 bfd_putl16 (value
& 0xfffe, (unsigned char *) where
);
3607 case BFD_RELOC_V850_16_SPLIT_OFFSET
:
3608 case BFD_RELOC_V850_LO16_SPLIT_OFFSET
:
3609 case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
:
3610 case BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
:
3611 bfd_putl32 (((value
<< 16) & 0xfffe0000)
3612 | ((value
<< 5) & 0x20)
3613 | (bfd_getl32 (where
) & ~0xfffe0020), where
);
3616 case BFD_RELOC_V850_TDA_6_8_OFFSET
:
3617 *where
= (*where
& ~0x7e) | ((value
>> 1) & 0x7e);
3620 case BFD_RELOC_V850_TDA_7_8_OFFSET
:
3621 *where
= (*where
& ~0x7f) | ((value
>> 1) & 0x7f);
3624 case BFD_RELOC_V850_TDA_7_7_OFFSET
:
3625 *where
= (*where
& ~0x7f) | (value
& 0x7f);
3628 case BFD_RELOC_V850_TDA_4_5_OFFSET
:
3629 *where
= (*where
& ~0xf) | ((value
>> 1) & 0xf);
3632 case BFD_RELOC_V850_TDA_4_4_OFFSET
:
3633 *where
= (*where
& ~0xf) | (value
& 0xf);
3636 case BFD_RELOC_V850_CALLT_6_7_OFFSET
:
3637 *where
= (*where
& ~0x3f) | (value
& 0x3f);
3647 /* Parse a cons expression. We have to handle hi(), lo(), etc
3650 bfd_reloc_code_real_type
3651 parse_cons_expression_v850 (expressionS
*exp
)
3654 bfd_reloc_code_real_type r
;
3656 /* See if there's a reloc prefix like hi() we have to handle. */
3657 r
= v850_reloc_prefix (NULL
, &errmsg
);
3659 /* Do normal expression parsing. */
3664 /* Create a fixup for a cons expression. If parse_cons_expression_v850
3665 found a reloc prefix, then we use that reloc, else we choose an
3666 appropriate one based on the size of the expression. */
3669 cons_fix_new_v850 (fragS
*frag
,
3673 bfd_reloc_code_real_type r
)
3675 if (r
== BFD_RELOC_NONE
)
3686 fix_new_exp (frag
, where
, size
, exp
, 0, r
);
3688 fix_new (frag
, where
, size
, NULL
, 0, 0, r
);
3692 v850_fix_adjustable (fixS
*fixP
)
3694 if (fixP
->fx_addsy
== NULL
)
3697 /* Don't adjust function names. */
3698 if (S_IS_FUNCTION (fixP
->fx_addsy
))
3701 /* We need the symbol name for the VTABLE entries. */
3702 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
3703 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
3710 v850_force_relocation (struct fix
*fixP
)
3712 if (fixP
->fx_r_type
== BFD_RELOC_V850_LONGCALL
3713 || fixP
->fx_r_type
== BFD_RELOC_V850_LONGJUMP
)
3718 || fixP
->fx_r_type
== BFD_RELOC_V850_ALIGN
3719 || fixP
->fx_r_type
== BFD_RELOC_V850_9_PCREL
3720 || fixP
->fx_r_type
== BFD_RELOC_V850_16_PCREL
3721 || fixP
->fx_r_type
== BFD_RELOC_V850_17_PCREL
3722 || fixP
->fx_r_type
== BFD_RELOC_V850_22_PCREL
3723 || fixP
->fx_r_type
== BFD_RELOC_V850_32_PCREL
3724 || fixP
->fx_r_type
>= BFD_RELOC_UNUSED
))
3727 return generic_force_reloc (fixP
);
3730 /* Create a v850 note section. */
3732 v850_md_finish (void)
3735 segT orig_seg
= now_seg
;
3736 subsegT orig_subseg
= now_subseg
;
3739 note_sec
= subseg_new (V850_NOTE_SECNAME
, 0);
3740 bfd_set_section_flags (note_sec
, SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_MERGE
);
3741 bfd_set_section_alignment (note_sec
, 2);
3743 /* Provide default values for all of the notes. */
3744 for (id
= V850_NOTE_ALIGNMENT
; id
<= NUM_V850_NOTES
; id
++)
3749 /* Follow the standard note section layout:
3750 First write the length of the name string. */
3752 md_number_to_chars (p
, 4, 4);
3754 /* Next comes the length of the "descriptor", i.e., the actual data. */
3756 md_number_to_chars (p
, 4, 4);
3758 /* Write the note type. */
3760 md_number_to_chars (p
, (valueT
) id
, 4);
3762 /* Write the name field. */
3764 memcpy (p
, V850_NOTE_NAME
, 4);
3766 /* Finally, write the descriptor. */
3770 case V850_NOTE_ALIGNMENT
:
3771 val
= v850_data_8
? EF_RH850_DATA_ALIGN8
: EF_RH850_DATA_ALIGN4
;
3774 case V850_NOTE_DATA_SIZE
:
3775 /* GCC does not currently support an option
3776 for 32-bit doubles with the V850 backend. */
3777 val
= EF_RH850_DOUBLE64
;
3780 case V850_NOTE_FPU_INFO
:
3784 case bfd_mach_v850e3v5
: val
= EF_RH850_FPU30
; break;
3785 case bfd_mach_v850e2v3
: val
= EF_RH850_FPU20
; break;
3793 md_number_to_chars (p
, val
, 4);
3796 /* Paranoia - we probably do not need this. */
3797 subseg_set (orig_seg
, orig_subseg
);