1 /* tc-v850.c -- Assembler code for the NEC V850
2 Copyright 1996-2013 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 /* Temporarily holds the reloc in a cons expression. */
31 static bfd_reloc_code_real_type hold_cons_reloc = BFD_RELOC_UNUSED;
33 /* Set to TRUE if we want to be pedantic about signed overflows. */
34 static bfd_boolean warn_signed_overflows = FALSE;
35 static bfd_boolean warn_unsigned_overflows = FALSE;
37 /* Indicates the target BFD machine number. */
38 static int machine = -1;
41 /* Indiciates the target BFD architecture. */
42 int 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 (stdoutput, 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 name = input_line_pointer;
274 c = get_symbol_end ();
276 /* Just after name is now '\0'. */
277 p = input_line_pointer;
282 if (*input_line_pointer != ',')
284 as_bad (_("Expected comma after symbol-name"));
285 ignore_rest_of_line ();
290 input_line_pointer++;
292 if ((temp = get_absolute_expression ()) < 0)
294 /* xgettext:c-format */
295 as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp);
296 ignore_rest_of_line ();
302 symbolP = symbol_find_or_make (name);
305 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
307 as_bad (_("Ignoring attempt to re-define symbol"));
308 ignore_rest_of_line ();
312 if (S_GET_VALUE (symbolP) != 0)
314 if (S_GET_VALUE (symbolP) != size)
315 /* xgettext:c-format */
316 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
317 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
320 know (symbol_get_frag (symbolP) == &zero_address_frag);
322 if (*input_line_pointer != ',')
327 input_line_pointer++;
331 if (! have_align || *input_line_pointer != '"')
337 temp = get_absolute_expression ();
342 as_warn (_("Common alignment negative; 0 assumed"));
346 if (symbol_get_obj (symbolP)->local)
355 old_subsec = now_subseg;
357 applicable = bfd_applicable_section_flags (stdoutput);
359 applicable &= SEC_ALLOC;
363 case SCOMMON_SECTION:
364 do_v850_seg (SBSS_SECTION, 0);
367 case ZCOMMON_SECTION:
368 do_v850_seg (ZBSS_SECTION, 0);
371 case TCOMMON_SECTION:
372 do_v850_seg (TBSS_SECTION, 0);
378 /* Convert to a power of 2 alignment. */
379 for (align = 0; (temp & 1) == 0; temp >>= 1, ++align)
384 as_bad (_("Common alignment not a power of 2"));
385 ignore_rest_of_line ();
392 record_alignment (now_seg, align);
395 frag_align (align, 0, 0);
399 case SCOMMON_SECTION:
400 if (S_GET_SEGMENT (symbolP) == v850_seg_table[SBSS_SECTION].s)
401 symbol_get_frag (symbolP)->fr_symbol = 0;
404 case ZCOMMON_SECTION:
405 if (S_GET_SEGMENT (symbolP) == v850_seg_table[ZBSS_SECTION].s)
406 symbol_get_frag (symbolP)->fr_symbol = 0;
409 case TCOMMON_SECTION:
410 if (S_GET_SEGMENT (symbolP) == v850_seg_table[TBSS_SECTION].s)
411 symbol_get_frag (symbolP)->fr_symbol = 0;
418 symbol_set_frag (symbolP, frag_now);
419 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
420 (offsetT) size, (char *) 0);
422 S_SET_SIZE (symbolP, size);
426 case SCOMMON_SECTION:
427 S_SET_SEGMENT (symbolP, v850_seg_table[SBSS_SECTION].s);
430 case ZCOMMON_SECTION:
431 S_SET_SEGMENT (symbolP, v850_seg_table[ZBSS_SECTION].s);
434 case TCOMMON_SECTION:
435 S_SET_SEGMENT (symbolP, v850_seg_table[TBSS_SECTION].s);
442 S_CLEAR_EXTERNAL (symbolP);
443 obj_elf_section_change_hook ();
444 subseg_set (old_sec, old_subsec);
453 old_subsec = now_subseg;
455 S_SET_VALUE (symbolP, (valueT) size);
456 S_SET_ALIGN (symbolP, temp);
457 S_SET_EXTERNAL (symbolP);
461 case SCOMMON_SECTION:
462 case ZCOMMON_SECTION:
463 case TCOMMON_SECTION:
464 do_v850_seg (area, 0);
465 S_SET_SEGMENT (symbolP, v850_seg_table[area].s);
472 obj_elf_section_change_hook ();
473 subseg_set (old_sec, old_subsec);
478 input_line_pointer++;
480 /* @@ Some use the dot, some don't. Can we get some consistency?? */
481 if (*input_line_pointer == '.')
482 input_line_pointer++;
484 /* @@ Some say data, some say bss. */
485 if (strncmp (input_line_pointer, "bss\"", 4)
486 && strncmp (input_line_pointer, "data\"", 5))
488 while (*--input_line_pointer != '"')
490 input_line_pointer--;
491 goto bad_common_segment;
494 while (*input_line_pointer++ != '"')
497 goto allocate_common;
500 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
502 demand_empty_rest_of_line ();
507 p = input_line_pointer;
508 while (*p && *p != '\n')
512 as_bad (_("bad .common segment %s"), input_line_pointer + 1);
514 input_line_pointer = p;
515 ignore_rest_of_line ();
521 set_machine (int number)
524 bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
528 case 0: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850); break;
529 case bfd_mach_v850: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850); break;
530 case bfd_mach_v850e: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E); break;
531 case bfd_mach_v850e1: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E); break;
532 case bfd_mach_v850e2: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2); break;
533 case bfd_mach_v850e2v3:SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3); break;
534 case bfd_mach_v850e3v5: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5); break;
539 v850_longcode (int type)
546 as_warn (_(".longcall pseudo-op seen when not relaxing"));
548 as_warn (_(".longjump pseudo-op seen when not relaxing"));
553 if (ex.X_op != O_symbol || ex.X_add_number != 0)
555 as_bad (_("bad .longcall format"));
556 ignore_rest_of_line ();
562 fix_new_exp (frag_now, frag_now_fix (), 4, & ex, 1,
563 BFD_RELOC_V850_LONGCALL);
565 fix_new_exp (frag_now, frag_now_fix (), 4, & ex, 1,
566 BFD_RELOC_V850_LONGJUMP);
568 demand_empty_rest_of_line ();
571 /* The target specific pseudo-ops which we support. */
572 const pseudo_typeS md_pseudo_table[] =
574 { "sdata", v850_seg, SDATA_SECTION },
575 { "tdata", v850_seg, TDATA_SECTION },
576 { "zdata", v850_seg, ZDATA_SECTION },
577 { "sbss", v850_seg, SBSS_SECTION },
578 { "tbss", v850_seg, TBSS_SECTION },
579 { "zbss", v850_seg, ZBSS_SECTION },
580 { "rosdata", v850_seg, ROSDATA_SECTION },
581 { "rozdata", v850_seg, ROZDATA_SECTION },
582 { "bss", v850_seg, BSS_SECTION },
583 { "offset", v850_offset, 0 },
585 { "zcomm", v850_comm, ZCOMMON_SECTION },
586 { "scomm", v850_comm, SCOMMON_SECTION },
587 { "tcomm", v850_comm, TCOMMON_SECTION },
588 { "v850", set_machine, 0 },
589 { "call_table_data", v850_seg, CALL_TABLE_DATA_SECTION },
590 { "call_table_text", v850_seg, CALL_TABLE_TEXT_SECTION },
591 { "v850e", set_machine, bfd_mach_v850e },
592 { "v850e1", set_machine, bfd_mach_v850e1 },
593 { "v850e2", set_machine, bfd_mach_v850e2 },
594 { "v850e2v3", set_machine, bfd_mach_v850e2v3 },
595 { "v850e2v4", set_machine, bfd_mach_v850e3v5 },
596 { "v850e3v5", set_machine, bfd_mach_v850e3v5 },
597 { "longcall", v850_longcode, 1 },
598 { "longjump", v850_longcode, 2 },
602 /* Opcode hash table. */
603 static struct hash_control *v850_hash;
605 /* This table is sorted. Suitable for searching by a binary search. */
606 static const struct reg_name pre_defined_registers[] =
608 { "ep", 30, PROCESSOR_ALL }, /* ep - element ptr. */
609 { "gp", 4, PROCESSOR_ALL }, /* gp - global ptr. */
610 { "hp", 2, PROCESSOR_ALL }, /* hp - handler stack ptr. */
611 { "lp", 31, PROCESSOR_ALL }, /* lp - link ptr. */
612 { "r0", 0, PROCESSOR_ALL },
613 { "r1", 1, PROCESSOR_ALL },
614 { "r10", 10, PROCESSOR_ALL },
615 { "r11", 11, PROCESSOR_ALL },
616 { "r12", 12, PROCESSOR_ALL },
617 { "r13", 13, PROCESSOR_ALL },
618 { "r14", 14, PROCESSOR_ALL },
619 { "r15", 15, PROCESSOR_ALL },
620 { "r16", 16, PROCESSOR_ALL },
621 { "r17", 17, PROCESSOR_ALL },
622 { "r18", 18, PROCESSOR_ALL },
623 { "r19", 19, PROCESSOR_ALL },
624 { "r2", 2, PROCESSOR_ALL },
625 { "r20", 20, PROCESSOR_ALL },
626 { "r21", 21, PROCESSOR_ALL },
627 { "r22", 22, PROCESSOR_ALL },
628 { "r23", 23, PROCESSOR_ALL },
629 { "r24", 24, PROCESSOR_ALL },
630 { "r25", 25, PROCESSOR_ALL },
631 { "r26", 26, PROCESSOR_ALL },
632 { "r27", 27, PROCESSOR_ALL },
633 { "r28", 28, PROCESSOR_ALL },
634 { "r29", 29, PROCESSOR_ALL },
635 { "r3", 3, PROCESSOR_ALL },
636 { "r30", 30, PROCESSOR_ALL },
637 { "r31", 31, PROCESSOR_ALL },
638 { "r4", 4, PROCESSOR_ALL },
639 { "r5", 5, PROCESSOR_ALL },
640 { "r6", 6, PROCESSOR_ALL },
641 { "r7", 7, PROCESSOR_ALL },
642 { "r8", 8, PROCESSOR_ALL },
643 { "r9", 9, PROCESSOR_ALL },
644 { "sp", 3, PROCESSOR_ALL }, /* sp - stack ptr. */
645 { "tp", 5, PROCESSOR_ALL }, /* tp - text ptr. */
646 { "zero", 0, PROCESSOR_ALL },
649 #define REG_NAME_CNT \
650 (sizeof (pre_defined_registers) / sizeof (struct reg_name))
652 static const struct reg_name system_registers[] =
654 { "asid", 23, PROCESSOR_NOT_V850 },
655 { "bpam", 25, PROCESSOR_NOT_V850 },
656 { "bpav", 24, PROCESSOR_NOT_V850 },
657 { "bpc", 22, PROCESSOR_NOT_V850 },
658 { "bpdm", 27, PROCESSOR_NOT_V850 },
659 { "bpdv", 26, PROCESSOR_NOT_V850 },
660 { "bsel", 31, PROCESSOR_V850E2_UP },
661 { "cfg", 7, PROCESSOR_V850E2V3_UP },
662 { "ctbp", 20, PROCESSOR_NOT_V850 },
663 { "ctpc", 16, PROCESSOR_NOT_V850 },
664 { "ctpsw", 17, PROCESSOR_NOT_V850 },
665 { "dbic", 15, PROCESSOR_V850E2_UP },
666 { "dbpc", 18, PROCESSOR_NOT_V850 },
667 { "dbpsw", 19, PROCESSOR_NOT_V850 },
668 { "dbwr", 30, PROCESSOR_V850E2_UP },
669 { "dir", 21, PROCESSOR_NOT_V850 },
670 { "dpa0l", 16, PROCESSOR_V850E2V3_UP },
671 { "dpa0u", 17, PROCESSOR_V850E2V3_UP },
672 { "dpa1l", 18, PROCESSOR_V850E2V3_UP },
673 { "dpa1u", 19, PROCESSOR_V850E2V3_UP },
674 { "dpa2l", 20, PROCESSOR_V850E2V3_UP },
675 { "dpa2u", 21, PROCESSOR_V850E2V3_UP },
676 { "dpa3l", 22, PROCESSOR_V850E2V3_UP },
677 { "dpa3u", 23, PROCESSOR_V850E2V3_UP },
678 { "dpa4l", 24, PROCESSOR_V850E2V3_UP },
679 { "dpa4u", 25, PROCESSOR_V850E2V3_UP },
680 { "dpa5l", 26, PROCESSOR_V850E2V3_UP },
681 { "dpa5u", 27, PROCESSOR_V850E2V3_UP },
682 { "ecr", 4, PROCESSOR_ALL },
683 { "eh_base", 3, PROCESSOR_V850E2V3_UP },
684 { "eh_cfg", 1, PROCESSOR_V850E2V3_UP },
685 { "eh_reset", 2, PROCESSOR_V850E2V3_UP },
686 { "eiic", 13, PROCESSOR_V850E2_UP },
687 { "eipc", 0, PROCESSOR_ALL },
688 { "eipsw", 1, PROCESSOR_ALL },
689 { "eiwr", 28, PROCESSOR_V850E2_UP },
690 { "feic", 14, PROCESSOR_V850E2_UP },
691 { "fepc", 2, PROCESSOR_ALL },
692 { "fepsw", 3, PROCESSOR_ALL },
693 { "fewr", 29, PROCESSOR_V850E2_UP },
694 { "fpcc", 9, PROCESSOR_V850E2V3_UP },
695 { "fpcfg", 10, PROCESSOR_V850E2V3_UP },
696 { "fpec", 11, PROCESSOR_V850E2V3_UP },
697 { "fpepc", 7, PROCESSOR_V850E2V3_UP },
698 { "fpspc", 27, PROCESSOR_V850E2V3_UP },
699 { "fpsr", 6, PROCESSOR_V850E2V3_UP },
700 { "fpst", 8, PROCESSOR_V850E2V3_UP },
701 { "ipa0l", 6, PROCESSOR_V850E2V3_UP },
702 { "ipa0u", 7, PROCESSOR_V850E2V3_UP },
703 { "ipa1l", 8, PROCESSOR_V850E2V3_UP },
704 { "ipa1u", 9, PROCESSOR_V850E2V3_UP },
705 { "ipa2l", 10, PROCESSOR_V850E2V3_UP },
706 { "ipa2u", 11, PROCESSOR_V850E2V3_UP },
707 { "ipa3l", 12, PROCESSOR_V850E2V3_UP },
708 { "ipa3u", 13, PROCESSOR_V850E2V3_UP },
709 { "ipa4l", 14, PROCESSOR_V850E2V3_UP },
710 { "ipa4u", 15, PROCESSOR_V850E2V3_UP },
711 { "mca", 24, PROCESSOR_V850E2V3_UP },
712 { "mcc", 26, PROCESSOR_V850E2V3_UP },
713 { "mcr", 27, PROCESSOR_V850E2V3_UP },
714 { "mcs", 25, PROCESSOR_V850E2V3_UP },
715 { "mpc", 1, PROCESSOR_V850E2V3_UP },
716 { "mpm", 0, PROCESSOR_V850E2V3_UP },
717 { "mpu10_dpa0l", 16, PROCESSOR_V850E2V3_UP },
718 { "mpu10_dpa0u", 17, PROCESSOR_V850E2V3_UP },
719 { "mpu10_dpa1l", 18, PROCESSOR_V850E2V3_UP },
720 { "mpu10_dpa1u", 19, PROCESSOR_V850E2V3_UP },
721 { "mpu10_dpa2l", 20, PROCESSOR_V850E2V3_UP },
722 { "mpu10_dpa2u", 21, PROCESSOR_V850E2V3_UP },
723 { "mpu10_dpa3l", 22, PROCESSOR_V850E2V3_UP },
724 { "mpu10_dpa3u", 23, PROCESSOR_V850E2V3_UP },
725 { "mpu10_dpa4l", 24, PROCESSOR_V850E2V3_UP },
726 { "mpu10_dpa4u", 25, PROCESSOR_V850E2V3_UP },
727 { "mpu10_dpa5l", 26, PROCESSOR_V850E2V3_UP },
728 { "mpu10_dpa5u", 27, PROCESSOR_V850E2V3_UP },
729 { "mpu10_ipa0l", 6, PROCESSOR_V850E2V3_UP },
730 { "mpu10_ipa0u", 7, PROCESSOR_V850E2V3_UP },
731 { "mpu10_ipa1l", 8, PROCESSOR_V850E2V3_UP },
732 { "mpu10_ipa1u", 9, PROCESSOR_V850E2V3_UP },
733 { "mpu10_ipa2l", 10, PROCESSOR_V850E2V3_UP },
734 { "mpu10_ipa2u", 11, PROCESSOR_V850E2V3_UP },
735 { "mpu10_ipa3l", 12, PROCESSOR_V850E2V3_UP },
736 { "mpu10_ipa3u", 13, PROCESSOR_V850E2V3_UP },
737 { "mpu10_ipa4l", 14, PROCESSOR_V850E2V3_UP },
738 { "mpu10_ipa4u", 15, PROCESSOR_V850E2V3_UP },
739 { "mpu10_mpc", 1, PROCESSOR_V850E2V3_UP },
740 { "mpu10_mpm", 0, PROCESSOR_V850E2V3_UP },
741 { "mpu10_tid", 2, PROCESSOR_V850E2V3_UP },
742 { "mpu10_vmadr", 5, PROCESSOR_V850E2V3_UP },
743 { "mpu10_vmecr", 3, PROCESSOR_V850E2V3_UP },
744 { "mpu10_vmtid", 4, PROCESSOR_V850E2V3_UP },
745 { "pid", 6, PROCESSOR_V850E2V3_UP },
746 { "pmcr0", 4, PROCESSOR_V850E2V3_UP },
747 { "pmis2", 14, PROCESSOR_V850E2V3_UP },
748 { "psw", 5, PROCESSOR_ALL },
749 { "scbp", 12, PROCESSOR_V850E2V3_UP },
750 { "sccfg", 11, PROCESSOR_V850E2V3_UP },
751 { "sr0", 0, PROCESSOR_ALL },
752 { "sr1", 1, PROCESSOR_ALL },
753 { "sr10", 10, PROCESSOR_ALL },
754 { "sr11", 11, PROCESSOR_ALL },
755 { "sr12", 12, PROCESSOR_ALL },
756 { "sr13", 13, PROCESSOR_ALL },
757 { "sr14", 14, PROCESSOR_ALL },
758 { "sr15", 15, PROCESSOR_ALL },
759 { "sr16", 16, PROCESSOR_ALL },
760 { "sr17", 17, PROCESSOR_ALL },
761 { "sr18", 18, PROCESSOR_ALL },
762 { "sr19", 19, PROCESSOR_ALL },
763 { "sr2", 2, PROCESSOR_ALL },
764 { "sr20", 20, PROCESSOR_ALL },
765 { "sr21", 21, PROCESSOR_ALL },
766 { "sr22", 22, PROCESSOR_ALL },
767 { "sr23", 23, PROCESSOR_ALL },
768 { "sr24", 24, PROCESSOR_ALL },
769 { "sr25", 25, PROCESSOR_ALL },
770 { "sr26", 26, PROCESSOR_ALL },
771 { "sr27", 27, PROCESSOR_ALL },
772 { "sr28", 28, PROCESSOR_ALL },
773 { "sr29", 29, PROCESSOR_ALL },
774 { "sr3", 3, PROCESSOR_ALL },
775 { "sr30", 30, PROCESSOR_ALL },
776 { "sr31", 31, PROCESSOR_ALL },
777 { "sr4", 4, PROCESSOR_ALL },
778 { "sr5", 5, PROCESSOR_ALL },
779 { "sr6", 6, PROCESSOR_ALL },
780 { "sr7", 7, PROCESSOR_ALL },
781 { "sr8", 8, PROCESSOR_ALL },
782 { "sr9", 9, PROCESSOR_ALL },
783 { "sw_base", 3, PROCESSOR_V850E2V3_UP },
784 { "sw_cfg", 1, PROCESSOR_V850E2V3_UP },
785 { "sw_ctl", 0, PROCESSOR_V850E2V3_UP },
786 { "tid", 2, PROCESSOR_V850E2V3_UP },
787 { "vmadr", 6, PROCESSOR_V850E2V3_UP },
788 { "vmecr", 4, PROCESSOR_V850E2V3_UP },
789 { "vmtid", 5, PROCESSOR_V850E2V3_UP },
790 { "vsadr", 2, PROCESSOR_V850E2V3_UP },
791 { "vsecr", 0, PROCESSOR_V850E2V3_UP },
792 { "vstid", 1, PROCESSOR_V850E2V3_UP },
795 #define SYSREG_NAME_CNT \
796 (sizeof (system_registers) / sizeof (struct reg_name))
799 static const struct reg_name cc_names[] =
801 { "c", 0x1, PROCESSOR_ALL },
802 { "e", 0x2, PROCESSOR_ALL },
803 { "ge", 0xe, PROCESSOR_ALL },
804 { "gt", 0xf, PROCESSOR_ALL },
805 { "h", 0xb, PROCESSOR_ALL },
806 { "l", 0x1, PROCESSOR_ALL },
807 { "le", 0x7, PROCESSOR_ALL },
808 { "lt", 0x6, PROCESSOR_ALL },
809 { "n", 0x4, PROCESSOR_ALL },
810 { "nc", 0x9, PROCESSOR_ALL },
811 { "ne", 0xa, PROCESSOR_ALL },
812 { "nh", 0x3, PROCESSOR_ALL },
813 { "nl", 0x9, PROCESSOR_ALL },
814 { "ns", 0xc, PROCESSOR_ALL },
815 { "nv", 0x8, PROCESSOR_ALL },
816 { "nz", 0xa, PROCESSOR_ALL },
817 { "p", 0xc, PROCESSOR_ALL },
818 { "s", 0x4, PROCESSOR_ALL },
819 #define COND_SA_NUM 0xd
820 { "sa", COND_SA_NUM, PROCESSOR_ALL },
821 { "t", 0x5, PROCESSOR_ALL },
822 { "v", 0x0, PROCESSOR_ALL },
823 { "z", 0x2, PROCESSOR_ALL },
826 #define CC_NAME_CNT \
827 (sizeof (cc_names) / sizeof (struct reg_name))
829 static const struct reg_name float_cc_names[] =
831 { "eq", 0x2, PROCESSOR_V850E2V3_UP }, /* true. */
832 { "f", 0x0, PROCESSOR_V850E2V3_UP }, /* true. */
833 { "ge", 0xd, PROCESSOR_V850E2V3_UP }, /* false. */
834 { "gl", 0xb, PROCESSOR_V850E2V3_UP }, /* false. */
835 { "gle", 0x9, PROCESSOR_V850E2V3_UP }, /* false. */
836 { "gt", 0xf, PROCESSOR_V850E2V3_UP }, /* false. */
837 { "le", 0xe, PROCESSOR_V850E2V3_UP }, /* true. */
838 { "lt", 0xc, PROCESSOR_V850E2V3_UP }, /* true. */
839 { "neq", 0x2, PROCESSOR_V850E2V3_UP }, /* false. */
840 { "nge", 0xd, PROCESSOR_V850E2V3_UP }, /* true. */
841 { "ngl", 0xb, PROCESSOR_V850E2V3_UP }, /* true. */
842 { "ngle",0x9, PROCESSOR_V850E2V3_UP }, /* true. */
843 { "ngt", 0xf, PROCESSOR_V850E2V3_UP }, /* true. */
844 { "nle", 0xe, PROCESSOR_V850E2V3_UP }, /* false. */
845 { "nlt", 0xc, PROCESSOR_V850E2V3_UP }, /* false. */
846 { "oge", 0x5, PROCESSOR_V850E2V3_UP }, /* false. */
847 { "ogl", 0x3, PROCESSOR_V850E2V3_UP }, /* false. */
848 { "ogt", 0x7, PROCESSOR_V850E2V3_UP }, /* false. */
849 { "ole", 0x6, PROCESSOR_V850E2V3_UP }, /* true. */
850 { "olt", 0x4, PROCESSOR_V850E2V3_UP }, /* true. */
851 { "or", 0x1, PROCESSOR_V850E2V3_UP }, /* false. */
852 { "seq", 0xa, PROCESSOR_V850E2V3_UP }, /* true. */
853 { "sf", 0x8, PROCESSOR_V850E2V3_UP }, /* true. */
854 { "sne", 0xa, PROCESSOR_V850E2V3_UP }, /* false. */
855 { "st", 0x8, PROCESSOR_V850E2V3_UP }, /* false. */
856 { "t", 0x0, PROCESSOR_V850E2V3_UP }, /* false. */
857 { "ueq", 0x3, PROCESSOR_V850E2V3_UP }, /* true. */
858 { "uge", 0x4, PROCESSOR_V850E2V3_UP }, /* false. */
859 { "ugt", 0x6, PROCESSOR_V850E2V3_UP }, /* false. */
860 { "ule", 0x7, PROCESSOR_V850E2V3_UP }, /* true. */
861 { "ult", 0x5, PROCESSOR_V850E2V3_UP }, /* true. */
862 { "un", 0x1, PROCESSOR_V850E2V3_UP }, /* true. */
865 #define FLOAT_CC_NAME_CNT \
866 (sizeof (float_cc_names) / sizeof (struct reg_name))
869 static const struct reg_name cacheop_names[] =
871 { "cfald", 0x44, PROCESSOR_V850E3V5_UP },
872 { "cfali", 0x40, PROCESSOR_V850E3V5_UP },
873 { "chbid", 0x04, PROCESSOR_V850E3V5_UP },
874 { "chbii", 0x00, PROCESSOR_V850E3V5_UP },
875 { "chbiwbd", 0x06, PROCESSOR_V850E3V5_UP },
876 { "chbwbd", 0x07, PROCESSOR_V850E3V5_UP },
877 { "cibid", 0x24, PROCESSOR_V850E3V5_UP },
878 { "cibii", 0x20, PROCESSOR_V850E3V5_UP },
879 { "cibiwbd", 0x26, PROCESSOR_V850E3V5_UP },
880 { "cibwbd", 0x27, PROCESSOR_V850E3V5_UP },
881 { "cildd", 0x65, PROCESSOR_V850E3V5_UP },
882 { "cildi", 0x61, PROCESSOR_V850E3V5_UP },
883 { "cistd", 0x64, PROCESSOR_V850E3V5_UP },
884 { "cisti", 0x60, PROCESSOR_V850E3V5_UP },
887 #define CACHEOP_NAME_CNT \
888 (sizeof (cacheop_names) / sizeof (struct reg_name))
890 static const struct reg_name prefop_names[] =
892 { "prefd", 0x04, PROCESSOR_V850E3V5_UP },
893 { "prefi", 0x00, PROCESSOR_V850E3V5_UP },
896 #define PREFOP_NAME_CNT \
897 (sizeof (prefop_names) / sizeof (struct reg_name))
899 static const struct reg_name vector_registers[] =
901 { "vr0", 0, PROCESSOR_V850E3V5_UP },
902 { "vr1", 1, PROCESSOR_V850E3V5_UP },
903 { "vr10", 10, PROCESSOR_V850E3V5_UP },
904 { "vr11", 11, PROCESSOR_V850E3V5_UP },
905 { "vr12", 12, PROCESSOR_V850E3V5_UP },
906 { "vr13", 13, PROCESSOR_V850E3V5_UP },
907 { "vr14", 14, PROCESSOR_V850E3V5_UP },
908 { "vr15", 15, PROCESSOR_V850E3V5_UP },
909 { "vr16", 16, PROCESSOR_V850E3V5_UP },
910 { "vr17", 17, PROCESSOR_V850E3V5_UP },
911 { "vr18", 18, PROCESSOR_V850E3V5_UP },
912 { "vr19", 19, PROCESSOR_V850E3V5_UP },
913 { "vr2", 2, PROCESSOR_V850E3V5_UP },
914 { "vr20", 20, PROCESSOR_V850E3V5_UP },
915 { "vr21", 21, PROCESSOR_V850E3V5_UP },
916 { "vr22", 22, PROCESSOR_V850E3V5_UP },
917 { "vr23", 23, PROCESSOR_V850E3V5_UP },
918 { "vr24", 24, PROCESSOR_V850E3V5_UP },
919 { "vr25", 25, PROCESSOR_V850E3V5_UP },
920 { "vr26", 26, PROCESSOR_V850E3V5_UP },
921 { "vr27", 27, PROCESSOR_V850E3V5_UP },
922 { "vr28", 28, PROCESSOR_V850E3V5_UP },
923 { "vr29", 29, PROCESSOR_V850E3V5_UP },
924 { "vr3", 3, PROCESSOR_V850E3V5_UP },
925 { "vr30", 30, PROCESSOR_V850E3V5_UP },
926 { "vr31", 31, PROCESSOR_V850E3V5_UP },
927 { "vr4", 4, PROCESSOR_V850E3V5_UP },
928 { "vr5", 5, PROCESSOR_V850E3V5_UP },
929 { "vr6", 6, PROCESSOR_V850E3V5_UP },
930 { "vr7", 7, PROCESSOR_V850E3V5_UP },
931 { "vr8", 8, PROCESSOR_V850E3V5_UP },
932 { "vr9", 9, PROCESSOR_V850E3V5_UP },
935 #define VREG_NAME_CNT \
936 (sizeof (vector_registers) / sizeof (struct reg_name))
938 /* Do a binary search of the given register table to see if NAME is a
939 valid regiter name. Return the register number from the array on
940 success, or -1 on failure. */
943 reg_name_search (const struct reg_name *regs,
946 bfd_boolean accept_numbers)
948 int middle, low, high;
952 /* If the register name is a symbol, then evaluate it. */
953 if ((symbolP = symbol_find (name)) != NULL)
955 /* If the symbol is an alias for another name then use that.
956 If the symbol is an alias for a number, then return the number. */
957 if (symbol_equated_p (symbolP))
959 = S_GET_NAME (symbol_get_value_expression (symbolP)->X_add_symbol);
960 else if (accept_numbers)
962 int reg = S_GET_VALUE (symbolP);
966 /* Otherwise drop through and try parsing name normally. */
974 middle = (low + high) / 2;
975 cmp = strcasecmp (name, regs[middle].name);
981 return ((regs[middle].processors & processor_mask)
989 /* Summary of register_name().
991 in: Input_line_pointer points to 1st char of operand.
994 The operand may have been a register: in this case, X_op == O_register,
995 X_add_number is set to the register number, and truth is returned.
996 Input_line_pointer->(next non-blank) char after operand, or is in
997 its original state. */
1000 register_name (expressionS *expressionP)
1007 /* Find the spelling of the operand. */
1008 start = name = input_line_pointer;
1010 c = get_symbol_end ();
1012 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT,
1015 /* Put back the delimiting char. */
1016 *input_line_pointer = c;
1018 expressionP->X_add_symbol = NULL;
1019 expressionP->X_op_symbol = NULL;
1021 /* Look to see if it's in the register table. */
1022 if (reg_number >= 0)
1024 expressionP->X_op = O_register;
1025 expressionP->X_add_number = reg_number;
1030 /* Reset the line as if we had not done anything. */
1031 input_line_pointer = start;
1033 expressionP->X_op = O_illegal;
1038 /* Summary of system_register_name().
1040 in: INPUT_LINE_POINTER points to 1st char of operand.
1041 EXPRESSIONP points to an expression structure to be filled in.
1042 ACCEPT_NUMBERS is true iff numerical register names may be used.
1044 out: An expressionS structure in expressionP.
1045 The operand may have been a register: in this case, X_op == O_register,
1046 X_add_number is set to the register number, and truth is returned.
1047 Input_line_pointer->(next non-blank) char after operand, or is in
1048 its original state. */
1051 system_register_name (expressionS *expressionP,
1052 bfd_boolean accept_numbers)
1059 /* Find the spelling of the operand. */
1060 start = name = input_line_pointer;
1062 c = get_symbol_end ();
1063 reg_number = reg_name_search (system_registers, SYSREG_NAME_CNT, name,
1066 /* Put back the delimiting char. */
1067 *input_line_pointer = c;
1072 /* Reset input_line pointer. */
1073 input_line_pointer = start;
1075 if (ISDIGIT (*input_line_pointer))
1077 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1081 expressionP->X_add_symbol = NULL;
1082 expressionP->X_op_symbol = NULL;
1084 /* Look to see if it's in the register table. */
1085 if (reg_number >= 0)
1087 expressionP->X_op = O_register;
1088 expressionP->X_add_number = reg_number;
1093 /* Reset the line as if we had not done anything. */
1094 input_line_pointer = start;
1096 expressionP->X_op = O_illegal;
1101 /* Summary of cc_name().
1103 in: INPUT_LINE_POINTER points to 1st char of operand.
1105 out: An expressionS.
1106 The operand may have been a register: in this case, X_op == O_register,
1107 X_add_number is set to the register number, and truth is returned.
1108 Input_line_pointer->(next non-blank) char after operand, or is in
1109 its original state. */
1112 cc_name (expressionS *expressionP,
1113 bfd_boolean accept_numbers)
1120 /* Find the spelling of the operand. */
1121 start = name = input_line_pointer;
1123 c = get_symbol_end ();
1124 reg_number = reg_name_search (cc_names, CC_NAME_CNT, name, accept_numbers);
1126 /* Put back the delimiting char. */
1127 *input_line_pointer = c;
1132 /* Reset input_line pointer. */
1133 input_line_pointer = start;
1135 if (ISDIGIT (*input_line_pointer))
1137 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1141 expressionP->X_add_symbol = NULL;
1142 expressionP->X_op_symbol = NULL;
1144 /* Look to see if it's in the register table. */
1145 if (reg_number >= 0)
1147 expressionP->X_op = O_constant;
1148 expressionP->X_add_number = reg_number;
1153 /* Reset the line as if we had not done anything. */
1154 input_line_pointer = start;
1156 expressionP->X_op = O_illegal;
1157 expressionP->X_add_number = 0;
1163 float_cc_name (expressionS *expressionP,
1164 bfd_boolean accept_numbers)
1171 /* Find the spelling of the operand. */
1172 start = name = input_line_pointer;
1174 c = get_symbol_end ();
1175 reg_number = reg_name_search (float_cc_names, FLOAT_CC_NAME_CNT, name, accept_numbers);
1177 /* Put back the delimiting char. */
1178 *input_line_pointer = c;
1183 /* Reset input_line pointer. */
1184 input_line_pointer = start;
1186 if (ISDIGIT (*input_line_pointer))
1188 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1192 expressionP->X_add_symbol = NULL;
1193 expressionP->X_op_symbol = NULL;
1195 /* Look to see if it's in the register table. */
1196 if (reg_number >= 0)
1198 expressionP->X_op = O_constant;
1199 expressionP->X_add_number = reg_number;
1204 /* Reset the line as if we had not done anything. */
1205 input_line_pointer = start;
1207 expressionP->X_op = O_illegal;
1208 expressionP->X_add_number = 0;
1214 cacheop_name (expressionS * expressionP,
1215 bfd_boolean accept_numbers)
1222 /* Find the spelling of the operand. */
1223 start = name = input_line_pointer;
1225 c = get_symbol_end ();
1226 reg_number = reg_name_search (cacheop_names, CACHEOP_NAME_CNT, name, accept_numbers);
1228 /* Put back the delimiting char. */
1229 *input_line_pointer = c;
1234 /* Reset input_line pointer. */
1235 input_line_pointer = start;
1237 if (ISDIGIT (*input_line_pointer))
1238 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1241 expressionP->X_add_symbol = NULL;
1242 expressionP->X_op_symbol = NULL;
1244 /* Look to see if it's in the register table. */
1245 if (reg_number >= 0)
1247 expressionP->X_op = O_constant;
1248 expressionP->X_add_number = reg_number;
1253 /* Reset the line as if we had not done anything. */
1254 input_line_pointer = start;
1256 expressionP->X_op = O_illegal;
1257 expressionP->X_add_number = 0;
1263 prefop_name (expressionS * expressionP,
1264 bfd_boolean accept_numbers)
1271 /* Find the spelling of the operand. */
1272 start = name = input_line_pointer;
1274 c = get_symbol_end ();
1275 reg_number = reg_name_search (prefop_names, PREFOP_NAME_CNT, name, accept_numbers);
1277 /* Put back the delimiting char. */
1278 *input_line_pointer = c;
1283 /* Reset input_line pointer. */
1284 input_line_pointer = start;
1286 if (ISDIGIT (*input_line_pointer))
1287 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1290 expressionP->X_add_symbol = NULL;
1291 expressionP->X_op_symbol = NULL;
1293 /* Look to see if it's in the register table. */
1294 if (reg_number >= 0)
1296 expressionP->X_op = O_constant;
1297 expressionP->X_add_number = reg_number;
1302 /* Reset the line as if we had not done anything. */
1303 input_line_pointer = start;
1305 expressionP->X_op = O_illegal;
1306 expressionP->X_add_number = 0;
1312 vector_register_name (expressionS *expressionP)
1319 /* Find the spelling of the operand. */
1320 start = name = input_line_pointer;
1322 c = get_symbol_end ();
1324 reg_number = reg_name_search (vector_registers, VREG_NAME_CNT,
1327 /* Put back the delimiting char. */
1328 *input_line_pointer = c;
1330 expressionP->X_add_symbol = NULL;
1331 expressionP->X_op_symbol = NULL;
1333 /* Look to see if it's in the register table. */
1334 if (reg_number >= 0)
1336 expressionP->X_op = O_register;
1337 expressionP->X_add_number = reg_number;
1342 /* Reset the line as if we had not done anything. */
1343 input_line_pointer = start;
1345 expressionP->X_op = O_illegal;
1351 skip_white_space (void)
1353 while (*input_line_pointer == ' '
1354 || *input_line_pointer == '\t')
1355 ++input_line_pointer;
1358 /* Summary of parse_register_list ().
1360 in: INPUT_LINE_POINTER points to 1st char of a list of registers.
1361 INSN is the partially constructed instruction.
1362 OPERAND is the operand being inserted.
1364 out: NULL if the parse completed successfully, otherwise a
1365 pointer to an error message is returned. If the parse
1366 completes the correct bit fields in the instruction
1369 Parses register lists with the syntax:
1377 and also parses constant expressions whoes bits indicate the
1378 registers in the lists. The LSB in the expression refers to
1379 the lowest numbered permissible register in the register list,
1380 and so on upwards. System registers are considered to be very
1384 parse_register_list (unsigned long *insn,
1385 const struct v850_operand *operand)
1387 static int type1_regs[32] =
1389 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1390 0, 0, 0, 0, 0, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
1396 /* Select a register array to parse. */
1397 switch (operand->shift)
1399 case 0xffe00001: regs = type1_regs; break;
1401 as_bad (_("unknown operand shift: %x\n"), operand->shift);
1402 return _("internal failure in parse_register_list");
1405 skip_white_space ();
1407 /* If the expression starts with a curly brace it is a register list.
1408 Otherwise it is a constant expression, whoes bits indicate which
1409 registers are to be included in the list. */
1410 if (*input_line_pointer != '{')
1417 if (exp.X_op != O_constant)
1418 return _("constant expression or register list expected");
1420 if (regs == type1_regs)
1422 if (exp.X_add_number & 0xFFFFF000)
1423 return _("high bits set in register list expression");
1425 for (reg = 20; reg < 32; reg++)
1426 if (exp.X_add_number & (1 << (reg - 20)))
1428 for (i = 0; i < 32; i++)
1437 input_line_pointer++;
1439 /* Parse the register list until a terminator (closing curly brace or
1440 new-line) is found. */
1443 skip_white_space ();
1445 if (register_name (&exp))
1449 /* Locate the given register in the list, and if it is there,
1450 insert the corresponding bit into the instruction. */
1451 for (i = 0; i < 32; i++)
1453 if (regs[i] == exp.X_add_number)
1461 return _("illegal register included in list");
1463 else if (system_register_name (&exp, TRUE))
1465 if (regs == type1_regs)
1467 return _("system registers cannot be included in list");
1471 if (*input_line_pointer == '}')
1473 input_line_pointer++;
1476 else if (*input_line_pointer == ',')
1478 input_line_pointer++;
1481 else if (*input_line_pointer == '-')
1483 /* We have encountered a range of registers: rX - rY. */
1487 /* Skip the dash. */
1488 ++input_line_pointer;
1490 /* Get the second register in the range. */
1491 if (! register_name (&exp2))
1493 return _("second register should follow dash in register list");
1496 if (exp.X_add_number > exp2.X_add_number)
1498 return _("second register should be greater than first register");
1501 /* Add the rest of the registers in the range. */
1502 for (j = exp.X_add_number + 1; j <= exp2.X_add_number; j++)
1506 /* Locate the given register in the list, and if it is there,
1507 insert the corresponding bit into the instruction. */
1508 for (i = 0; i < 32; i++)
1518 return _("illegal register included in list");
1530 const char *md_shortopts = "m:";
1532 struct option md_longopts[] =
1534 #define OPTION_DISP_SIZE_DEFAULT_22 (OPTION_MD_BASE)
1535 {"disp-size-default-22", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_22},
1536 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 1)
1537 {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
1538 {NULL, no_argument, NULL, 0}
1541 size_t md_longopts_size = sizeof (md_longopts);
1544 md_show_usage (FILE *stream)
1546 fprintf (stream, _(" V850 options:\n"));
1547 fprintf (stream, _(" -mwarn-signed-overflow Warn if signed immediate values overflow\n"));
1548 fprintf (stream, _(" -mwarn-unsigned-overflow Warn if unsigned immediate values overflow\n"));
1549 fprintf (stream, _(" -mv850 The code is targeted at the v850\n"));
1550 fprintf (stream, _(" -mv850e The code is targeted at the v850e\n"));
1551 fprintf (stream, _(" -mv850e1 The code is targeted at the v850e1\n"));
1552 fprintf (stream, _(" -mv850e2 The code is targeted at the v850e2\n"));
1553 fprintf (stream, _(" -mv850e2v3 The code is targeted at the v850e2v3\n"));
1554 fprintf (stream, _(" -mv850e2v4 Alias for -mv850e3v5\n"));
1555 fprintf (stream, _(" -mv850e3v5 The code is targeted at the v850e3v5\n"));
1556 fprintf (stream, _(" -mrelax Enable relaxation\n"));
1557 fprintf (stream, _(" --disp-size-default-22 branch displacement with unknown size is 22 bits (default)\n"));
1558 fprintf (stream, _(" --disp-size-default-32 branch displacement with unknown size is 32 bits\n"));
1559 fprintf (stream, _(" -mextension enable extension opcode support\n"));
1560 fprintf (stream, _(" -mno-bcond17 disable b<cond> disp17 instruction\n"));
1561 fprintf (stream, _(" -mno-stld23 disable st/ld offset23 instruction\n"));
1562 fprintf (stream, _(" -mgcc-abi Mark the binary as using the old GCC ABI\n"));
1563 fprintf (stream, _(" -mrh850-abi Mark the binary as using the RH850 ABI (default)\n"));
1564 fprintf (stream, _(" -m8byte-align Mark the binary as using 64-bit alignment\n"));
1565 fprintf (stream, _(" -m4byte-align Mark the binary as using 32-bit alignment (default)\n"));
1569 md_parse_option (int c, char *arg)
1575 case OPTION_DISP_SIZE_DEFAULT_22:
1576 default_disp_size = 22;
1579 case OPTION_DISP_SIZE_DEFAULT_32:
1580 default_disp_size = 32;
1586 if (strcmp (arg, "warn-signed-overflow") == 0)
1587 warn_signed_overflows = TRUE;
1589 else if (strcmp (arg, "warn-unsigned-overflow") == 0)
1590 warn_unsigned_overflows = TRUE;
1592 else if (strcmp (arg, "v850") == 0)
1595 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);
1597 else if (strcmp (arg, "v850e") == 0)
1599 machine = bfd_mach_v850e;
1600 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);
1602 else if (strcmp (arg, "v850e1") == 0)
1604 machine = bfd_mach_v850e1;
1605 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E1);
1607 else if (strcmp (arg, "v850e2") == 0)
1609 machine = bfd_mach_v850e2;
1610 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2);
1612 else if (strcmp (arg, "v850e2v3") == 0)
1614 machine = bfd_mach_v850e2v3;
1615 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3);
1617 else if (strcmp (arg, "v850e2v4") == 0)
1619 machine = bfd_mach_v850e3v5;
1620 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1622 else if (strcmp (arg, "v850e3v5") == 0)
1624 machine = bfd_mach_v850e3v5;
1625 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1627 else if (strcmp (arg, "extension") == 0)
1629 processor_mask |= PROCESSOR_OPTION_EXTENSION | PROCESSOR_OPTION_ALIAS;
1631 else if (strcmp (arg, "no-bcond17") == 0)
1635 else if (strcmp (arg, "no-stld23") == 0)
1639 else if (strcmp (arg, "relax") == 0)
1641 else if (strcmp (arg, "gcc-abi") == 0)
1643 v850_target_arch = bfd_arch_v850;
1644 v850_target_format = "elf32-v850";
1646 else if (strcmp (arg, "rh850-abi") == 0)
1648 v850_target_arch = bfd_arch_v850_rh850;
1649 v850_target_format = "elf32-v850-rh850";
1651 else if (strcmp (arg, "8byte-align") == 0)
1652 v850_e_flags |= EF_RH850_DATA_ALIGN8;
1653 else if (strcmp (arg, "4byte-align") == 0)
1654 v850_e_flags &= ~ EF_RH850_DATA_ALIGN8;
1662 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1668 md_atof (int type, char *litp, int *sizep)
1670 return ieee_md_atof (type, litp, sizep, FALSE);
1676 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1682 bfd_reloc_code_real_type fx_r_type;
1686 subseg_change (sec, 0);
1688 opcode_converter.fr_opcode = fragP->fr_opcode;
1690 subseg_change (sec, 0);
1692 if (fragP->fr_subtype == SUBYPTE_LOOP_16_22)
1694 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1695 fragP->fr_offset, 1,
1696 BFD_RELOC_UNUSED + opcode_converter.fx_r_type);
1699 else if (fragP->fr_subtype == SUBYPTE_LOOP_16_22 + 1)
1701 unsigned char * buffer =
1702 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1703 int loop_reg = (buffer[0] & 0x1f);
1706 md_number_to_chars ((char *) buffer, 0x025f | (loop_reg << 11), 2);
1707 /* Now create the conditional branch + fixup to the final target. */
1708 /* 0x000107ea = bne LBL(disp17). */
1709 md_number_to_chars ((char *) buffer + 2, 0x000107ea, 4);
1710 fix_new (fragP, fragP->fr_fix+2, 4, fragP->fr_symbol,
1711 fragP->fr_offset, 1,
1712 BFD_RELOC_V850_17_PCREL);
1715 /* In range conditional or unconditional branch. */
1716 else if (fragP->fr_subtype == SUBYPTE_COND_9_22
1717 || fragP->fr_subtype == SUBYPTE_UNCOND_9_22
1718 || fragP->fr_subtype == SUBYPTE_COND_9_22_32
1719 || fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32
1720 || fragP->fr_subtype == SUBYPTE_COND_9_17_22
1721 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32
1722 || fragP->fr_subtype == SUBYPTE_SA_9_22
1723 || fragP->fr_subtype == SUBYPTE_SA_9_22_32
1724 || fragP->fr_subtype == SUBYPTE_SA_9_17_22
1725 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32)
1728 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
1729 fragP->fr_offset, 1,
1730 BFD_RELOC_UNUSED + opcode_converter.fx_r_type);
1733 /* V850e2r-v3 17bit conditional branch. */
1734 else if (fragP->fr_subtype == SUBYPTE_COND_9_17_22 + 1
1735 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 1
1736 || fragP->fr_subtype == SUBYPTE_SA_9_17_22 + 1
1737 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 1)
1739 unsigned char *buffer =
1740 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1742 buffer[0] &= 0x0f; /* Use condition. */
1746 /* Now create the unconditional branch + fixup to the final
1748 md_number_to_chars ((char *) buffer + 2, 0x0001, 2);
1749 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1750 fragP->fr_offset, 1, BFD_RELOC_V850_17_PCREL);
1753 /* Out of range conditional branch. Emit a branch around a 22bit jump. */
1754 else if (fragP->fr_subtype == SUBYPTE_COND_9_22 + 1
1755 || fragP->fr_subtype == SUBYPTE_COND_9_22_32 + 1
1756 || fragP->fr_subtype == SUBYPTE_COND_9_17_22 + 2
1757 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 2)
1759 unsigned char *buffer =
1760 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1762 /* Reverse the condition of the first branch. */
1764 /* Mask off all the displacement bits. */
1767 /* Now set the displacement bits so that we branch
1768 around the unconditional branch. */
1771 /* Now create the unconditional branch + fixup to the final
1773 md_number_to_chars ((char *) buffer + 2, 0x00000780, 4);
1774 fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
1775 fragP->fr_offset, 1, BFD_RELOC_V850_22_PCREL);
1778 /* Out of range conditional branch. Emit a branch around a 32bit jump. */
1779 else if (fragP->fr_subtype == SUBYPTE_COND_9_22_32 + 2
1780 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 3)
1782 unsigned char *buffer =
1783 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1785 /* Reverse the condition of the first branch. */
1787 /* Mask off all the displacement bits. */
1790 /* Now set the displacement bits so that we branch
1791 around the unconditional branch. */
1794 /* Now create the unconditional branch + fixup to the final
1796 md_number_to_chars ((char *) buffer + 2, 0x02e0, 2);
1797 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1798 fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
1801 /* Out of range unconditional branch. Emit a 22bit jump. */
1802 else if (fragP->fr_subtype == SUBYPTE_UNCOND_9_22 + 1
1803 || fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32 + 1)
1805 md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x00000780, 4);
1806 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1807 fragP->fr_offset, 1, BFD_RELOC_V850_22_PCREL);
1810 /* Out of range unconditional branch. Emit a 32bit jump. */
1811 else if (fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32 + 2)
1813 md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x02e0, 2);
1814 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1815 fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
1818 /* Out of range SA conditional branch. Emit a branch to a 22bit jump. */
1819 else if (fragP->fr_subtype == SUBYPTE_SA_9_22 + 1
1820 || fragP->fr_subtype == SUBYPTE_SA_9_22_32 + 1
1821 || fragP->fr_subtype == SUBYPTE_SA_9_17_22 + 2
1822 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 2)
1824 unsigned char *buffer =
1825 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1833 md_number_to_chars ((char *) buffer + 2, 0x05b5, 2);
1835 /* Now create the unconditional branch + fixup to the final
1838 md_number_to_chars ((char *) buffer + 4, 0x00000780, 4);
1839 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1840 fragP->fr_offset, 1,
1841 BFD_RELOC_V850_22_PCREL);
1844 /* Out of range SA conditional branch. Emit a branch around a 32bit jump. */
1845 else if (fragP->fr_subtype == SUBYPTE_SA_9_22_32 + 2
1846 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 3)
1848 unsigned char *buffer =
1849 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1857 md_number_to_chars ((char *) buffer + 2, 0x05c5, 2);
1859 /* Now create the unconditional branch + fixup to the final
1862 md_number_to_chars ((char *) buffer + 4, 0x02e0, 2);
1863 fix_new (fragP, fragP->fr_fix + 6, 4, fragP->fr_symbol,
1864 fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
1866 fragP->fr_fix += 10;
1873 md_section_align (asection *seg, valueT addr)
1875 int align = bfd_get_section_alignment (stdoutput, seg);
1876 return ((addr + (1 << align) - 1) & (-1 << align));
1882 char *prev_name = "";
1883 const struct v850_opcode *op;
1885 if (strncmp (TARGET_CPU, "v850e3v5", 8) == 0)
1888 machine = bfd_mach_v850e3v5;
1890 if (!processor_mask)
1891 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1893 else if (strncmp (TARGET_CPU, "v850e2v4", 8) == 0)
1896 machine = bfd_mach_v850e3v5;
1898 if (!processor_mask)
1899 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1901 else if (strncmp (TARGET_CPU, "v850e2v3", 8) == 0)
1904 machine = bfd_mach_v850e2v3;
1906 if (!processor_mask)
1907 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3);
1909 else if (strncmp (TARGET_CPU, "v850e2", 6) == 0)
1912 machine = bfd_mach_v850e2;
1914 if (!processor_mask)
1915 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2);
1917 else if (strncmp (TARGET_CPU, "v850e1", 6) == 0)
1920 machine = bfd_mach_v850e1;
1922 if (!processor_mask)
1923 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E1);
1925 else if (strncmp (TARGET_CPU, "v850e", 5) == 0)
1928 machine = bfd_mach_v850e;
1930 if (!processor_mask)
1931 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);
1933 else if (strncmp (TARGET_CPU, "v850", 4) == 0)
1938 if (!processor_mask)
1939 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);
1942 /* xgettext:c-format */
1943 as_bad (_("Unable to determine default target processor from string: %s"),
1946 v850_hash = hash_new ();
1948 /* Insert unique names into hash table. The V850 instruction set
1949 has many identical opcode names that have different opcodes based
1950 on the operands. This hash table then provides a quick index to
1951 the first opcode with a particular name in the opcode table. */
1955 if (strcmp (prev_name, op->name))
1957 prev_name = (char *) op->name;
1958 hash_insert (v850_hash, op->name, (char *) op);
1963 v850_seg_table[BSS_SECTION].s = bss_section;
1964 bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
1965 bfd_set_private_flags (stdoutput, v850_e_flags);
1969 static bfd_reloc_code_real_type
1970 handle_hi016 (const struct v850_operand *operand, const char **errmsg)
1972 if (operand == NULL)
1973 return BFD_RELOC_HI16;
1975 if (operand->default_reloc == BFD_RELOC_HI16)
1976 return BFD_RELOC_HI16;
1978 if (operand->default_reloc == BFD_RELOC_HI16_S)
1979 return BFD_RELOC_HI16;
1981 if (operand->default_reloc == BFD_RELOC_16)
1982 return BFD_RELOC_HI16;
1984 *errmsg = _("hi0() relocation used on an instruction which does "
1986 return BFD_RELOC_64; /* Used to indicate an error condition. */
1989 static bfd_reloc_code_real_type
1990 handle_hi16 (const struct v850_operand *operand, const char **errmsg)
1992 if (operand == NULL)
1993 return BFD_RELOC_HI16_S;
1995 if (operand->default_reloc == BFD_RELOC_HI16_S)
1996 return BFD_RELOC_HI16_S;
1998 if (operand->default_reloc == BFD_RELOC_HI16)
1999 return BFD_RELOC_HI16_S;
2001 if (operand->default_reloc == BFD_RELOC_16)
2002 return BFD_RELOC_HI16_S;
2004 *errmsg = _("hi() relocation used on an instruction which does "
2006 return BFD_RELOC_64; /* Used to indicate an error condition. */
2009 static bfd_reloc_code_real_type
2010 handle_lo16 (const struct v850_operand *operand, const char **errmsg)
2012 if (operand == NULL)
2013 return BFD_RELOC_LO16;
2015 if (operand->default_reloc == BFD_RELOC_LO16)
2016 return BFD_RELOC_LO16;
2018 if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
2019 return BFD_RELOC_V850_LO16_SPLIT_OFFSET;
2021 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2022 return BFD_RELOC_V850_LO16_S1;
2024 if (operand->default_reloc == BFD_RELOC_16)
2025 return BFD_RELOC_LO16;
2027 *errmsg = _("lo() relocation used on an instruction which does "
2029 return BFD_RELOC_64; /* Used to indicate an error condition. */
2032 static bfd_reloc_code_real_type
2033 handle_ctoff (const struct v850_operand *operand, const char **errmsg)
2035 if (operand == NULL)
2036 return BFD_RELOC_V850_CALLT_16_16_OFFSET;
2038 if (operand->default_reloc == BFD_RELOC_V850_CALLT_6_7_OFFSET)
2039 return operand->default_reloc;
2041 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2042 return BFD_RELOC_V850_CALLT_15_16_OFFSET;
2044 if (operand->default_reloc == BFD_RELOC_16)
2045 return BFD_RELOC_V850_CALLT_16_16_OFFSET;
2047 *errmsg = _("ctoff() relocation used on an instruction which does not support it");
2048 return BFD_RELOC_64; /* Used to indicate an error condition. */
2051 static bfd_reloc_code_real_type
2052 handle_sdaoff (const struct v850_operand *operand, const char **errmsg)
2054 if (operand == NULL)
2055 return BFD_RELOC_V850_SDA_16_16_OFFSET;
2057 if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
2058 return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET;
2060 if (operand->default_reloc == BFD_RELOC_16)
2061 return BFD_RELOC_V850_SDA_16_16_OFFSET;
2063 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2064 return BFD_RELOC_V850_SDA_15_16_OFFSET;
2066 *errmsg = _("sdaoff() relocation used on an instruction which does not support it");
2067 return BFD_RELOC_64; /* Used to indicate an error condition. */
2070 static bfd_reloc_code_real_type
2071 handle_zdaoff (const struct v850_operand *operand, const char **errmsg)
2073 if (operand == NULL)
2074 return BFD_RELOC_V850_ZDA_16_16_OFFSET;
2076 if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
2077 return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET;
2079 if (operand->default_reloc == BFD_RELOC_16)
2080 return BFD_RELOC_V850_ZDA_16_16_OFFSET;
2082 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2083 return BFD_RELOC_V850_ZDA_15_16_OFFSET;
2085 *errmsg = _("zdaoff() relocation used on an instruction which does not support it");
2086 return BFD_RELOC_64; /* Used to indicate an error condition. */
2089 static bfd_reloc_code_real_type
2090 handle_tdaoff (const struct v850_operand *operand, const char **errmsg)
2092 if (operand == NULL)
2093 /* Data item, not an instruction. */
2094 return BFD_RELOC_V850_TDA_16_16_OFFSET;
2096 switch (operand->default_reloc)
2098 /* sld.hu, operand: D5-4. */
2099 case BFD_RELOC_V850_TDA_4_5_OFFSET:
2100 /* sld.bu, operand: D4. */
2101 case BFD_RELOC_V850_TDA_4_4_OFFSET:
2102 /* sld.w/sst.w, operand: D8_6. */
2103 case BFD_RELOC_V850_TDA_6_8_OFFSET:
2104 /* sld.h/sst.h, operand: D8_7. */
2105 case BFD_RELOC_V850_TDA_7_8_OFFSET:
2106 /* sld.b/sst.b, operand: D7. */
2107 case BFD_RELOC_V850_TDA_7_7_OFFSET:
2108 return operand->default_reloc;
2113 if (operand->default_reloc == BFD_RELOC_16 && operand->shift == 16)
2114 /* set1 & chums, operands: D16. */
2115 return BFD_RELOC_V850_TDA_16_16_OFFSET;
2117 *errmsg = _("tdaoff() relocation used on an instruction which does not support it");
2118 /* Used to indicate an error condition. */
2119 return BFD_RELOC_64;
2122 /* Warning: The code in this function relies upon the definitions
2123 in the v850_operands[] array (defined in opcodes/v850-opc.c)
2124 matching the hard coded values contained herein. */
2126 static bfd_reloc_code_real_type
2127 v850_reloc_prefix (const struct v850_operand *operand, const char **errmsg)
2129 bfd_boolean paren_skipped = FALSE;
2131 /* Skip leading opening parenthesis. */
2132 if (*input_line_pointer == '(')
2134 ++input_line_pointer;
2135 paren_skipped = TRUE;
2138 #define CHECK_(name, reloc) \
2139 if (strncmp (input_line_pointer, name "(", strlen (name) + 1) == 0) \
2141 input_line_pointer += strlen (name); \
2145 CHECK_ ("hi0", handle_hi016(operand, errmsg) );
2146 CHECK_ ("hi", handle_hi16(operand, errmsg) );
2147 CHECK_ ("lo", handle_lo16 (operand, errmsg) );
2148 CHECK_ ("sdaoff", handle_sdaoff (operand, errmsg));
2149 CHECK_ ("zdaoff", handle_zdaoff (operand, errmsg));
2150 CHECK_ ("tdaoff", handle_tdaoff (operand, errmsg));
2151 CHECK_ ("hilo", BFD_RELOC_32);
2152 CHECK_ ("lo23", BFD_RELOC_V850_23);
2153 CHECK_ ("ctoff", handle_ctoff (operand, errmsg) );
2155 /* Restore skipped parenthesis. */
2157 --input_line_pointer;
2159 return BFD_RELOC_UNUSED;
2162 /* Insert an operand value into an instruction. */
2164 static unsigned long
2165 v850_insert_operand (unsigned long insn,
2166 const struct v850_operand *operand,
2168 const char **errmsg)
2170 if (operand->insert)
2172 const char *message = NULL;
2174 insn = operand->insert (insn, val, &message);
2175 if (message != NULL)
2177 if ((operand->flags & V850_OPERAND_SIGNED)
2178 && ! warn_signed_overflows
2179 && v850_msg_is_out_of_range (message))
2181 /* Skip warning... */
2183 else if ((operand->flags & V850_OPERAND_SIGNED) == 0
2184 && ! warn_unsigned_overflows
2185 && v850_msg_is_out_of_range (message))
2187 /* Skip warning... */
2196 else if (operand->bits == -1
2197 || operand->flags & V850E_IMMEDIATE16
2198 || operand->flags & V850E_IMMEDIATE23
2199 || operand->flags & V850E_IMMEDIATE32)
2205 if (operand->bits < 32)
2209 if ((operand->flags & V850_OPERAND_SIGNED) != 0)
2211 if (! warn_signed_overflows)
2212 max = (1 << operand->bits) - 1;
2214 max = (1 << (operand->bits - 1)) - 1;
2216 min = -(1 << (operand->bits - 1));
2220 max = (1 << operand->bits) - 1;
2222 if (! warn_unsigned_overflows)
2223 min = -(1 << (operand->bits - 1));
2228 /* Some people write constants with the sign extension done by
2229 hand but only up to 32 bits. This shouldn't really be valid,
2230 but, to permit this code to assemble on a 64-bit host, we
2231 sign extend the 32-bit value to 64 bits if so doing makes the
2234 && (offsetT) (val - 0x80000000 - 0x80000000) >= min
2235 && (offsetT) (val - 0x80000000 - 0x80000000) <= max)
2236 val = val - 0x80000000 - 0x80000000;
2238 /* Similarly, people write expressions like ~(1<<15), and expect
2239 this to be OK for a 32-bit unsigned value. */
2241 && (offsetT) (val + 0x80000000 + 0x80000000) >= min
2242 && (offsetT) (val + 0x80000000 + 0x80000000) <= max)
2243 val = val + 0x80000000 + 0x80000000;
2245 else if (val < (offsetT) min || val > (offsetT) max)
2247 static char buf [128];
2249 /* Restore min and mix to expected values for decimal ranges. */
2250 if ((operand->flags & V850_OPERAND_SIGNED)
2251 && ! warn_signed_overflows)
2252 max = (1 << (operand->bits - 1)) - 1;
2254 if (! (operand->flags & V850_OPERAND_SIGNED)
2255 && ! warn_unsigned_overflows)
2258 sprintf (buf, _("operand out of range (%d is not between %d and %d)"),
2259 (int) val, (int) min, (int) max);
2263 insn |= (((long) val & ((1 << operand->bits) - 1)) << operand->shift);
2267 insn |= (((long) val) << operand->shift);
2274 static char copy_of_instruction[128];
2277 md_assemble (char *str)
2280 char *start_of_operands;
2281 struct v850_opcode *opcode;
2282 struct v850_opcode *next_opcode;
2283 const unsigned char *opindex_ptr;
2287 unsigned long insn_size;
2291 bfd_boolean extra_data_after_insn = FALSE;
2292 unsigned extra_data_len = 0;
2293 unsigned long extra_data = 0;
2294 char *saved_input_line_pointer;
2295 char most_match_errmsg[1024];
2296 int most_match_count = -1;
2298 strncpy (copy_of_instruction, str, sizeof (copy_of_instruction) - 1);
2299 most_match_errmsg[0] = 0;
2301 /* Get the opcode. */
2302 for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
2308 /* Find the first opcode with the proper name. */
2309 opcode = (struct v850_opcode *) hash_find (v850_hash, str);
2312 /* xgettext:c-format */
2313 as_bad (_("Unrecognized opcode: `%s'"), str);
2314 ignore_rest_of_line ();
2319 while (ISSPACE (*str))
2322 start_of_operands = str;
2324 saved_input_line_pointer = input_line_pointer;
2328 const char *errmsg = NULL;
2329 const char *warningmsg = NULL;
2332 opindex_ptr = opcode->operands;
2336 if ((strncmp (opcode->name, "st.", 3) == 0
2337 && v850_operands[opcode->operands[1]].bits == 23)
2338 || (strncmp (opcode->name, "ld.", 3) == 0
2339 && v850_operands[opcode->operands[0]].bits == 23))
2341 errmsg = _("st/ld offset 23 instruction was disabled .");
2346 if ((opcode->processors & processor_mask & PROCESSOR_MASK) == 0
2347 || (((opcode->processors & ~PROCESSOR_MASK) != 0)
2348 && ((opcode->processors & processor_mask & ~PROCESSOR_MASK) == 0)))
2350 errmsg = _("Target processor does not support this instruction.");
2357 insn = opcode->opcode;
2359 extra_data_after_insn = FALSE;
2361 input_line_pointer = str = start_of_operands;
2363 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2365 const struct v850_operand *operand;
2368 bfd_reloc_code_real_type reloc;
2370 if (next_opindex == 0)
2371 operand = &v850_operands[*opindex_ptr];
2374 operand = &v850_operands[next_opindex];
2383 if (operand->flags & V850_OPERAND_BANG
2386 else if (operand->flags & V850_OPERAND_PERCENT
2390 if (*str == ',' || *str == '[' || *str == ']')
2396 if ( (strcmp (opcode->name, "pushsp") == 0
2397 || strcmp (opcode->name, "popsp") == 0
2398 || strcmp (opcode->name, "dbpush") == 0)
2402 if (operand->flags & V850_OPERAND_RELAX)
2405 /* Gather the operand. */
2406 hold = input_line_pointer;
2407 input_line_pointer = str;
2409 /* lo(), hi(), hi0(), etc... */
2410 if ((reloc = v850_reloc_prefix (operand, &errmsg)) != BFD_RELOC_UNUSED)
2412 /* This is a fake reloc, used to indicate an error condition. */
2413 if (reloc == BFD_RELOC_64)
2421 if (ex.X_op == O_constant)
2425 case BFD_RELOC_V850_ZDA_16_16_OFFSET:
2426 case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET:
2427 case BFD_RELOC_V850_ZDA_15_16_OFFSET:
2428 /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
2432 case BFD_RELOC_LO16:
2433 case BFD_RELOC_V850_LO16_S1:
2434 case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
2436 /* Truncate, then sign extend the value. */
2437 ex.X_add_number = SEXT16 (ex.X_add_number);
2441 case BFD_RELOC_HI16:
2443 /* Truncate, then sign extend the value. */
2444 ex.X_add_number = SEXT16 (ex.X_add_number >> 16);
2448 case BFD_RELOC_HI16_S:
2450 /* Truncate, then sign extend the value. */
2451 int temp = (ex.X_add_number >> 16) & 0xffff;
2453 temp += (ex.X_add_number >> 15) & 1;
2455 ex.X_add_number = SEXT16 (temp);
2459 case BFD_RELOC_V850_23:
2460 if ((operand->flags & V850E_IMMEDIATE23) == 0)
2462 errmsg = _("immediate operand is too large");
2468 case BFD_RELOC_V850_32_ABS:
2469 case BFD_RELOC_V850_32_PCREL:
2470 if ((operand->flags & V850E_IMMEDIATE32) == 0)
2472 errmsg = _("immediate operand is too large");
2479 as_bad (_("AAARG -> unhandled constant reloc: %d"), reloc);
2483 if (operand->flags & V850E_IMMEDIATE32)
2485 extra_data_after_insn = TRUE;
2489 else if (operand->flags & V850E_IMMEDIATE23)
2491 if (reloc != BFD_RELOC_V850_23)
2493 errmsg = _("immediate operand is too large");
2496 extra_data_after_insn = TRUE;
2500 else if ((operand->flags & V850E_IMMEDIATE16)
2501 || (operand->flags & V850E_IMMEDIATE16HI))
2503 if (operand->flags & V850E_IMMEDIATE16HI
2504 && reloc != BFD_RELOC_HI16
2505 && reloc != BFD_RELOC_HI16_S)
2507 errmsg = _("immediate operand is too large");
2510 else if (operand->flags & V850E_IMMEDIATE16
2511 && reloc != BFD_RELOC_LO16)
2513 errmsg = _("immediate operand is too large");
2517 extra_data_after_insn = TRUE;
2522 if (fc > MAX_INSN_FIXUPS)
2523 as_fatal (_("too many fixups"));
2525 fixups[fc].exp = ex;
2526 fixups[fc].opindex = *opindex_ptr;
2527 fixups[fc].reloc = reloc;
2530 else /* ex.X_op != O_constant. */
2532 if ((reloc == BFD_RELOC_32
2533 || reloc == BFD_RELOC_V850_32_ABS
2534 || reloc == BFD_RELOC_V850_32_PCREL)
2535 && operand->bits < 32)
2537 errmsg = _("immediate operand is too large");
2540 else if (reloc == BFD_RELOC_V850_23
2541 && (operand->flags & V850E_IMMEDIATE23) == 0)
2543 errmsg = _("immediate operand is too large");
2546 else if ((reloc == BFD_RELOC_HI16
2547 || reloc == BFD_RELOC_HI16_S)
2548 && operand->bits < 16)
2550 errmsg = _("immediate operand is too large");
2554 if (operand->flags & V850E_IMMEDIATE32)
2556 extra_data_after_insn = TRUE;
2560 else if (operand->flags & V850E_IMMEDIATE23)
2562 if (reloc != BFD_RELOC_V850_23)
2564 errmsg = _("immediate operand is too large");
2567 extra_data_after_insn = TRUE;
2571 else if ((operand->flags & V850E_IMMEDIATE16)
2572 || (operand->flags & V850E_IMMEDIATE16HI))
2574 if (operand->flags & V850E_IMMEDIATE16HI
2575 && reloc != BFD_RELOC_HI16
2576 && reloc != BFD_RELOC_HI16_S)
2578 errmsg = _("immediate operand is too large");
2581 else if (operand->flags & V850E_IMMEDIATE16
2582 && reloc != BFD_RELOC_LO16)
2584 errmsg = _("immediate operand is too large");
2588 extra_data_after_insn = TRUE;
2593 if (fc > MAX_INSN_FIXUPS)
2594 as_fatal (_("too many fixups"));
2596 fixups[fc].exp = ex;
2597 fixups[fc].opindex = *opindex_ptr;
2598 fixups[fc].reloc = reloc;
2602 else if (operand->flags & V850E_IMMEDIATE16
2603 || operand->flags & V850E_IMMEDIATE16HI)
2610 if (operand->flags & V850E_IMMEDIATE16HI)
2612 if (ex.X_add_number & 0xffff)
2614 errmsg = _("constant too big to fit into instruction");
2618 ex.X_add_number >>= 16;
2620 if (operand->flags & V850E_IMMEDIATE16)
2622 if ((ex.X_add_number & 0xffff8000)
2623 && ((ex.X_add_number & 0xffff8000) != 0xffff8000))
2625 errmsg = _("constant too big to fit into instruction");
2632 errmsg = _("illegal operand");
2636 errmsg = _("missing operand");
2640 if (fc >= MAX_INSN_FIXUPS)
2641 as_fatal (_("too many fixups"));
2643 fixups[fc].exp = ex;
2644 fixups[fc].opindex = *opindex_ptr;
2645 fixups[fc].reloc = operand->default_reloc;
2648 ex.X_add_number = 0;
2652 extra_data_after_insn = TRUE;
2654 extra_data = ex.X_add_number;
2656 else if (operand->flags & V850E_IMMEDIATE23)
2666 errmsg = _("illegal operand");
2670 errmsg = _("missing operand");
2677 if (fc >= MAX_INSN_FIXUPS)
2678 as_fatal (_("too many fixups"));
2680 fixups[fc].exp = ex;
2681 fixups[fc].opindex = *opindex_ptr;
2682 fixups[fc].reloc = operand->default_reloc;
2685 extra_data_after_insn = TRUE;
2689 else if (operand->flags & V850E_IMMEDIATE32)
2696 if ((operand->default_reloc == BFD_RELOC_V850_32_ABS
2697 || operand->default_reloc == BFD_RELOC_V850_32_PCREL)
2698 && (ex.X_add_number & 1))
2700 errmsg = _("odd number cannot be used here");
2706 errmsg = _("illegal operand");
2710 errmsg = _("missing operand");
2714 if (fc >= MAX_INSN_FIXUPS)
2715 as_fatal (_("too many fixups"));
2717 fixups[fc].exp = ex;
2718 fixups[fc].opindex = *opindex_ptr;
2719 fixups[fc].reloc = operand->default_reloc;
2722 ex.X_add_number = 0;
2726 extra_data_after_insn = TRUE;
2728 extra_data = ex.X_add_number;
2730 else if (operand->flags & V850E_OPERAND_REG_LIST)
2732 errmsg = parse_register_list (&insn, operand);
2741 if ((operand->flags & V850_OPERAND_REG) != 0)
2743 if (!register_name (&ex))
2745 errmsg = _("invalid register name");
2748 if ((operand->flags & V850_NOT_R0)
2749 && ex.X_add_number == 0)
2751 errmsg = _("register r0 cannot be used here");
2754 if (operand->flags & V850_REG_EVEN)
2756 if (ex.X_add_number % 2)
2757 errmsg = _("odd register cannot be used here");
2758 ex.X_add_number = ex.X_add_number / 2;
2762 else if ((operand->flags & V850_OPERAND_SRG) != 0)
2764 if (!system_register_name (&ex, TRUE))
2766 errmsg = _("invalid system register name");
2769 else if ((operand->flags & V850_OPERAND_EP) != 0)
2771 char *start = input_line_pointer;
2772 char c = get_symbol_end ();
2774 if (strcmp (start, "ep") != 0 && strcmp (start, "r30") != 0)
2776 /* Put things back the way we found them. */
2777 *input_line_pointer = c;
2778 input_line_pointer = start;
2779 errmsg = _("expected EP register");
2783 *input_line_pointer = c;
2784 str = input_line_pointer;
2785 input_line_pointer = hold;
2787 while (*str == ' ' || *str == ','
2788 || *str == '[' || *str == ']')
2792 else if ((operand->flags & V850_OPERAND_CC) != 0)
2794 if (!cc_name (&ex, TRUE))
2796 errmsg = _("invalid condition code name");
2799 if ((operand->flags & V850_NOT_SA)
2800 && ex.X_add_number == COND_SA_NUM)
2802 errmsg = _("condition sa cannot be used here");
2805 else if ((operand->flags & V850_OPERAND_FLOAT_CC) != 0)
2807 if (!float_cc_name (&ex, TRUE))
2809 errmsg = _("invalid condition code name");
2812 else if ((operand->flags & V850_OPERAND_CACHEOP) != 0)
2814 if (!cacheop_name (&ex, TRUE))
2815 errmsg = _("invalid cache oparation name");
2817 else if ((operand->flags & V850_OPERAND_PREFOP) != 0)
2819 if (!prefop_name (&ex, TRUE))
2820 errmsg = _("invalid pref oparation name");
2822 else if ((operand->flags & V850_OPERAND_VREG) != 0)
2824 if (!vector_register_name (&ex))
2825 errmsg = _("invalid vector register name");
2827 else if ((register_name (&ex)
2828 && (operand->flags & V850_OPERAND_REG) == 0))
2833 /* It is possible that an alias has been defined that
2834 matches a register name. For example the code may
2835 include a ".set ZERO, 0" directive, which matches
2836 the register name "zero". Attempt to reparse the
2837 field as an expression, and only complain if we
2838 cannot generate a constant. */
2840 input_line_pointer = str;
2842 c = get_symbol_end ();
2844 if (symbol_find (str) != NULL)
2847 *input_line_pointer = c;
2848 input_line_pointer = str;
2852 if (ex.X_op != O_constant)
2854 /* If this register is actually occurring too early on
2855 the parsing of the instruction, (because another
2856 field is missing) then report this. */
2857 if (opindex_ptr[1] != 0
2858 && ((v850_operands[opindex_ptr[1]].flags
2860 ||(v850_operands[opindex_ptr[1]].flags
2861 & V850_OPERAND_VREG)))
2862 errmsg = _("syntax error: value is missing before the register name");
2864 errmsg = _("syntax error: register not expected");
2866 /* If we created a symbol in the process of this
2867 test then delete it now, so that it will not
2868 be output with the real symbols... */
2870 && ex.X_op == O_symbol)
2871 symbol_remove (ex.X_add_symbol,
2872 &symbol_rootP, &symbol_lastP);
2875 else if (system_register_name (&ex, FALSE)
2876 && (operand->flags & V850_OPERAND_SRG) == 0)
2878 errmsg = _("syntax error: system register not expected");
2880 else if (cc_name (&ex, FALSE)
2881 && (operand->flags & V850_OPERAND_CC) == 0)
2883 errmsg = _("syntax error: condition code not expected");
2885 else if (float_cc_name (&ex, FALSE)
2886 && (operand->flags & V850_OPERAND_FLOAT_CC) == 0)
2888 errmsg = _("syntax error: condition code not expected");
2890 else if (vector_register_name (&ex)
2891 && (operand->flags & V850_OPERAND_VREG) == 0)
2893 errmsg = _("syntax error: vector register not expected");
2899 if ((operand->flags & V850_NOT_IMM0)
2900 && ex.X_op == O_constant
2901 && ex.X_add_number == 0)
2903 errmsg = _("immediate 0 cannot be used here");
2907 If we are assembling a MOV/JARL/JR instruction and the immediate
2908 value does not fit into the bits available then create a
2909 fake error so that the next MOV/JARL/JR instruction will be
2910 selected. This one has a 32 bit immediate field. */
2912 if ((strcmp (opcode->name, "mov") == 0
2913 || strcmp (opcode->name, "jarl") == 0
2914 || strcmp (opcode->name, "jr") == 0)
2915 && ex.X_op == O_constant
2916 && (ex.X_add_number < (-(1 << (operand->bits - 1)))
2917 || ex.X_add_number > ((1 << (operand->bits - 1)) - 1)))
2919 errmsg = _("immediate operand is too large");
2922 if ((strcmp (opcode->name, "jarl") == 0
2923 || strcmp (opcode->name, "jr") == 0)
2924 && ex.X_op != O_constant
2925 && operand->bits != default_disp_size)
2927 errmsg = _("immediate operand is not match");
2931 If we are assembling a ld/st instruction and the immediate
2932 value does not fit into the bits available then create a
2933 fake error so that the next ld/st instruction will be
2935 if ( ( (strncmp (opcode->name, "st.", 3) == 0)
2936 || (strncmp (opcode->name, "ld.", 3) == 0))
2937 && ex.X_op == O_constant
2938 && (ex.X_add_number < (-(1 << (operand->bits - 1)))
2939 || ex.X_add_number > ((1 << (operand->bits - 1)) - 1)))
2940 errmsg = _("displacement is too large");
2949 errmsg = _("illegal operand");
2952 errmsg = _("missing operand");
2956 & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_VREG)) == 0)
2958 errmsg = _("invalid operand");
2962 insn = v850_insert_operand (insn, operand,
2969 insn = v850_insert_operand (insn, operand, ex.X_add_number,
2974 /* We need to generate a fixup for this expression. */
2975 if (fc >= MAX_INSN_FIXUPS)
2976 as_fatal (_("too many fixups"));
2978 fixups[fc].exp = ex;
2979 fixups[fc].opindex = *opindex_ptr;
2980 fixups[fc].reloc = BFD_RELOC_UNUSED;
2986 str = input_line_pointer;
2987 input_line_pointer = hold;
2989 while (*str == ' ' || *str == ',' || *str == '[' || *str == ']'
2994 while (ISSPACE (*str))
3003 if ((opindex_ptr - opcode->operands) >= most_match_count)
3005 most_match_count = opindex_ptr - opcode->operands;
3007 strncpy (most_match_errmsg, errmsg, sizeof (most_match_errmsg)-1);
3010 next_opcode = opcode + 1;
3011 if (next_opcode->name != NULL
3012 && strcmp (next_opcode->name, opcode->name) == 0)
3014 opcode = next_opcode;
3016 /* Skip versions that are not supported by the target
3018 if ((opcode->processors & processor_mask) == 0)
3024 if (most_match_errmsg[0] == 0)
3025 /* xgettext:c-format. */
3026 as_bad (_("junk at end of line: `%s'"), str);
3028 as_bad ("%s: %s", copy_of_instruction, most_match_errmsg);
3030 if (*input_line_pointer == ']')
3031 ++input_line_pointer;
3033 ignore_rest_of_line ();
3034 input_line_pointer = saved_input_line_pointer;
3038 if (warningmsg != NULL)
3039 as_warn ("%s", warningmsg);
3043 input_line_pointer = str;
3045 /* Tie dwarf2 debug info to the address at the start of the insn.
3046 We can't do this after the insn has been output as the current
3047 frag may have been closed off. eg. by frag_var. */
3048 dwarf2_emit_insn (0);
3050 /* Write out the instruction. */
3052 if (relaxable && fc > 0)
3057 if (strcmp (opcode->name, "loop") == 0)
3059 if (((processor_mask & PROCESSOR_V850E3V5_UP) == 0) || default_disp_size == 22)
3062 f = frag_var (rs_machine_dependent, 6, 2, SUBYPTE_LOOP_16_22,
3063 fixups[0].exp.X_add_symbol,
3064 fixups[0].exp.X_add_number,
3065 (char *)(size_t) fixups[0].opindex);
3066 md_number_to_chars (f, insn, insn_size);
3067 md_number_to_chars (f+4, 0, 4);
3071 as_bad (_("loop: 32-bit displacement not supported"));
3074 else if (strcmp (opcode->name, "br") == 0
3075 || strcmp (opcode->name, "jbr") == 0)
3077 if ((processor_mask & PROCESSOR_V850E2_UP) == 0 || default_disp_size == 22)
3079 f = frag_var (rs_machine_dependent, 4, 2, SUBYPTE_UNCOND_9_22,
3080 fixups[0].exp.X_add_symbol,
3081 fixups[0].exp.X_add_number,
3082 (char *)(size_t) fixups[0].opindex);
3083 md_number_to_chars (f, insn, insn_size);
3084 md_number_to_chars (f + 2, 0, 2);
3088 f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_UNCOND_9_22_32,
3089 fixups[0].exp.X_add_symbol,
3090 fixups[0].exp.X_add_number,
3091 (char *)(size_t) fixups[0].opindex);
3092 md_number_to_chars (f, insn, insn_size);
3093 md_number_to_chars (f + 2, 0, 4);
3096 else /* b<cond>, j<cond>. */
3098 if (default_disp_size == 22
3099 || (processor_mask & PROCESSOR_V850E2_UP) == 0)
3101 if (processor_mask & PROCESSOR_V850E2V3_UP && !no_bcond17)
3103 if (strcmp (opcode->name, "bsa") == 0)
3105 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_SA_9_17_22,
3106 fixups[0].exp.X_add_symbol,
3107 fixups[0].exp.X_add_number,
3108 (char *)(size_t) fixups[0].opindex);
3109 md_number_to_chars (f, insn, insn_size);
3110 md_number_to_chars (f + 2, 0, 6);
3114 f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_COND_9_17_22,
3115 fixups[0].exp.X_add_symbol,
3116 fixups[0].exp.X_add_number,
3117 (char *)(size_t) fixups[0].opindex);
3118 md_number_to_chars (f, insn, insn_size);
3119 md_number_to_chars (f + 2, 0, 4);
3124 if (strcmp (opcode->name, "bsa") == 0)
3126 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_SA_9_22,
3127 fixups[0].exp.X_add_symbol,
3128 fixups[0].exp.X_add_number,
3129 (char *)(size_t) fixups[0].opindex);
3130 md_number_to_chars (f, insn, insn_size);
3131 md_number_to_chars (f + 2, 0, 6);
3135 f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_COND_9_22,
3136 fixups[0].exp.X_add_symbol,
3137 fixups[0].exp.X_add_number,
3138 (char *)(size_t) fixups[0].opindex);
3139 md_number_to_chars (f, insn, insn_size);
3140 md_number_to_chars (f + 2, 0, 4);
3146 if (processor_mask & PROCESSOR_V850E2V3_UP && !no_bcond17)
3148 if (strcmp (opcode->name, "bsa") == 0)
3150 f = frag_var (rs_machine_dependent, 10, 8, SUBYPTE_SA_9_17_22_32,
3151 fixups[0].exp.X_add_symbol,
3152 fixups[0].exp.X_add_number,
3153 (char *)(size_t) fixups[0].opindex);
3154 md_number_to_chars (f, insn, insn_size);
3155 md_number_to_chars (f + 2, 0, 8);
3159 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_COND_9_17_22_32,
3160 fixups[0].exp.X_add_symbol,
3161 fixups[0].exp.X_add_number,
3162 (char *)(size_t) fixups[0].opindex);
3163 md_number_to_chars (f, insn, insn_size);
3164 md_number_to_chars (f + 2, 0, 6);
3169 if (strcmp (opcode->name, "bsa") == 0)
3171 f = frag_var (rs_machine_dependent, 10, 8, SUBYPTE_SA_9_22_32,
3172 fixups[0].exp.X_add_symbol,
3173 fixups[0].exp.X_add_number,
3174 (char *)(size_t) fixups[0].opindex);
3175 md_number_to_chars (f, insn, insn_size);
3176 md_number_to_chars (f + 2, 0, 8);
3180 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_COND_9_22_32,
3181 fixups[0].exp.X_add_symbol,
3182 fixups[0].exp.X_add_number,
3183 (char *)(size_t) fixups[0].opindex);
3184 md_number_to_chars (f, insn, insn_size);
3185 md_number_to_chars (f + 2, 0, 6);
3193 /* Four byte insns have an opcode with the two high bits on. */
3194 if ((insn & 0x0600) == 0x0600)
3199 /* Special case: 32 bit MOV. */
3200 if ((insn & 0xffe0) == 0x0620)
3203 /* Special case: 32 bit JARL,JMP,JR. */
3204 if ((insn & 0x1ffe0) == 0x2e0 /* JARL. */
3205 || (insn & 0x1ffe0) == 0x6e0 /* JMP. */
3206 || (insn & 0x1ffff) == 0x2e0) /* JR. */
3209 if (obstack_room (& frchain_now->frch_obstack) < (insn_size + extra_data_len))
3211 frag_wane (frag_now);
3215 f = frag_more (insn_size);
3216 md_number_to_chars (f, insn, insn_size);
3218 if (extra_data_after_insn)
3220 f = frag_more (extra_data_len);
3221 md_number_to_chars (f, extra_data, extra_data_len);
3223 extra_data_after_insn = FALSE;
3227 /* Create any fixups. At this point we do not use a
3228 bfd_reloc_code_real_type, but instead just use the
3229 BFD_RELOC_UNUSED plus the operand index. This lets us easily
3230 handle fixups for any operand type, although that is admittedly
3231 not a very exciting feature. We pick a BFD reloc type in
3233 for (i = 0; i < fc; i++)
3235 const struct v850_operand *operand;
3236 bfd_reloc_code_real_type reloc;
3238 operand = &v850_operands[fixups[i].opindex];
3240 reloc = fixups[i].reloc;
3242 if (reloc != BFD_RELOC_UNUSED)
3244 reloc_howto_type *reloc_howto =
3245 bfd_reloc_type_lookup (stdoutput, reloc);
3253 size = bfd_get_reloc_size (reloc_howto);
3255 /* XXX This will abort on an R_V850_8 reloc -
3256 is this reloc actually used? */
3257 if (size != 2 && size != 4)
3260 if (extra_data_len == 0)
3262 address = (f - frag_now->fr_literal) + insn_size - size;
3266 address = (f - frag_now->fr_literal) + extra_data_len - size;
3269 if ((operand->flags & V850E_IMMEDIATE32) && (operand->flags & V850_PCREL))
3271 fixups[i].exp.X_add_number += 2;
3273 else if (operand->default_reloc == BFD_RELOC_V850_16_PCREL)
3275 fixups[i].exp.X_add_number += 2;
3279 /* fprintf (stderr, "0x%x %d %ld\n", address, size, fixups[i].exp.X_add_number); */
3280 fixP = fix_new_exp (frag_now, address, size,
3282 reloc_howto->pc_relative,
3285 fixP->tc_fix_data = (void *) operand;
3289 case BFD_RELOC_LO16:
3290 case BFD_RELOC_V850_LO16_S1:
3291 case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
3292 case BFD_RELOC_HI16:
3293 case BFD_RELOC_HI16_S:
3294 fixP->fx_no_overflow = 1;
3302 gas_assert (f != NULL);
3303 fix_new_exp (frag_now,
3304 f - frag_now->fr_literal, 4,
3306 (operand->flags & V850_PCREL) != 0,
3307 (bfd_reloc_code_real_type) (fixups[i].opindex
3308 + (int) BFD_RELOC_UNUSED));
3312 input_line_pointer = saved_input_line_pointer;
3315 /* If while processing a fixup, a reloc really needs to be created
3316 then it is done here. */
3319 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
3323 reloc = xmalloc (sizeof (arelent));
3324 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
3325 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3326 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3328 if ( fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
3329 || fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3330 || fixp->fx_r_type == BFD_RELOC_V850_LONGCALL
3331 || fixp->fx_r_type == BFD_RELOC_V850_LONGJUMP
3332 || fixp->fx_r_type == BFD_RELOC_V850_ALIGN)
3333 reloc->addend = fixp->fx_offset;
3337 if (fixp->fx_r_type == BFD_RELOC_32
3339 fixp->fx_r_type = BFD_RELOC_32_PCREL;
3342 reloc->addend = fixp->fx_addnumber;
3345 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
3347 if (reloc->howto == NULL)
3349 as_bad_where (fixp->fx_file, fixp->fx_line,
3350 /* xgettext:c-format */
3351 _("reloc %d not supported by object file format"),
3352 (int) fixp->fx_r_type);
3363 v850_handle_align (fragS * frag)
3366 && frag->fr_type == rs_align
3367 && frag->fr_address + frag->fr_fix > 0
3368 && frag->fr_offset > 1
3369 && now_seg != bss_section
3370 && now_seg != v850_seg_table[SBSS_SECTION].s
3371 && now_seg != v850_seg_table[TBSS_SECTION].s
3372 && now_seg != v850_seg_table[ZBSS_SECTION].s)
3373 fix_new (frag, frag->fr_fix, 2, & abs_symbol, frag->fr_offset, 0,
3374 BFD_RELOC_V850_ALIGN);
3377 /* Return current size of variable part of frag. */
3380 md_estimate_size_before_relax (fragS *fragp, asection *seg ATTRIBUTE_UNUSED)
3382 if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
3385 return md_relax_table[fragp->fr_subtype].rlx_length;
3389 v850_pcrel_from_section (fixS *fixp, segT section)
3391 /* If the symbol is undefined, or in a section other than our own,
3392 or it is weak (in which case it may well be in another section,
3393 then let the linker figure it out. */
3394 if (fixp->fx_addsy != (symbolS *) NULL
3395 && (! S_IS_DEFINED (fixp->fx_addsy)
3396 || S_IS_WEAK (fixp->fx_addsy)
3397 || (S_GET_SEGMENT (fixp->fx_addsy) != section)))
3400 return fixp->fx_frag->fr_address + fixp->fx_where;
3404 md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
3406 valueT value = * valueP;
3409 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3410 || fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
3411 || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP
3412 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3418 if (fixP->fx_addsy == (symbolS *) NULL)
3419 fixP->fx_addnumber = value,
3422 else if (fixP->fx_pcrel)
3423 fixP->fx_addnumber = fixP->fx_offset;
3427 value = fixP->fx_offset;
3428 if (fixP->fx_subsy != (symbolS *) NULL)
3430 if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)
3431 value -= S_GET_VALUE (fixP->fx_subsy);
3433 /* We don't actually support subtracting a symbol. */
3434 as_bad_where (fixP->fx_file, fixP->fx_line,
3435 _("expression too complex"));
3437 fixP->fx_addnumber = value;
3440 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
3443 const struct v850_operand *operand;
3445 const char *errmsg = NULL;
3447 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
3448 operand = &v850_operands[opindex];
3450 /* Fetch the instruction, insert the fully resolved operand
3451 value, and stuff the instruction back again.
3453 Note the instruction has been stored in little endian
3455 where = fixP->fx_frag->fr_literal + fixP->fx_where;
3457 if (fixP->fx_size > 2)
3458 insn = bfd_getl32 ((unsigned char *) where);
3460 insn = bfd_getl16 ((unsigned char *) where);
3462 /* When inserting loop offets a backwards displacement
3463 is encoded as a positive value. */
3464 if (operand->flags & V850_INVERSE_PCREL)
3467 insn = v850_insert_operand (insn, operand, (offsetT) value,
3470 as_warn_where (fixP->fx_file, fixP->fx_line, "%s", errmsg);
3472 if (fixP->fx_size > 2)
3473 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
3475 bfd_putl16 ((bfd_vma) insn, (unsigned char *) where);
3478 /* Nothing else to do here. */
3481 /* Determine a BFD reloc value based on the operand information.
3482 We are only prepared to turn a few of the operands into relocs. */
3484 if (operand->default_reloc == BFD_RELOC_NONE)
3486 as_bad_where (fixP->fx_file, fixP->fx_line,
3487 _("unresolved expression that must be resolved"));
3493 fixP->fx_r_type = operand->default_reloc;
3494 if (operand->default_reloc == BFD_RELOC_V850_16_PCREL)
3496 fixP->fx_where += 2;
3498 fixP->fx_addnumber += 2;
3502 else if (fixP->fx_done)
3504 /* We still have to insert the value into memory! */
3505 where = fixP->fx_frag->fr_literal + fixP->fx_where;
3507 if (fixP->tc_fix_data != NULL
3508 && ((struct v850_operand *) fixP->tc_fix_data)->insert != NULL)
3510 const char * message = NULL;
3511 struct v850_operand * operand = (struct v850_operand *) fixP->tc_fix_data;
3514 /* The variable "where" currently points at the exact point inside
3515 the insn where we need to insert the value. But we need to
3516 extract the entire insn so we probably need to move "where"
3517 back a few bytes. */
3519 if (fixP->fx_size == 2)
3521 else if (fixP->fx_size == 1)
3524 insn = bfd_getl32 ((unsigned char *) where);
3526 /* Use the operand's insertion procedure, if present, in order to
3527 make sure that the value is correctly stored in the insn. */
3528 insn = operand->insert (insn, (offsetT) value, & message);
3529 /* Ignore message even if it is set. */
3531 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
3535 switch (fixP->fx_r_type)
3537 case BFD_RELOC_V850_32_ABS:
3538 case BFD_RELOC_V850_32_PCREL:
3539 bfd_putl32 (value & 0xfffffffe, (unsigned char *) where);
3543 bfd_putl32 (value, (unsigned char *) where);
3546 case BFD_RELOC_V850_23:
3547 bfd_putl32 (((value & 0x7f) << 4) | ((value & 0x7fff80) << (16-7))
3548 | (bfd_getl32 (where) & ~((0x7f << 4) | (0xffff << 16))),
3549 (unsigned char *) where);
3553 case BFD_RELOC_HI16:
3554 case BFD_RELOC_HI16_S:
3555 case BFD_RELOC_LO16:
3556 case BFD_RELOC_V850_ZDA_16_16_OFFSET:
3557 case BFD_RELOC_V850_SDA_16_16_OFFSET:
3558 case BFD_RELOC_V850_TDA_16_16_OFFSET:
3559 case BFD_RELOC_V850_CALLT_16_16_OFFSET:
3560 bfd_putl16 (value & 0xffff, (unsigned char *) where);
3564 *where = value & 0xff;
3567 case BFD_RELOC_V850_9_PCREL:
3568 bfd_putl16 (((value & 0x1f0) << 7) | ((value & 0x0e) << 3)
3569 | (bfd_getl16 (where) & ~((0x1f0 << 7) | (0x0e << 3))), where);
3572 case BFD_RELOC_V850_17_PCREL:
3573 bfd_putl32 (((value & 0x10000) >> (16 - 4)) | ((value & 0xfffe) << 16)
3574 | (bfd_getl32 (where) & ~((0x10000 >> (16 - 4)) | (0xfffe << 16))), where);
3577 case BFD_RELOC_V850_16_PCREL:
3578 bfd_putl16 ((-value & 0xfffe) | (bfd_getl16 (where + 2) & 0x0001),
3579 (unsigned char *) (where + 2));
3582 case BFD_RELOC_V850_22_PCREL:
3583 bfd_putl32 (((value & 0xfffe) << 16) | ((value & 0x3f0000) >> 16)
3584 | (bfd_getl32 (where) & ~((0xfffe << 16) | (0x3f0000 >> 16))), where);
3587 case BFD_RELOC_V850_16_S1:
3588 case BFD_RELOC_V850_LO16_S1:
3589 case BFD_RELOC_V850_ZDA_15_16_OFFSET:
3590 case BFD_RELOC_V850_SDA_15_16_OFFSET:
3591 bfd_putl16 (value & 0xfffe, (unsigned char *) where);
3594 case BFD_RELOC_V850_16_SPLIT_OFFSET:
3595 case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
3596 case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET:
3597 case BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET:
3598 bfd_putl32 (((value << 16) & 0xfffe0000)
3599 | ((value << 5) & 0x20)
3600 | (bfd_getl32 (where) & ~0xfffe0020), where);
3603 case BFD_RELOC_V850_TDA_6_8_OFFSET:
3604 *where = (*where & ~0x7e) | ((value >> 1) & 0x7e);
3607 case BFD_RELOC_V850_TDA_7_8_OFFSET:
3608 *where = (*where & ~0x7f) | ((value >> 1) & 0x7f);
3611 case BFD_RELOC_V850_TDA_7_7_OFFSET:
3612 *where = (*where & ~0x7f) | (value & 0x7f);
3615 case BFD_RELOC_V850_TDA_4_5_OFFSET:
3616 *where = (*where & ~0xf) | ((value >> 1) & 0xf);
3619 case BFD_RELOC_V850_TDA_4_4_OFFSET:
3620 *where = (*where & ~0xf) | (value & 0xf);
3623 case BFD_RELOC_V850_CALLT_6_7_OFFSET:
3624 *where = (*where & ~0x3f) | (value & 0x3f);
3634 /* Parse a cons expression. We have to handle hi(), lo(), etc
3638 parse_cons_expression_v850 (expressionS *exp)
3641 /* See if there's a reloc prefix like hi() we have to handle. */
3642 hold_cons_reloc = v850_reloc_prefix (NULL, &errmsg);
3644 /* Do normal expression parsing. */
3648 /* Create a fixup for a cons expression. If parse_cons_expression_v850
3649 found a reloc prefix, then we use that reloc, else we choose an
3650 appropriate one based on the size of the expression. */
3653 cons_fix_new_v850 (fragS *frag,
3658 if (hold_cons_reloc == BFD_RELOC_UNUSED)
3661 hold_cons_reloc = BFD_RELOC_32;
3663 hold_cons_reloc = BFD_RELOC_16;
3665 hold_cons_reloc = BFD_RELOC_8;
3669 fix_new_exp (frag, where, size, exp, 0, hold_cons_reloc);
3671 fix_new (frag, where, size, NULL, 0, 0, hold_cons_reloc);
3673 hold_cons_reloc = BFD_RELOC_UNUSED;
3677 v850_fix_adjustable (fixS *fixP)
3679 if (fixP->fx_addsy == NULL)
3682 /* Don't adjust function names. */
3683 if (S_IS_FUNCTION (fixP->fx_addsy))
3686 /* We need the symbol name for the VTABLE entries. */
3687 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3688 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3695 v850_force_relocation (struct fix *fixP)
3697 if (fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
3698 || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP)
3703 || fixP->fx_r_type == BFD_RELOC_V850_ALIGN
3704 || fixP->fx_r_type == BFD_RELOC_V850_9_PCREL
3705 || fixP->fx_r_type == BFD_RELOC_V850_16_PCREL
3706 || fixP->fx_r_type == BFD_RELOC_V850_17_PCREL
3707 || fixP->fx_r_type == BFD_RELOC_V850_22_PCREL
3708 || fixP->fx_r_type == BFD_RELOC_V850_32_PCREL
3709 || fixP->fx_r_type >= BFD_RELOC_UNUSED))
3712 return generic_force_reloc (fixP);