Home | History | Annotate | Line # | Download | only in config
tc-v850.c revision 1.1.1.6
      1      1.1     skrll /* tc-v850.c -- Assembler code for the NEC V850
      2  1.1.1.6  christos    Copyright (C) 1996-2020 Free Software Foundation, Inc.
      3      1.1     skrll 
      4      1.1     skrll    This file is part of GAS, the GNU Assembler.
      5      1.1     skrll 
      6      1.1     skrll    GAS is free software; you can redistribute it and/or modify
      7      1.1     skrll    it under the terms of the GNU General Public License as published by
      8      1.1     skrll    the Free Software Foundation; either version 3, or (at your option)
      9      1.1     skrll    any later version.
     10      1.1     skrll 
     11      1.1     skrll    GAS is distributed in the hope that it will be useful,
     12      1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1     skrll    GNU General Public License for more details.
     15      1.1     skrll 
     16      1.1     skrll    You should have received a copy of the GNU General Public License
     17      1.1     skrll    along with GAS; see the file COPYING.  If not, write to
     18      1.1     skrll    the Free Software Foundation, 51 Franklin Street - Fifth Floor,
     19      1.1     skrll    Boston, MA 02110-1301, USA.  */
     20      1.1     skrll 
     21      1.1     skrll #include "as.h"
     22      1.1     skrll #include "safe-ctype.h"
     23      1.1     skrll #include "subsegs.h"
     24      1.1     skrll #include "opcode/v850.h"
     25      1.1     skrll #include "dwarf2dbg.h"
     26      1.1     skrll 
     27      1.1     skrll /* Sign-extend a 16-bit number.  */
     28      1.1     skrll #define SEXT16(x)	((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
     29      1.1     skrll 
     30      1.1     skrll /* Set to TRUE if we want to be pedantic about signed overflows.  */
     31      1.1     skrll static bfd_boolean warn_signed_overflows   = FALSE;
     32      1.1     skrll static bfd_boolean warn_unsigned_overflows = FALSE;
     33      1.1     skrll 
     34  1.1.1.3  christos /* Non-zero if floating point insns are not being used.  */
     35  1.1.1.3  christos static signed int soft_float = -1;
     36  1.1.1.3  christos 
     37      1.1     skrll /* Indicates the target BFD machine number.  */
     38      1.1     skrll static int machine = -1;
     39      1.1     skrll 
     40  1.1.1.3  christos 
     41  1.1.1.5  christos /* Indicates the target BFD architecture.  */
     42  1.1.1.4  christos enum bfd_architecture v850_target_arch = bfd_arch_v850_rh850;
     43  1.1.1.3  christos const char * v850_target_format = "elf32-v850-rh850";
     44  1.1.1.3  christos static flagword v850_e_flags = 0;
     45  1.1.1.3  christos 
     46      1.1     skrll /* Indicates the target processor(s) for the assemble.  */
     47  1.1.1.2  christos static int processor_mask = 0;
     48      1.1     skrll 
     49      1.1     skrll /* Structure to hold information about predefined registers.  */
     51      1.1     skrll struct reg_name
     52      1.1     skrll {
     53      1.1     skrll   const char *name;
     54  1.1.1.2  christos   int value;
     55      1.1     skrll   unsigned int processors;
     56      1.1     skrll };
     57      1.1     skrll 
     58      1.1     skrll /* Generic assembler global variables which must be defined by all
     59      1.1     skrll    targets.  */
     60      1.1     skrll 
     61      1.1     skrll /* Characters which always start a comment.  */
     62      1.1     skrll const char comment_chars[] = "#";
     63      1.1     skrll 
     64      1.1     skrll /* Characters which start a comment at the beginning of a line.  */
     65      1.1     skrll const char line_comment_chars[] = ";#";
     66      1.1     skrll 
     67      1.1     skrll /* Characters which may be used to separate multiple commands on a
     68      1.1     skrll    single line.  */
     69      1.1     skrll const char line_separator_chars[] = ";";
     70      1.1     skrll 
     71      1.1     skrll /* Characters which are used to indicate an exponent in a floating
     72      1.1     skrll    point number.  */
     73      1.1     skrll const char EXP_CHARS[] = "eE";
     74      1.1     skrll 
     75      1.1     skrll /* Characters which mean that a number is a floating point constant,
     76      1.1     skrll    as in 0d1.0.  */
     77      1.1     skrll const char FLT_CHARS[] = "dD";
     78      1.1     skrll 
     79      1.1     skrll const relax_typeS md_relax_table[] =
     81  1.1.1.2  christos {
     82  1.1.1.2  christos   /* Conditional branches.(V850/V850E, max 22bit)  */
     83  1.1.1.2  christos #define SUBYPTE_COND_9_22	0
     84  1.1.1.2  christos   {0xfe,	 -0x100,        2, SUBYPTE_COND_9_22 + 1},
     85  1.1.1.2  christos   {0x1ffffe + 2, -0x200000 + 2, 6, 0},
     86  1.1.1.2  christos   /* Conditional branches.(V850/V850E, max 22bit)  */
     87  1.1.1.2  christos #define SUBYPTE_SA_9_22	2
     88  1.1.1.2  christos   {0xfe,         -0x100,      2, SUBYPTE_SA_9_22 + 1},
     89  1.1.1.2  christos   {0x1ffffe + 4, -0x200000 + 4, 8, 0},
     90  1.1.1.2  christos   /* Unconditional branches.(V850/V850E, max 22bit)  */
     91  1.1.1.2  christos #define SUBYPTE_UNCOND_9_22	4
     92  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_UNCOND_9_22 + 1},
     93  1.1.1.2  christos   {0x1ffffe, -0x200000, 4, 0},
     94  1.1.1.2  christos   /* Conditional branches.(V850E2, max 32bit)  */
     95  1.1.1.2  christos #define SUBYPTE_COND_9_22_32	6
     96  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_COND_9_22_32 + 1},
     97  1.1.1.2  christos   {0x1fffff + 2, -0x200000 + 2, 6, SUBYPTE_COND_9_22_32 + 2},
     98  1.1.1.2  christos   {0x7ffffffe, -0x80000000, 8, 0},
     99  1.1.1.2  christos   /* Conditional branches.(V850E2, max 32bit)  */
    100  1.1.1.2  christos #define SUBYPTE_SA_9_22_32	9
    101  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_SA_9_22_32 + 1},
    102  1.1.1.2  christos   {0x1ffffe + 4, -0x200000 + 4, 8, SUBYPTE_SA_9_22_32 + 2},
    103  1.1.1.2  christos   {0x7ffffffe, -0x80000000, 10, 0},
    104  1.1.1.2  christos   /* Unconditional branches.(V850E2, max 32bit)  */
    105  1.1.1.2  christos #define SUBYPTE_UNCOND_9_22_32	12
    106  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_UNCOND_9_22_32 + 1},
    107  1.1.1.2  christos   {0x1ffffe, -0x200000, 4, SUBYPTE_UNCOND_9_22_32 + 2},
    108  1.1.1.2  christos   {0x7ffffffe, -0x80000000, 6, 0},
    109  1.1.1.2  christos   /* Conditional branches.(V850E2R max 22bit)  */
    110  1.1.1.2  christos #define SUBYPTE_COND_9_17_22	15
    111  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_COND_9_17_22 + 1},
    112  1.1.1.2  christos   {0xfffe, -0x10000,	4, SUBYPTE_COND_9_17_22 + 2},
    113  1.1.1.2  christos   {0x1ffffe + 2, -0x200000 + 2, 6, 0},
    114  1.1.1.2  christos   /* Conditional branches.(V850E2R max 22bit)  */
    115  1.1.1.2  christos #define SUBYPTE_SA_9_17_22	18
    116  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_SA_9_17_22 + 1},
    117  1.1.1.2  christos   {0xfffe, -0x10000,	4, SUBYPTE_SA_9_17_22 + 2},
    118  1.1.1.2  christos   {0x1ffffe + 4, -0x200000 + 4, 8, 0},
    119  1.1.1.2  christos   /* Conditional branches.(V850E2R max 32bit)  */
    120  1.1.1.2  christos #define SUBYPTE_COND_9_17_22_32	21
    121  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_COND_9_17_22_32 + 1},
    122  1.1.1.2  christos   {0xfffe, -0x10000,	4, SUBYPTE_COND_9_17_22_32 + 2},
    123  1.1.1.2  christos   {0x1ffffe + 2, -0x200000 + 2, 6, SUBYPTE_COND_9_17_22_32 + 3},
    124  1.1.1.2  christos   {0x7ffffffe, -0x80000000, 8, 0},
    125  1.1.1.2  christos   /* Conditional branches.(V850E2R max 32bit)  */
    126  1.1.1.2  christos #define SUBYPTE_SA_9_17_22_32	25
    127  1.1.1.2  christos   {0xfe,     -0x100,    2, SUBYPTE_SA_9_17_22_32 + 1},
    128  1.1.1.2  christos   {0xfffe, -0x10000,	4, SUBYPTE_SA_9_17_22_32 + 2},
    129  1.1.1.3  christos   {0x1ffffe + 4, -0x200000 + 4, 8, SUBYPTE_SA_9_17_22_32 + 3},
    130  1.1.1.3  christos   {0x7ffffffe, -0x80000000, 10, 0},
    131  1.1.1.3  christos   /* Loop.  (V850E2V4_UP, max 22-bit).  */
    132  1.1.1.3  christos #define SUBYPTE_LOOP_16_22	29
    133      1.1     skrll   {0x0, -0x0fffe, 4, SUBYPTE_LOOP_16_22 + 1},
    134      1.1     skrll   {0x1ffffe + 2, -0x200000 + 2, 6, 0},
    135  1.1.1.2  christos };
    136  1.1.1.2  christos 
    137  1.1.1.2  christos static int v850_relax = 0;
    138  1.1.1.2  christos 
    139  1.1.1.2  christos /* Default branch disp size 22 or 32.  */
    140  1.1.1.2  christos static int default_disp_size = 22;
    141  1.1.1.2  christos 
    142  1.1.1.2  christos /* Default no using bcond17.  */
    143  1.1.1.2  christos static int no_bcond17 = 0;
    144  1.1.1.2  christos 
    145      1.1     skrll /* Default no using ld/st 23bit offset.  */
    146      1.1     skrll static int no_stld23 = 0;
    147      1.1     skrll 
    148      1.1     skrll /* Fixups.  */
    149      1.1     skrll #define MAX_INSN_FIXUPS   5
    150      1.1     skrll 
    151      1.1     skrll struct v850_fixup
    152      1.1     skrll {
    153      1.1     skrll   expressionS exp;
    154      1.1     skrll   int opindex;
    155      1.1     skrll   bfd_reloc_code_real_type reloc;
    156      1.1     skrll };
    157      1.1     skrll 
    158      1.1     skrll struct v850_fixup fixups[MAX_INSN_FIXUPS];
    159      1.1     skrll static int fc;
    160      1.1     skrll 
    161      1.1     skrll struct v850_seg_entry
    162      1.1     skrll {
    163      1.1     skrll   segT s;
    164      1.1     skrll   const char *name;
    165      1.1     skrll   flagword flags;
    166      1.1     skrll };
    167      1.1     skrll 
    168      1.1     skrll struct v850_seg_entry v850_seg_table[] =
    169      1.1     skrll {
    170      1.1     skrll   { NULL, ".sdata",
    171      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
    172      1.1     skrll     | SEC_SMALL_DATA },
    173      1.1     skrll   { NULL, ".tdata",
    174      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS },
    175      1.1     skrll   { NULL, ".zdata",
    176      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS },
    177      1.1     skrll   { NULL, ".sbss",
    178      1.1     skrll     SEC_ALLOC | SEC_SMALL_DATA },
    179      1.1     skrll   { NULL, ".tbss",
    180      1.1     skrll     SEC_ALLOC },
    181      1.1     skrll   { NULL, ".zbss",
    182      1.1     skrll     SEC_ALLOC},
    183      1.1     skrll   { NULL, ".rosdata",
    184      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | SEC_DATA
    185      1.1     skrll     | SEC_HAS_CONTENTS | SEC_SMALL_DATA },
    186      1.1     skrll   { NULL, ".rozdata",
    187      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | SEC_DATA
    188      1.1     skrll     | SEC_HAS_CONTENTS },
    189      1.1     skrll   { NULL, ".scommon",
    190      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
    191      1.1     skrll     | SEC_SMALL_DATA | SEC_IS_COMMON },
    192      1.1     skrll   { NULL, ".tcommon",
    193      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
    194      1.1     skrll     | SEC_IS_COMMON },
    195      1.1     skrll   { NULL, ".zcommon",
    196      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
    197      1.1     skrll     | SEC_IS_COMMON },
    198      1.1     skrll   { NULL, ".call_table_data",
    199      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS },
    200      1.1     skrll   { NULL, ".call_table_text",
    201      1.1     skrll     SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | SEC_CODE
    202      1.1     skrll     | SEC_HAS_CONTENTS},
    203      1.1     skrll   { NULL, ".bss",
    204      1.1     skrll     SEC_ALLOC }
    205      1.1     skrll };
    206      1.1     skrll 
    207      1.1     skrll #define SDATA_SECTION		0
    208      1.1     skrll #define TDATA_SECTION		1
    209      1.1     skrll #define ZDATA_SECTION		2
    210      1.1     skrll #define SBSS_SECTION		3
    211      1.1     skrll #define TBSS_SECTION		4
    212      1.1     skrll #define ZBSS_SECTION		5
    213      1.1     skrll #define ROSDATA_SECTION		6
    214      1.1     skrll #define ROZDATA_SECTION		7
    215      1.1     skrll #define SCOMMON_SECTION		8
    216      1.1     skrll #define TCOMMON_SECTION		9
    217      1.1     skrll #define ZCOMMON_SECTION		10
    218      1.1     skrll #define CALL_TABLE_DATA_SECTION	11
    219      1.1     skrll #define CALL_TABLE_TEXT_SECTION	12
    220      1.1     skrll #define BSS_SECTION		13
    221      1.1     skrll 
    222      1.1     skrll static void
    223      1.1     skrll do_v850_seg (int i, subsegT sub)
    224      1.1     skrll {
    225      1.1     skrll   struct v850_seg_entry *seg = v850_seg_table + i;
    226      1.1     skrll 
    227      1.1     skrll   obj_elf_section_change_hook ();
    228      1.1     skrll 
    229      1.1     skrll   if (seg->s != NULL)
    230      1.1     skrll     subseg_set (seg->s, sub);
    231      1.1     skrll   else
    232  1.1.1.6  christos     {
    233      1.1     skrll       seg->s = subseg_new (seg->name, sub);
    234      1.1     skrll       bfd_set_section_flags (seg->s, seg->flags);
    235      1.1     skrll       if ((seg->flags & SEC_LOAD) == 0)
    236      1.1     skrll 	seg_info (seg->s)->bss = 1;
    237      1.1     skrll     }
    238      1.1     skrll }
    239      1.1     skrll 
    240      1.1     skrll static void
    241      1.1     skrll v850_seg (int i)
    242      1.1     skrll {
    243      1.1     skrll   subsegT sub = get_absolute_expression ();
    244      1.1     skrll 
    245      1.1     skrll   do_v850_seg (i, sub);
    246      1.1     skrll   demand_empty_rest_of_line ();
    247      1.1     skrll }
    248      1.1     skrll 
    249      1.1     skrll static void
    250      1.1     skrll v850_offset (int ignore ATTRIBUTE_UNUSED)
    251      1.1     skrll {
    252      1.1     skrll   char *pfrag;
    253      1.1     skrll   int temp = get_absolute_expression ();
    254      1.1     skrll 
    255      1.1     skrll   pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, (symbolS *)0,
    256      1.1     skrll 		    (offsetT) temp, (char *) 0);
    257      1.1     skrll   *pfrag = 0;
    258      1.1     skrll 
    259      1.1     skrll   demand_empty_rest_of_line ();
    260      1.1     skrll }
    261      1.1     skrll 
    262      1.1     skrll /* Copied from obj_elf_common() in gas/config/obj-elf.c.  */
    263      1.1     skrll 
    264      1.1     skrll static void
    265      1.1     skrll v850_comm (int area)
    266      1.1     skrll {
    267      1.1     skrll   char *name;
    268      1.1     skrll   char c;
    269      1.1     skrll   char *p;
    270      1.1     skrll   int temp;
    271      1.1     skrll   unsigned int size;
    272      1.1     skrll   symbolS *symbolP;
    273  1.1.1.3  christos   int have_align;
    274      1.1     skrll 
    275      1.1     skrll   c = get_symbol_name (&name);
    276      1.1     skrll 
    277      1.1     skrll   /* Just after name is now '\0'.  */
    278      1.1     skrll   p = input_line_pointer;
    279      1.1     skrll   *p = c;
    280      1.1     skrll 
    281      1.1     skrll   SKIP_WHITESPACE ();
    282      1.1     skrll 
    283      1.1     skrll   if (*input_line_pointer != ',')
    284      1.1     skrll     {
    285      1.1     skrll       as_bad (_("Expected comma after symbol-name"));
    286      1.1     skrll       ignore_rest_of_line ();
    287      1.1     skrll       return;
    288      1.1     skrll     }
    289      1.1     skrll 
    290      1.1     skrll   /* Skip ','.  */
    291      1.1     skrll   input_line_pointer++;
    292      1.1     skrll 
    293      1.1     skrll   if ((temp = get_absolute_expression ()) < 0)
    294      1.1     skrll     {
    295      1.1     skrll       /* xgettext:c-format  */
    296      1.1     skrll       as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp);
    297      1.1     skrll       ignore_rest_of_line ();
    298      1.1     skrll       return;
    299      1.1     skrll     }
    300      1.1     skrll 
    301      1.1     skrll   size = temp;
    302      1.1     skrll   *p = 0;
    303      1.1     skrll   symbolP = symbol_find_or_make (name);
    304      1.1     skrll   *p = c;
    305      1.1     skrll 
    306      1.1     skrll   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
    307      1.1     skrll     {
    308      1.1     skrll       as_bad (_("Ignoring attempt to re-define symbol"));
    309      1.1     skrll       ignore_rest_of_line ();
    310      1.1     skrll       return;
    311      1.1     skrll     }
    312      1.1     skrll 
    313      1.1     skrll   if (S_GET_VALUE (symbolP) != 0)
    314      1.1     skrll     {
    315      1.1     skrll       if (S_GET_VALUE (symbolP) != size)
    316      1.1     skrll 	/* xgettext:c-format  */
    317      1.1     skrll 	as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
    318      1.1     skrll 		 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
    319      1.1     skrll     }
    320      1.1     skrll 
    321      1.1     skrll   know (symbol_get_frag (symbolP) == &zero_address_frag);
    322      1.1     skrll 
    323      1.1     skrll   if (*input_line_pointer != ',')
    324      1.1     skrll     have_align = 0;
    325      1.1     skrll   else
    326      1.1     skrll     {
    327      1.1     skrll       have_align = 1;
    328      1.1     skrll       input_line_pointer++;
    329      1.1     skrll       SKIP_WHITESPACE ();
    330      1.1     skrll     }
    331      1.1     skrll 
    332      1.1     skrll   if (! have_align || *input_line_pointer != '"')
    333      1.1     skrll     {
    334      1.1     skrll       if (! have_align)
    335      1.1     skrll 	temp = 0;
    336      1.1     skrll       else
    337      1.1     skrll 	{
    338      1.1     skrll 	  temp = get_absolute_expression ();
    339      1.1     skrll 
    340      1.1     skrll 	  if (temp < 0)
    341      1.1     skrll 	    {
    342      1.1     skrll 	      temp = 0;
    343      1.1     skrll 	      as_warn (_("Common alignment negative; 0 assumed"));
    344      1.1     skrll 	    }
    345      1.1     skrll 	}
    346      1.1     skrll 
    347      1.1     skrll       if (symbol_get_obj (symbolP)->local)
    348      1.1     skrll 	{
    349      1.1     skrll 	  segT old_sec;
    350      1.1     skrll 	  int old_subsec;
    351      1.1     skrll 	  char *pfrag;
    352      1.1     skrll 	  int align;
    353      1.1     skrll 	  flagword applicable;
    354      1.1     skrll 
    355      1.1     skrll 	  old_sec = now_seg;
    356      1.1     skrll 	  old_subsec = now_subseg;
    357      1.1     skrll 
    358      1.1     skrll 	  applicable = bfd_applicable_section_flags (stdoutput);
    359      1.1     skrll 
    360      1.1     skrll 	  applicable &= SEC_ALLOC;
    361      1.1     skrll 
    362      1.1     skrll 	  switch (area)
    363      1.1     skrll 	    {
    364      1.1     skrll 	    case SCOMMON_SECTION:
    365      1.1     skrll 	      do_v850_seg (SBSS_SECTION, 0);
    366      1.1     skrll 	      break;
    367      1.1     skrll 
    368      1.1     skrll 	    case ZCOMMON_SECTION:
    369      1.1     skrll 	      do_v850_seg (ZBSS_SECTION, 0);
    370      1.1     skrll 	      break;
    371      1.1     skrll 
    372      1.1     skrll 	    case TCOMMON_SECTION:
    373      1.1     skrll 	      do_v850_seg (TBSS_SECTION, 0);
    374      1.1     skrll 	      break;
    375      1.1     skrll 	    }
    376      1.1     skrll 
    377      1.1     skrll 	  if (temp)
    378      1.1     skrll 	    {
    379      1.1     skrll 	      /* Convert to a power of 2 alignment.  */
    380      1.1     skrll 	      for (align = 0; (temp & 1) == 0; temp >>= 1, ++align)
    381      1.1     skrll 		;
    382      1.1     skrll 
    383      1.1     skrll 	      if (temp != 1)
    384      1.1     skrll 		{
    385      1.1     skrll 		  as_bad (_("Common alignment not a power of 2"));
    386      1.1     skrll 		  ignore_rest_of_line ();
    387      1.1     skrll 		  return;
    388      1.1     skrll 		}
    389      1.1     skrll 	    }
    390      1.1     skrll 	  else
    391      1.1     skrll 	    align = 0;
    392      1.1     skrll 
    393      1.1     skrll 	  record_alignment (now_seg, align);
    394      1.1     skrll 
    395      1.1     skrll 	  if (align)
    396      1.1     skrll 	    frag_align (align, 0, 0);
    397      1.1     skrll 
    398      1.1     skrll 	  switch (area)
    399      1.1     skrll 	    {
    400      1.1     skrll 	    case SCOMMON_SECTION:
    401      1.1     skrll 	      if (S_GET_SEGMENT (symbolP) == v850_seg_table[SBSS_SECTION].s)
    402      1.1     skrll 		symbol_get_frag (symbolP)->fr_symbol = 0;
    403      1.1     skrll 	      break;
    404      1.1     skrll 
    405      1.1     skrll 	    case ZCOMMON_SECTION:
    406      1.1     skrll 	      if (S_GET_SEGMENT (symbolP) == v850_seg_table[ZBSS_SECTION].s)
    407      1.1     skrll 		symbol_get_frag (symbolP)->fr_symbol = 0;
    408      1.1     skrll 	      break;
    409      1.1     skrll 
    410      1.1     skrll 	    case TCOMMON_SECTION:
    411      1.1     skrll 	      if (S_GET_SEGMENT (symbolP) == v850_seg_table[TBSS_SECTION].s)
    412      1.1     skrll 		symbol_get_frag (symbolP)->fr_symbol = 0;
    413      1.1     skrll 	      break;
    414      1.1     skrll 
    415      1.1     skrll 	    default:
    416      1.1     skrll 	      abort ();
    417      1.1     skrll 	    }
    418      1.1     skrll 
    419      1.1     skrll 	  symbol_set_frag (symbolP, frag_now);
    420      1.1     skrll 	  pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
    421      1.1     skrll 			    (offsetT) size, (char *) 0);
    422      1.1     skrll 	  *pfrag = 0;
    423      1.1     skrll 	  S_SET_SIZE (symbolP, size);
    424      1.1     skrll 
    425      1.1     skrll 	  switch (area)
    426      1.1     skrll 	    {
    427      1.1     skrll 	    case SCOMMON_SECTION:
    428      1.1     skrll 	      S_SET_SEGMENT (symbolP, v850_seg_table[SBSS_SECTION].s);
    429      1.1     skrll 	      break;
    430      1.1     skrll 
    431      1.1     skrll 	    case ZCOMMON_SECTION:
    432      1.1     skrll 	      S_SET_SEGMENT (symbolP, v850_seg_table[ZBSS_SECTION].s);
    433      1.1     skrll 	      break;
    434      1.1     skrll 
    435      1.1     skrll 	    case TCOMMON_SECTION:
    436      1.1     skrll 	      S_SET_SEGMENT (symbolP, v850_seg_table[TBSS_SECTION].s);
    437      1.1     skrll 	      break;
    438      1.1     skrll 
    439      1.1     skrll 	    default:
    440      1.1     skrll 	      abort ();
    441      1.1     skrll 	    }
    442      1.1     skrll 
    443      1.1     skrll 	  S_CLEAR_EXTERNAL (symbolP);
    444      1.1     skrll 	  obj_elf_section_change_hook ();
    445      1.1     skrll 	  subseg_set (old_sec, old_subsec);
    446      1.1     skrll 	}
    447      1.1     skrll       else
    448      1.1     skrll 	{
    449      1.1     skrll 	  segT   old_sec;
    450      1.1     skrll 	  int    old_subsec;
    451      1.1     skrll 
    452      1.1     skrll 	allocate_common:
    453      1.1     skrll 	  old_sec = now_seg;
    454      1.1     skrll 	  old_subsec = now_subseg;
    455      1.1     skrll 
    456      1.1     skrll 	  S_SET_VALUE (symbolP, (valueT) size);
    457      1.1     skrll 	  S_SET_ALIGN (symbolP, temp);
    458      1.1     skrll 	  S_SET_EXTERNAL (symbolP);
    459      1.1     skrll 
    460      1.1     skrll 	  switch (area)
    461      1.1     skrll 	    {
    462      1.1     skrll 	    case SCOMMON_SECTION:
    463      1.1     skrll 	    case ZCOMMON_SECTION:
    464      1.1     skrll 	    case TCOMMON_SECTION:
    465      1.1     skrll 	      do_v850_seg (area, 0);
    466      1.1     skrll 	      S_SET_SEGMENT (symbolP, v850_seg_table[area].s);
    467      1.1     skrll 	      break;
    468      1.1     skrll 
    469      1.1     skrll 	    default:
    470      1.1     skrll 	      abort ();
    471      1.1     skrll 	    }
    472      1.1     skrll 
    473      1.1     skrll 	  obj_elf_section_change_hook ();
    474      1.1     skrll 	  subseg_set (old_sec, old_subsec);
    475      1.1     skrll 	}
    476      1.1     skrll     }
    477      1.1     skrll   else
    478      1.1     skrll     {
    479      1.1     skrll       input_line_pointer++;
    480      1.1     skrll 
    481      1.1     skrll       /* @@ Some use the dot, some don't.  Can we get some consistency??  */
    482      1.1     skrll       if (*input_line_pointer == '.')
    483      1.1     skrll 	input_line_pointer++;
    484      1.1     skrll 
    485      1.1     skrll       /* @@ Some say data, some say bss.  */
    486      1.1     skrll       if (strncmp (input_line_pointer, "bss\"", 4)
    487      1.1     skrll 	  && strncmp (input_line_pointer, "data\"", 5))
    488      1.1     skrll 	{
    489      1.1     skrll 	  while (*--input_line_pointer != '"')
    490      1.1     skrll 	    ;
    491      1.1     skrll 	  input_line_pointer--;
    492      1.1     skrll 	  goto bad_common_segment;
    493      1.1     skrll 	}
    494      1.1     skrll 
    495      1.1     skrll       while (*input_line_pointer++ != '"')
    496      1.1     skrll 	;
    497      1.1     skrll 
    498      1.1     skrll       goto allocate_common;
    499      1.1     skrll     }
    500      1.1     skrll 
    501      1.1     skrll   symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
    502      1.1     skrll 
    503      1.1     skrll   demand_empty_rest_of_line ();
    504      1.1     skrll   return;
    505      1.1     skrll 
    506      1.1     skrll   {
    507      1.1     skrll   bad_common_segment:
    508      1.1     skrll     p = input_line_pointer;
    509      1.1     skrll     while (*p && *p != '\n')
    510      1.1     skrll       p++;
    511      1.1     skrll     c = *p;
    512      1.1     skrll     *p = '\0';
    513      1.1     skrll     as_bad (_("bad .common segment %s"), input_line_pointer + 1);
    514      1.1     skrll     *p = c;
    515      1.1     skrll     input_line_pointer = p;
    516      1.1     skrll     ignore_rest_of_line ();
    517      1.1     skrll     return;
    518      1.1     skrll   }
    519      1.1     skrll }
    520      1.1     skrll 
    521      1.1     skrll static void
    522      1.1     skrll set_machine (int number)
    523  1.1.1.3  christos {
    524      1.1     skrll   machine = number;
    525      1.1     skrll   bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
    526      1.1     skrll 
    527  1.1.1.2  christos   switch (machine)
    528  1.1.1.2  christos     {
    529  1.1.1.2  christos     case 0:                SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);    break;
    530  1.1.1.2  christos     case bfd_mach_v850:    SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);    break;
    531  1.1.1.2  christos     case bfd_mach_v850e:   SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);   break;
    532  1.1.1.2  christos     case bfd_mach_v850e1:  SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);   break;
    533  1.1.1.3  christos     case bfd_mach_v850e2:  SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2);  break;
    534      1.1     skrll     case bfd_mach_v850e2v3:SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3); break;
    535      1.1     skrll     case bfd_mach_v850e3v5: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5); break;
    536      1.1     skrll     }
    537      1.1     skrll }
    538      1.1     skrll 
    539      1.1     skrll static void
    540      1.1     skrll v850_longcode (int type)
    541      1.1     skrll {
    542      1.1     skrll   expressionS ex;
    543      1.1     skrll 
    544      1.1     skrll   if (! v850_relax)
    545  1.1.1.2  christos     {
    546      1.1     skrll       if (type == 1)
    547  1.1.1.2  christos 	as_warn (_(".longcall pseudo-op seen when not relaxing"));
    548      1.1     skrll       else
    549      1.1     skrll 	as_warn (_(".longjump pseudo-op seen when not relaxing"));
    550      1.1     skrll     }
    551      1.1     skrll 
    552      1.1     skrll   expression (&ex);
    553      1.1     skrll 
    554  1.1.1.2  christos   if (ex.X_op != O_symbol || ex.X_add_number != 0)
    555      1.1     skrll     {
    556      1.1     skrll       as_bad (_("bad .longcall format"));
    557      1.1     skrll       ignore_rest_of_line ();
    558      1.1     skrll 
    559      1.1     skrll       return;
    560      1.1     skrll     }
    561      1.1     skrll 
    562      1.1     skrll   if (type == 1)
    563      1.1     skrll     fix_new_exp (frag_now, frag_now_fix (), 4, & ex, 1,
    564      1.1     skrll 		 BFD_RELOC_V850_LONGCALL);
    565      1.1     skrll   else
    566      1.1     skrll     fix_new_exp (frag_now, frag_now_fix (), 4, & ex, 1,
    567      1.1     skrll 		 BFD_RELOC_V850_LONGJUMP);
    568      1.1     skrll 
    569      1.1     skrll   demand_empty_rest_of_line ();
    570      1.1     skrll }
    571      1.1     skrll 
    572      1.1     skrll /* The target specific pseudo-ops which we support.  */
    573      1.1     skrll const pseudo_typeS md_pseudo_table[] =
    574      1.1     skrll {
    575      1.1     skrll   { "sdata",		v850_seg,		SDATA_SECTION		},
    576      1.1     skrll   { "tdata",		v850_seg,		TDATA_SECTION		},
    577      1.1     skrll   { "zdata",		v850_seg,		ZDATA_SECTION		},
    578      1.1     skrll   { "sbss",		v850_seg,		SBSS_SECTION		},
    579      1.1     skrll   { "tbss",		v850_seg,		TBSS_SECTION		},
    580      1.1     skrll   { "zbss",		v850_seg,		ZBSS_SECTION		},
    581      1.1     skrll   { "rosdata",		v850_seg,		ROSDATA_SECTION 	},
    582      1.1     skrll   { "rozdata",		v850_seg,		ROZDATA_SECTION 	},
    583      1.1     skrll   { "bss",		v850_seg,		BSS_SECTION		},
    584      1.1     skrll   { "offset",		v850_offset,		0			},
    585      1.1     skrll   { "word",		cons,			4			},
    586      1.1     skrll   { "zcomm",		v850_comm,		ZCOMMON_SECTION 	},
    587      1.1     skrll   { "scomm",		v850_comm,		SCOMMON_SECTION 	},
    588      1.1     skrll   { "tcomm",		v850_comm,		TCOMMON_SECTION 	},
    589      1.1     skrll   { "v850",		set_machine,		0			},
    590      1.1     skrll   { "call_table_data",	v850_seg,		CALL_TABLE_DATA_SECTION	},
    591  1.1.1.2  christos   { "call_table_text",	v850_seg,		CALL_TABLE_TEXT_SECTION	},
    592  1.1.1.2  christos   { "v850e",		set_machine,		bfd_mach_v850e		},
    593  1.1.1.2  christos   { "v850e1",		set_machine,		bfd_mach_v850e1         },
    594  1.1.1.3  christos   { "v850e2",		set_machine,		bfd_mach_v850e2 	},
    595  1.1.1.3  christos   { "v850e2v3",		set_machine,		bfd_mach_v850e2v3 	},
    596      1.1     skrll   { "v850e2v4",		set_machine,		bfd_mach_v850e3v5 	},
    597      1.1     skrll   { "v850e3v5",		set_machine,		bfd_mach_v850e3v5 	},
    598      1.1     skrll   { "longcall",		v850_longcode,		1			},
    599      1.1     skrll   { "longjump",		v850_longcode,		2			},
    600      1.1     skrll   { NULL,		NULL,			0			}
    601      1.1     skrll };
    602      1.1     skrll 
    603      1.1     skrll /* Opcode hash table.  */
    604      1.1     skrll static struct hash_control *v850_hash;
    605      1.1     skrll 
    606      1.1     skrll /* This table is sorted.  Suitable for searching by a binary search.  */
    607  1.1.1.2  christos static const struct reg_name pre_defined_registers[] =
    608  1.1.1.2  christos {
    609  1.1.1.2  christos   { "ep",  30, PROCESSOR_ALL },		/* ep - element ptr.  */
    610  1.1.1.2  christos   { "gp",   4, PROCESSOR_ALL },		/* gp - global ptr.  */
    611  1.1.1.2  christos   { "hp",   2, PROCESSOR_ALL },		/* hp - handler stack ptr.  */
    612  1.1.1.2  christos   { "lp",  31, PROCESSOR_ALL },		/* lp - link ptr.  */
    613  1.1.1.2  christos   { "r0",   0, PROCESSOR_ALL },
    614  1.1.1.2  christos   { "r1",   1, PROCESSOR_ALL },
    615  1.1.1.2  christos   { "r10", 10, PROCESSOR_ALL },
    616  1.1.1.2  christos   { "r11", 11, PROCESSOR_ALL },
    617  1.1.1.2  christos   { "r12", 12, PROCESSOR_ALL },
    618  1.1.1.2  christos   { "r13", 13, PROCESSOR_ALL },
    619  1.1.1.2  christos   { "r14", 14, PROCESSOR_ALL },
    620  1.1.1.2  christos   { "r15", 15, PROCESSOR_ALL },
    621  1.1.1.2  christos   { "r16", 16, PROCESSOR_ALL },
    622  1.1.1.2  christos   { "r17", 17, PROCESSOR_ALL },
    623  1.1.1.2  christos   { "r18", 18, PROCESSOR_ALL },
    624  1.1.1.2  christos   { "r19", 19, PROCESSOR_ALL },
    625  1.1.1.2  christos   { "r2",   2, PROCESSOR_ALL },
    626  1.1.1.2  christos   { "r20", 20, PROCESSOR_ALL },
    627  1.1.1.2  christos   { "r21", 21, PROCESSOR_ALL },
    628  1.1.1.2  christos   { "r22", 22, PROCESSOR_ALL },
    629  1.1.1.2  christos   { "r23", 23, PROCESSOR_ALL },
    630  1.1.1.2  christos   { "r24", 24, PROCESSOR_ALL },
    631  1.1.1.2  christos   { "r25", 25, PROCESSOR_ALL },
    632  1.1.1.2  christos   { "r26", 26, PROCESSOR_ALL },
    633  1.1.1.2  christos   { "r27", 27, PROCESSOR_ALL },
    634  1.1.1.2  christos   { "r28", 28, PROCESSOR_ALL },
    635  1.1.1.2  christos   { "r29", 29, PROCESSOR_ALL },
    636  1.1.1.2  christos   { "r3",   3, PROCESSOR_ALL },
    637  1.1.1.2  christos   { "r30", 30, PROCESSOR_ALL },
    638  1.1.1.2  christos   { "r31", 31, PROCESSOR_ALL },
    639  1.1.1.2  christos   { "r4",   4, PROCESSOR_ALL },
    640  1.1.1.2  christos   { "r5",   5, PROCESSOR_ALL },
    641  1.1.1.2  christos   { "r6",   6, PROCESSOR_ALL },
    642  1.1.1.2  christos   { "r7",   7, PROCESSOR_ALL },
    643  1.1.1.2  christos   { "r8",   8, PROCESSOR_ALL },
    644  1.1.1.2  christos   { "r9",   9, PROCESSOR_ALL },
    645  1.1.1.2  christos   { "sp",   3, PROCESSOR_ALL },		/* sp - stack ptr.  */
    646      1.1     skrll   { "tp",   5, PROCESSOR_ALL },		/* tp - text ptr.  */
    647      1.1     skrll   { "zero", 0, PROCESSOR_ALL },
    648      1.1     skrll };
    649      1.1     skrll 
    650      1.1     skrll #define REG_NAME_CNT						\
    651      1.1     skrll   (sizeof (pre_defined_registers) / sizeof (struct reg_name))
    652      1.1     skrll 
    653  1.1.1.2  christos static const struct reg_name system_registers[] =
    654  1.1.1.2  christos {
    655  1.1.1.2  christos   { "asid",        23, PROCESSOR_NOT_V850 },
    656  1.1.1.2  christos   { "bpam",        25, PROCESSOR_NOT_V850 },
    657  1.1.1.2  christos   { "bpav",        24, PROCESSOR_NOT_V850 },
    658  1.1.1.2  christos   { "bpc",         22, PROCESSOR_NOT_V850 },
    659  1.1.1.3  christos   { "bpdm",        27, PROCESSOR_NOT_V850 },
    660  1.1.1.3  christos   { "bpdv",        26, PROCESSOR_NOT_V850 },
    661  1.1.1.2  christos   { "bsel",        31, PROCESSOR_V850E2_UP },
    662  1.1.1.2  christos   { "cfg",          7, PROCESSOR_V850E2V3_UP },
    663  1.1.1.2  christos   { "ctbp",        20, PROCESSOR_NOT_V850 },
    664  1.1.1.3  christos   { "ctpc",        16, PROCESSOR_NOT_V850 },
    665  1.1.1.2  christos   { "ctpsw",       17, PROCESSOR_NOT_V850 },
    666  1.1.1.2  christos   { "dbic",        15, PROCESSOR_V850E2_UP },
    667  1.1.1.3  christos   { "dbpc",        18, PROCESSOR_NOT_V850 },
    668  1.1.1.2  christos   { "dbpsw",       19, PROCESSOR_NOT_V850 },
    669  1.1.1.3  christos   { "dbwr",        30, PROCESSOR_V850E2_UP },
    670  1.1.1.3  christos   { "dir",         21, PROCESSOR_NOT_V850 },
    671  1.1.1.3  christos   { "dpa0l",       16, PROCESSOR_V850E2V3_UP },
    672  1.1.1.3  christos   { "dpa0u",       17, PROCESSOR_V850E2V3_UP },
    673  1.1.1.3  christos   { "dpa1l",       18, PROCESSOR_V850E2V3_UP },
    674  1.1.1.3  christos   { "dpa1u",       19, PROCESSOR_V850E2V3_UP },
    675  1.1.1.3  christos   { "dpa2l",       20, PROCESSOR_V850E2V3_UP },
    676  1.1.1.3  christos   { "dpa2u",       21, PROCESSOR_V850E2V3_UP },
    677  1.1.1.3  christos   { "dpa3l",       22, PROCESSOR_V850E2V3_UP },
    678  1.1.1.3  christos   { "dpa3u",       23, PROCESSOR_V850E2V3_UP },
    679  1.1.1.3  christos   { "dpa4l",       24, PROCESSOR_V850E2V3_UP },
    680  1.1.1.3  christos   { "dpa4u",       25, PROCESSOR_V850E2V3_UP },
    681  1.1.1.2  christos   { "dpa5l",       26, PROCESSOR_V850E2V3_UP },
    682  1.1.1.3  christos   { "dpa5u",       27, PROCESSOR_V850E2V3_UP },
    683  1.1.1.3  christos   { "ecr",          4, PROCESSOR_ALL },
    684  1.1.1.3  christos   { "eh_base",      3, PROCESSOR_V850E2V3_UP },
    685  1.1.1.3  christos   { "eh_cfg",       1, PROCESSOR_V850E2V3_UP },
    686  1.1.1.2  christos   { "eh_reset",     2, PROCESSOR_V850E2V3_UP },
    687  1.1.1.2  christos   { "eiic",        13, PROCESSOR_V850E2_UP },
    688  1.1.1.3  christos   { "eipc",         0, PROCESSOR_ALL },
    689  1.1.1.3  christos   { "eipsw",        1, PROCESSOR_ALL },
    690  1.1.1.2  christos   { "eiwr",        28, PROCESSOR_V850E2_UP },
    691  1.1.1.2  christos   { "feic",        14, PROCESSOR_V850E2_UP },
    692  1.1.1.3  christos   { "fepc",         2, PROCESSOR_ALL },
    693  1.1.1.3  christos   { "fepsw",        3, PROCESSOR_ALL },
    694  1.1.1.3  christos   { "fewr",        29, PROCESSOR_V850E2_UP },
    695  1.1.1.3  christos   { "fpcc",         9, PROCESSOR_V850E2V3_UP },
    696  1.1.1.3  christos   { "fpcfg",       10, PROCESSOR_V850E2V3_UP },
    697  1.1.1.3  christos   { "fpec",        11, PROCESSOR_V850E2V3_UP },
    698  1.1.1.3  christos   { "fpepc",        7, PROCESSOR_V850E2V3_UP },
    699  1.1.1.3  christos   { "fpspc",       27, PROCESSOR_V850E2V3_UP },
    700  1.1.1.3  christos   { "fpsr",         6, PROCESSOR_V850E2V3_UP },
    701  1.1.1.3  christos   { "fpst",         8, PROCESSOR_V850E2V3_UP },
    702  1.1.1.3  christos   { "ipa0l",        6, PROCESSOR_V850E2V3_UP },
    703  1.1.1.3  christos   { "ipa0u",        7, PROCESSOR_V850E2V3_UP },
    704  1.1.1.3  christos   { "ipa1l",        8, PROCESSOR_V850E2V3_UP },
    705  1.1.1.3  christos   { "ipa1u",        9, PROCESSOR_V850E2V3_UP },
    706  1.1.1.3  christos   { "ipa2l",       10, PROCESSOR_V850E2V3_UP },
    707  1.1.1.3  christos   { "ipa2u",       11, PROCESSOR_V850E2V3_UP },
    708  1.1.1.3  christos   { "ipa3l",       12, PROCESSOR_V850E2V3_UP },
    709  1.1.1.3  christos   { "ipa3u",       13, PROCESSOR_V850E2V3_UP },
    710  1.1.1.3  christos   { "ipa4l",       14, PROCESSOR_V850E2V3_UP },
    711  1.1.1.3  christos   { "ipa4u",       15, PROCESSOR_V850E2V3_UP },
    712  1.1.1.3  christos   { "mca",         24, PROCESSOR_V850E2V3_UP },
    713  1.1.1.3  christos   { "mcc",         26, PROCESSOR_V850E2V3_UP },
    714  1.1.1.3  christos   { "mcr",         27, PROCESSOR_V850E2V3_UP },
    715  1.1.1.3  christos   { "mcs",         25, PROCESSOR_V850E2V3_UP },
    716  1.1.1.3  christos   { "mpc",          1, PROCESSOR_V850E2V3_UP },
    717  1.1.1.3  christos   { "mpm",          0, PROCESSOR_V850E2V3_UP },
    718  1.1.1.3  christos   { "mpu10_dpa0l", 16, PROCESSOR_V850E2V3_UP },
    719  1.1.1.3  christos   { "mpu10_dpa0u", 17, PROCESSOR_V850E2V3_UP },
    720  1.1.1.3  christos   { "mpu10_dpa1l", 18, PROCESSOR_V850E2V3_UP },
    721  1.1.1.3  christos   { "mpu10_dpa1u", 19, PROCESSOR_V850E2V3_UP },
    722  1.1.1.3  christos   { "mpu10_dpa2l", 20, PROCESSOR_V850E2V3_UP },
    723  1.1.1.3  christos   { "mpu10_dpa2u", 21, PROCESSOR_V850E2V3_UP },
    724  1.1.1.3  christos   { "mpu10_dpa3l", 22, PROCESSOR_V850E2V3_UP },
    725  1.1.1.3  christos   { "mpu10_dpa3u", 23, PROCESSOR_V850E2V3_UP },
    726  1.1.1.3  christos   { "mpu10_dpa4l", 24, PROCESSOR_V850E2V3_UP },
    727  1.1.1.3  christos   { "mpu10_dpa4u", 25, PROCESSOR_V850E2V3_UP },
    728  1.1.1.3  christos   { "mpu10_dpa5l", 26, PROCESSOR_V850E2V3_UP },
    729  1.1.1.3  christos   { "mpu10_dpa5u", 27, PROCESSOR_V850E2V3_UP },
    730  1.1.1.3  christos   { "mpu10_ipa0l",  6, PROCESSOR_V850E2V3_UP },
    731  1.1.1.3  christos   { "mpu10_ipa0u",  7, PROCESSOR_V850E2V3_UP },
    732  1.1.1.3  christos   { "mpu10_ipa1l",  8, PROCESSOR_V850E2V3_UP },
    733  1.1.1.3  christos   { "mpu10_ipa1u",  9, PROCESSOR_V850E2V3_UP },
    734  1.1.1.3  christos   { "mpu10_ipa2l", 10, PROCESSOR_V850E2V3_UP },
    735  1.1.1.3  christos   { "mpu10_ipa2u", 11, PROCESSOR_V850E2V3_UP },
    736  1.1.1.3  christos   { "mpu10_ipa3l", 12, PROCESSOR_V850E2V3_UP },
    737  1.1.1.3  christos   { "mpu10_ipa3u", 13, PROCESSOR_V850E2V3_UP },
    738  1.1.1.3  christos   { "mpu10_ipa4l", 14, PROCESSOR_V850E2V3_UP },
    739  1.1.1.3  christos   { "mpu10_ipa4u", 15, PROCESSOR_V850E2V3_UP },
    740  1.1.1.3  christos   { "mpu10_mpc",    1, PROCESSOR_V850E2V3_UP },
    741  1.1.1.3  christos   { "mpu10_mpm",    0, PROCESSOR_V850E2V3_UP },
    742  1.1.1.3  christos   { "mpu10_tid",    2, PROCESSOR_V850E2V3_UP },
    743  1.1.1.3  christos   { "mpu10_vmadr",  5, PROCESSOR_V850E2V3_UP },
    744  1.1.1.3  christos   { "mpu10_vmecr",  3, PROCESSOR_V850E2V3_UP },
    745  1.1.1.3  christos   { "mpu10_vmtid",  4, PROCESSOR_V850E2V3_UP },
    746  1.1.1.3  christos   { "pid",          6, PROCESSOR_V850E2V3_UP },
    747  1.1.1.2  christos   { "pmcr0",        4, PROCESSOR_V850E2V3_UP },
    748  1.1.1.3  christos   { "pmis2",       14, PROCESSOR_V850E2V3_UP },
    749  1.1.1.3  christos   { "psw",          5, PROCESSOR_ALL },
    750  1.1.1.2  christos   { "scbp",        12, PROCESSOR_V850E2V3_UP },
    751  1.1.1.2  christos   { "sccfg",       11, PROCESSOR_V850E2V3_UP },
    752  1.1.1.2  christos   { "sr0",          0, PROCESSOR_ALL },
    753  1.1.1.2  christos   { "sr1",          1, PROCESSOR_ALL },
    754  1.1.1.2  christos   { "sr10",        10, PROCESSOR_ALL },
    755  1.1.1.2  christos   { "sr11",        11, PROCESSOR_ALL },
    756  1.1.1.2  christos   { "sr12",        12, PROCESSOR_ALL },
    757  1.1.1.2  christos   { "sr13",        13, PROCESSOR_ALL },
    758  1.1.1.2  christos   { "sr14",        14, PROCESSOR_ALL },
    759  1.1.1.2  christos   { "sr15",        15, PROCESSOR_ALL },
    760  1.1.1.2  christos   { "sr16",        16, PROCESSOR_ALL },
    761  1.1.1.2  christos   { "sr17",        17, PROCESSOR_ALL },
    762  1.1.1.2  christos   { "sr18",        18, PROCESSOR_ALL },
    763  1.1.1.2  christos   { "sr19",        19, PROCESSOR_ALL },
    764  1.1.1.2  christos   { "sr2",          2, PROCESSOR_ALL },
    765  1.1.1.2  christos   { "sr20",        20, PROCESSOR_ALL },
    766  1.1.1.2  christos   { "sr21",        21, PROCESSOR_ALL },
    767  1.1.1.2  christos   { "sr22",        22, PROCESSOR_ALL },
    768  1.1.1.2  christos   { "sr23",        23, PROCESSOR_ALL },
    769  1.1.1.2  christos   { "sr24",        24, PROCESSOR_ALL },
    770  1.1.1.2  christos   { "sr25",        25, PROCESSOR_ALL },
    771  1.1.1.2  christos   { "sr26",        26, PROCESSOR_ALL },
    772  1.1.1.2  christos   { "sr27",        27, PROCESSOR_ALL },
    773  1.1.1.2  christos   { "sr28",        28, PROCESSOR_ALL },
    774  1.1.1.2  christos   { "sr29",        29, PROCESSOR_ALL },
    775  1.1.1.2  christos   { "sr3",          3, PROCESSOR_ALL },
    776  1.1.1.2  christos   { "sr30",        30, PROCESSOR_ALL },
    777  1.1.1.2  christos   { "sr31",        31, PROCESSOR_ALL },
    778  1.1.1.2  christos   { "sr4",          4, PROCESSOR_ALL },
    779  1.1.1.2  christos   { "sr5",          5, PROCESSOR_ALL },
    780  1.1.1.2  christos   { "sr6",          6, PROCESSOR_ALL },
    781  1.1.1.2  christos   { "sr7",          7, PROCESSOR_ALL },
    782  1.1.1.3  christos   { "sr8",          8, PROCESSOR_ALL },
    783  1.1.1.3  christos   { "sr9",          9, PROCESSOR_ALL },
    784  1.1.1.3  christos   { "sw_base",      3, PROCESSOR_V850E2V3_UP },
    785  1.1.1.3  christos   { "sw_cfg",       1, PROCESSOR_V850E2V3_UP },
    786  1.1.1.3  christos   { "sw_ctl",       0, PROCESSOR_V850E2V3_UP },
    787  1.1.1.3  christos   { "tid",          2, PROCESSOR_V850E2V3_UP },
    788  1.1.1.3  christos   { "vmadr",        6, PROCESSOR_V850E2V3_UP },
    789  1.1.1.3  christos   { "vmecr",        4, PROCESSOR_V850E2V3_UP },
    790  1.1.1.3  christos   { "vmtid",        5, PROCESSOR_V850E2V3_UP },
    791  1.1.1.3  christos   { "vsadr",        2, PROCESSOR_V850E2V3_UP },
    792      1.1     skrll   { "vsecr",        0, PROCESSOR_V850E2V3_UP },
    793      1.1     skrll   { "vstid",        1, PROCESSOR_V850E2V3_UP },
    794      1.1     skrll };
    795      1.1     skrll 
    796      1.1     skrll #define SYSREG_NAME_CNT						\
    797      1.1     skrll   (sizeof (system_registers) / sizeof (struct reg_name))
    798      1.1     skrll 
    799      1.1     skrll 
    800  1.1.1.2  christos static const struct reg_name cc_names[] =
    801  1.1.1.2  christos {
    802  1.1.1.2  christos   { "c",  0x1, PROCESSOR_ALL },
    803  1.1.1.2  christos   { "e",  0x2, PROCESSOR_ALL },
    804  1.1.1.2  christos   { "ge", 0xe, PROCESSOR_ALL },
    805  1.1.1.2  christos   { "gt", 0xf, PROCESSOR_ALL },
    806  1.1.1.2  christos   { "h",  0xb, PROCESSOR_ALL },
    807  1.1.1.2  christos   { "l",  0x1, PROCESSOR_ALL },
    808  1.1.1.2  christos   { "le", 0x7, PROCESSOR_ALL },
    809  1.1.1.2  christos   { "lt", 0x6, PROCESSOR_ALL },
    810  1.1.1.2  christos   { "n",  0x4, PROCESSOR_ALL },
    811  1.1.1.2  christos   { "nc", 0x9, PROCESSOR_ALL },
    812  1.1.1.2  christos   { "ne", 0xa, PROCESSOR_ALL },
    813  1.1.1.2  christos   { "nh", 0x3, PROCESSOR_ALL },
    814  1.1.1.2  christos   { "nl", 0x9, PROCESSOR_ALL },
    815  1.1.1.2  christos   { "ns", 0xc, PROCESSOR_ALL },
    816  1.1.1.2  christos   { "nv", 0x8, PROCESSOR_ALL },
    817  1.1.1.2  christos   { "nz", 0xa, PROCESSOR_ALL },
    818  1.1.1.2  christos   { "p",  0xc, PROCESSOR_ALL },
    819  1.1.1.2  christos   { "s",  0x4, PROCESSOR_ALL },
    820  1.1.1.2  christos #define COND_SA_NUM 0xd
    821  1.1.1.2  christos   { "sa", COND_SA_NUM, PROCESSOR_ALL },
    822  1.1.1.2  christos   { "t",  0x5, PROCESSOR_ALL },
    823      1.1     skrll   { "v",  0x0, PROCESSOR_ALL },
    824      1.1     skrll   { "z",  0x2, PROCESSOR_ALL },
    825      1.1     skrll };
    826      1.1     skrll 
    827      1.1     skrll #define CC_NAME_CNT					\
    828  1.1.1.2  christos   (sizeof (cc_names) / sizeof (struct reg_name))
    829  1.1.1.2  christos 
    830  1.1.1.3  christos static const struct reg_name float_cc_names[] =
    831  1.1.1.3  christos {
    832  1.1.1.3  christos   { "eq",  0x2, PROCESSOR_V850E2V3_UP },	/* true.  */
    833  1.1.1.3  christos   { "f",   0x0, PROCESSOR_V850E2V3_UP },	/* true.  */
    834  1.1.1.3  christos   { "ge",  0xd, PROCESSOR_V850E2V3_UP },	/* false.  */
    835  1.1.1.3  christos   { "gl",  0xb, PROCESSOR_V850E2V3_UP },	/* false.  */
    836  1.1.1.3  christos   { "gle", 0x9, PROCESSOR_V850E2V3_UP },	/* false.  */
    837  1.1.1.3  christos   { "gt",  0xf, PROCESSOR_V850E2V3_UP },	/* false.  */
    838  1.1.1.3  christos   { "le",  0xe, PROCESSOR_V850E2V3_UP },	/* true.  */
    839  1.1.1.3  christos   { "lt",  0xc, PROCESSOR_V850E2V3_UP },	/* true.  */
    840  1.1.1.3  christos   { "neq", 0x2, PROCESSOR_V850E2V3_UP },	/* false.  */
    841  1.1.1.3  christos   { "nge", 0xd, PROCESSOR_V850E2V3_UP },	/* true.  */
    842  1.1.1.3  christos   { "ngl", 0xb, PROCESSOR_V850E2V3_UP },	/* true.  */
    843  1.1.1.3  christos   { "ngle",0x9, PROCESSOR_V850E2V3_UP },	/* true.  */
    844  1.1.1.3  christos   { "ngt", 0xf, PROCESSOR_V850E2V3_UP },	/* true.  */
    845  1.1.1.3  christos   { "nle", 0xe, PROCESSOR_V850E2V3_UP },	/* false.  */
    846  1.1.1.3  christos   { "nlt", 0xc, PROCESSOR_V850E2V3_UP },	/* false.  */
    847  1.1.1.3  christos   { "oge", 0x5, PROCESSOR_V850E2V3_UP },	/* false.  */
    848  1.1.1.3  christos   { "ogl", 0x3, PROCESSOR_V850E2V3_UP },	/* false.  */
    849  1.1.1.3  christos   { "ogt", 0x7, PROCESSOR_V850E2V3_UP },	/* false.  */
    850  1.1.1.3  christos   { "ole", 0x6, PROCESSOR_V850E2V3_UP },	/* true.  */
    851  1.1.1.3  christos   { "olt", 0x4, PROCESSOR_V850E2V3_UP },	/* true.  */
    852  1.1.1.3  christos   { "or",  0x1, PROCESSOR_V850E2V3_UP },	/* false.  */
    853  1.1.1.3  christos   { "seq", 0xa, PROCESSOR_V850E2V3_UP },	/* true.  */
    854  1.1.1.3  christos   { "sf",  0x8, PROCESSOR_V850E2V3_UP },	/* true.  */
    855  1.1.1.3  christos   { "sne", 0xa, PROCESSOR_V850E2V3_UP },	/* false.  */
    856  1.1.1.3  christos   { "st",  0x8, PROCESSOR_V850E2V3_UP },	/* false.  */
    857  1.1.1.3  christos   { "t",   0x0, PROCESSOR_V850E2V3_UP },	/* false.  */
    858  1.1.1.3  christos   { "ueq", 0x3, PROCESSOR_V850E2V3_UP },	/* true.  */
    859  1.1.1.3  christos   { "uge", 0x4, PROCESSOR_V850E2V3_UP },	/* false.  */
    860  1.1.1.3  christos   { "ugt", 0x6, PROCESSOR_V850E2V3_UP },	/* false.  */
    861  1.1.1.3  christos   { "ule", 0x7, PROCESSOR_V850E2V3_UP },	/* true.  */
    862  1.1.1.2  christos   { "ult", 0x5, PROCESSOR_V850E2V3_UP },	/* true.  */
    863  1.1.1.2  christos   { "un",  0x1, PROCESSOR_V850E2V3_UP },	/* true.  */
    864  1.1.1.2  christos };
    865  1.1.1.2  christos 
    866  1.1.1.2  christos #define FLOAT_CC_NAME_CNT					\
    867  1.1.1.3  christos   (sizeof (float_cc_names) / sizeof (struct reg_name))
    868  1.1.1.3  christos 
    869  1.1.1.3  christos 
    870  1.1.1.3  christos static const struct reg_name cacheop_names[] =
    871  1.1.1.3  christos {
    872  1.1.1.3  christos   { "cfald",   0x44, PROCESSOR_V850E3V5_UP },
    873  1.1.1.3  christos   { "cfali",   0x40, PROCESSOR_V850E3V5_UP },
    874  1.1.1.3  christos   { "chbid",   0x04, PROCESSOR_V850E3V5_UP },
    875  1.1.1.3  christos   { "chbii",   0x00, PROCESSOR_V850E3V5_UP },
    876  1.1.1.3  christos   { "chbiwbd", 0x06, PROCESSOR_V850E3V5_UP },
    877  1.1.1.3  christos   { "chbwbd",  0x07, PROCESSOR_V850E3V5_UP },
    878  1.1.1.3  christos   { "cibid",   0x24, PROCESSOR_V850E3V5_UP },
    879  1.1.1.3  christos   { "cibii",   0x20, PROCESSOR_V850E3V5_UP },
    880  1.1.1.3  christos   { "cibiwbd", 0x26, PROCESSOR_V850E3V5_UP },
    881  1.1.1.3  christos   { "cibwbd",  0x27, PROCESSOR_V850E3V5_UP },
    882  1.1.1.3  christos   { "cildd",   0x65, PROCESSOR_V850E3V5_UP },
    883  1.1.1.3  christos   { "cildi",   0x61, PROCESSOR_V850E3V5_UP },
    884  1.1.1.3  christos   { "cistd",   0x64, PROCESSOR_V850E3V5_UP },
    885  1.1.1.3  christos   { "cisti",   0x60, PROCESSOR_V850E3V5_UP },
    886  1.1.1.3  christos };
    887  1.1.1.3  christos 
    888  1.1.1.3  christos #define CACHEOP_NAME_CNT					\
    889  1.1.1.3  christos   (sizeof (cacheop_names) / sizeof (struct reg_name))
    890  1.1.1.3  christos 
    891  1.1.1.3  christos static const struct reg_name prefop_names[] =
    892  1.1.1.3  christos {
    893  1.1.1.3  christos   { "prefd",   0x04, PROCESSOR_V850E3V5_UP },
    894  1.1.1.3  christos   { "prefi",   0x00, PROCESSOR_V850E3V5_UP },
    895  1.1.1.3  christos };
    896  1.1.1.3  christos 
    897  1.1.1.3  christos #define PREFOP_NAME_CNT					\
    898  1.1.1.3  christos   (sizeof (prefop_names) / sizeof (struct reg_name))
    899  1.1.1.3  christos 
    900  1.1.1.3  christos static const struct reg_name vector_registers[] =
    901  1.1.1.3  christos {
    902  1.1.1.3  christos   { "vr0",   0, PROCESSOR_V850E3V5_UP },
    903  1.1.1.3  christos   { "vr1",   1, PROCESSOR_V850E3V5_UP },
    904  1.1.1.3  christos   { "vr10", 10, PROCESSOR_V850E3V5_UP },
    905  1.1.1.3  christos   { "vr11", 11, PROCESSOR_V850E3V5_UP },
    906  1.1.1.3  christos   { "vr12", 12, PROCESSOR_V850E3V5_UP },
    907  1.1.1.3  christos   { "vr13", 13, PROCESSOR_V850E3V5_UP },
    908  1.1.1.3  christos   { "vr14", 14, PROCESSOR_V850E3V5_UP },
    909  1.1.1.3  christos   { "vr15", 15, PROCESSOR_V850E3V5_UP },
    910  1.1.1.3  christos   { "vr16", 16, PROCESSOR_V850E3V5_UP },
    911  1.1.1.3  christos   { "vr17", 17, PROCESSOR_V850E3V5_UP },
    912  1.1.1.3  christos   { "vr18", 18, PROCESSOR_V850E3V5_UP },
    913  1.1.1.3  christos   { "vr19", 19, PROCESSOR_V850E3V5_UP },
    914  1.1.1.3  christos   { "vr2",   2, PROCESSOR_V850E3V5_UP },
    915  1.1.1.3  christos   { "vr20", 20, PROCESSOR_V850E3V5_UP },
    916  1.1.1.3  christos   { "vr21", 21, PROCESSOR_V850E3V5_UP },
    917  1.1.1.3  christos   { "vr22", 22, PROCESSOR_V850E3V5_UP },
    918  1.1.1.3  christos   { "vr23", 23, PROCESSOR_V850E3V5_UP },
    919  1.1.1.3  christos   { "vr24", 24, PROCESSOR_V850E3V5_UP },
    920  1.1.1.3  christos   { "vr25", 25, PROCESSOR_V850E3V5_UP },
    921  1.1.1.3  christos   { "vr26", 26, PROCESSOR_V850E3V5_UP },
    922  1.1.1.3  christos   { "vr27", 27, PROCESSOR_V850E3V5_UP },
    923  1.1.1.3  christos   { "vr28", 28, PROCESSOR_V850E3V5_UP },
    924  1.1.1.3  christos   { "vr29", 29, PROCESSOR_V850E3V5_UP },
    925  1.1.1.3  christos   { "vr3",   3, PROCESSOR_V850E3V5_UP },
    926  1.1.1.3  christos   { "vr30", 30, PROCESSOR_V850E3V5_UP },
    927  1.1.1.3  christos   { "vr31", 31, PROCESSOR_V850E3V5_UP },
    928  1.1.1.3  christos   { "vr4",   4, PROCESSOR_V850E3V5_UP },
    929  1.1.1.3  christos   { "vr5",   5, PROCESSOR_V850E3V5_UP },
    930  1.1.1.3  christos   { "vr6",   6, PROCESSOR_V850E3V5_UP },
    931  1.1.1.3  christos   { "vr7",   7, PROCESSOR_V850E3V5_UP },
    932  1.1.1.3  christos   { "vr8",   8, PROCESSOR_V850E3V5_UP },
    933  1.1.1.3  christos   { "vr9",   9, PROCESSOR_V850E3V5_UP },
    934  1.1.1.3  christos };
    935  1.1.1.3  christos 
    936  1.1.1.3  christos #define VREG_NAME_CNT						\
    937      1.1     skrll   (sizeof (vector_registers) / sizeof (struct reg_name))
    938  1.1.1.5  christos 
    939      1.1     skrll /* Do a binary search of the given register table to see if NAME is a
    940      1.1     skrll    valid register name.  Return the register number from the array on
    941      1.1     skrll    success, or -1 on failure.  */
    942      1.1     skrll 
    943      1.1     skrll static int
    944      1.1     skrll reg_name_search (const struct reg_name *regs,
    945      1.1     skrll 		 int regcount,
    946      1.1     skrll 		 const char *name,
    947      1.1     skrll 		 bfd_boolean accept_numbers)
    948      1.1     skrll {
    949      1.1     skrll   int middle, low, high;
    950      1.1     skrll   int cmp;
    951      1.1     skrll   symbolS *symbolP;
    952      1.1     skrll 
    953      1.1     skrll   /* If the register name is a symbol, then evaluate it.  */
    954      1.1     skrll   if ((symbolP = symbol_find (name)) != NULL)
    955      1.1     skrll     {
    956      1.1     skrll       /* If the symbol is an alias for another name then use that.
    957      1.1     skrll 	 If the symbol is an alias for a number, then return the number.  */
    958      1.1     skrll       if (symbol_equated_p (symbolP))
    959      1.1     skrll 	name
    960      1.1     skrll 	  = S_GET_NAME (symbol_get_value_expression (symbolP)->X_add_symbol);
    961      1.1     skrll       else if (accept_numbers)
    962  1.1.1.2  christos 	{
    963      1.1     skrll 	  int reg = S_GET_VALUE (symbolP);
    964      1.1     skrll 	  return reg;
    965      1.1     skrll 	}
    966      1.1     skrll 
    967      1.1     skrll       /* Otherwise drop through and try parsing name normally.  */
    968      1.1     skrll     }
    969      1.1     skrll 
    970      1.1     skrll   low = 0;
    971      1.1     skrll   high = regcount - 1;
    972      1.1     skrll 
    973      1.1     skrll   do
    974      1.1     skrll     {
    975      1.1     skrll       middle = (low + high) / 2;
    976      1.1     skrll       cmp = strcasecmp (name, regs[middle].name);
    977      1.1     skrll       if (cmp < 0)
    978      1.1     skrll 	high = middle - 1;
    979      1.1     skrll       else if (cmp > 0)
    980  1.1.1.2  christos 	low = middle + 1;
    981  1.1.1.2  christos       else
    982  1.1.1.2  christos 	return ((regs[middle].processors & processor_mask)
    983      1.1     skrll 		? regs[middle].value
    984      1.1     skrll 		: -1);
    985      1.1     skrll     }
    986      1.1     skrll   while (low <= high);
    987      1.1     skrll   return -1;
    988      1.1     skrll }
    989      1.1     skrll 
    990      1.1     skrll /* Summary of register_name().
    991      1.1     skrll 
    992      1.1     skrll    in: Input_line_pointer points to 1st char of operand.
    993      1.1     skrll 
    994      1.1     skrll    out: An expressionS.
    995      1.1     skrll   	The operand may have been a register: in this case, X_op == O_register,
    996      1.1     skrll   	X_add_number is set to the register number, and truth is returned.
    997      1.1     skrll   	Input_line_pointer->(next non-blank) char after operand, or is in
    998      1.1     skrll   	its original state.  */
    999      1.1     skrll 
   1000      1.1     skrll static bfd_boolean
   1001      1.1     skrll register_name (expressionS *expressionP)
   1002      1.1     skrll {
   1003      1.1     skrll   int reg_number;
   1004      1.1     skrll   char *name;
   1005      1.1     skrll   char *start;
   1006      1.1     skrll   char c;
   1007  1.1.1.3  christos 
   1008  1.1.1.3  christos   /* Find the spelling of the operand.  */
   1009      1.1     skrll   start = input_line_pointer;
   1010      1.1     skrll   c = get_symbol_name (&name);
   1011      1.1     skrll 
   1012      1.1     skrll   reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT,
   1013      1.1     skrll 				name, FALSE);
   1014  1.1.1.3  christos 
   1015      1.1     skrll   /* Put back the delimiting char.  */
   1016  1.1.1.2  christos   (void) restore_line_pointer (c);
   1017  1.1.1.2  christos 
   1018  1.1.1.2  christos   expressionP->X_add_symbol = NULL;
   1019      1.1     skrll   expressionP->X_op_symbol  = NULL;
   1020      1.1     skrll 
   1021      1.1     skrll   /* Look to see if it's in the register table.  */
   1022      1.1     skrll   if (reg_number >= 0)
   1023      1.1     skrll     {
   1024      1.1     skrll       expressionP->X_op		= O_register;
   1025      1.1     skrll       expressionP->X_add_number = reg_number;
   1026      1.1     skrll 
   1027      1.1     skrll       return TRUE;
   1028  1.1.1.2  christos     }
   1029  1.1.1.2  christos 
   1030  1.1.1.2  christos   /* Reset the line as if we had not done anything.  */
   1031  1.1.1.2  christos   input_line_pointer = start;
   1032  1.1.1.2  christos 
   1033  1.1.1.2  christos   expressionP->X_op = O_illegal;
   1034      1.1     skrll 
   1035      1.1     skrll   return FALSE;
   1036      1.1     skrll }
   1037      1.1     skrll 
   1038      1.1     skrll /* Summary of system_register_name().
   1039      1.1     skrll 
   1040      1.1     skrll    in:  INPUT_LINE_POINTER points to 1st char of operand.
   1041      1.1     skrll 	EXPRESSIONP points to an expression structure to be filled in.
   1042      1.1     skrll 	ACCEPT_NUMBERS is true iff numerical register names may be used.
   1043      1.1     skrll 
   1044      1.1     skrll    out: An expressionS structure in expressionP.
   1045      1.1     skrll   	The operand may have been a register: in this case, X_op == O_register,
   1046      1.1     skrll   	X_add_number is set to the register number, and truth is returned.
   1047      1.1     skrll   	Input_line_pointer->(next non-blank) char after operand, or is in
   1048      1.1     skrll   	its original state.  */
   1049      1.1     skrll 
   1050  1.1.1.2  christos static bfd_boolean
   1051      1.1     skrll system_register_name (expressionS *expressionP,
   1052      1.1     skrll 		      bfd_boolean accept_numbers)
   1053      1.1     skrll {
   1054      1.1     skrll   int reg_number;
   1055      1.1     skrll   char *name;
   1056      1.1     skrll   char *start;
   1057      1.1     skrll   char c;
   1058  1.1.1.3  christos 
   1059  1.1.1.3  christos   /* Find the spelling of the operand.  */
   1060      1.1     skrll   start = input_line_pointer;
   1061      1.1     skrll   c = get_symbol_name (&name);
   1062      1.1     skrll   reg_number = reg_name_search (system_registers, SYSREG_NAME_CNT, name,
   1063      1.1     skrll 				accept_numbers);
   1064  1.1.1.3  christos 
   1065      1.1     skrll   /* Put back the delimiting char.  */
   1066      1.1     skrll   (void) restore_line_pointer (c);
   1067      1.1     skrll 
   1068      1.1     skrll   if (reg_number < 0
   1069      1.1     skrll       && accept_numbers)
   1070      1.1     skrll     {
   1071      1.1     skrll       /* Reset input_line pointer.  */
   1072      1.1     skrll       input_line_pointer = start;
   1073      1.1     skrll 
   1074  1.1.1.2  christos       if (ISDIGIT (*input_line_pointer))
   1075      1.1     skrll 	{
   1076      1.1     skrll 	  reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
   1077      1.1     skrll 	}
   1078  1.1.1.2  christos     }
   1079  1.1.1.2  christos 
   1080  1.1.1.2  christos   expressionP->X_add_symbol = NULL;
   1081      1.1     skrll   expressionP->X_op_symbol  = NULL;
   1082      1.1     skrll 
   1083      1.1     skrll   /* Look to see if it's in the register table.  */
   1084      1.1     skrll   if (reg_number >= 0)
   1085      1.1     skrll     {
   1086      1.1     skrll       expressionP->X_op		= O_register;
   1087      1.1     skrll       expressionP->X_add_number = reg_number;
   1088      1.1     skrll 
   1089      1.1     skrll       return TRUE;
   1090  1.1.1.2  christos     }
   1091  1.1.1.2  christos 
   1092  1.1.1.2  christos   /* Reset the line as if we had not done anything.  */
   1093  1.1.1.2  christos   input_line_pointer = start;
   1094  1.1.1.2  christos 
   1095  1.1.1.2  christos   expressionP->X_op = O_illegal;
   1096      1.1     skrll 
   1097      1.1     skrll   return FALSE;
   1098      1.1     skrll }
   1099      1.1     skrll 
   1100      1.1     skrll /* Summary of cc_name().
   1101      1.1     skrll 
   1102      1.1     skrll    in: INPUT_LINE_POINTER points to 1st char of operand.
   1103      1.1     skrll 
   1104      1.1     skrll    out: An expressionS.
   1105      1.1     skrll   	The operand may have been a register: in this case, X_op == O_register,
   1106      1.1     skrll   	X_add_number is set to the register number, and truth is returned.
   1107      1.1     skrll   	Input_line_pointer->(next non-blank) char after operand, or is in
   1108      1.1     skrll   	its original state.  */
   1109  1.1.1.2  christos 
   1110  1.1.1.2  christos static bfd_boolean
   1111      1.1     skrll cc_name (expressionS *expressionP,
   1112      1.1     skrll 	 bfd_boolean accept_numbers)
   1113      1.1     skrll {
   1114      1.1     skrll   int reg_number;
   1115      1.1     skrll   char *name;
   1116      1.1     skrll   char *start;
   1117      1.1     skrll   char c;
   1118  1.1.1.3  christos 
   1119  1.1.1.3  christos   /* Find the spelling of the operand.  */
   1120  1.1.1.2  christos   start = input_line_pointer;
   1121      1.1     skrll   c = get_symbol_name (&name);
   1122      1.1     skrll   reg_number = reg_name_search (cc_names, CC_NAME_CNT, name, accept_numbers);
   1123  1.1.1.3  christos 
   1124      1.1     skrll   /* Put back the delimiting char.  */
   1125  1.1.1.2  christos   (void) restore_line_pointer (c);
   1126  1.1.1.2  christos 
   1127  1.1.1.2  christos   if (reg_number < 0
   1128  1.1.1.2  christos       && accept_numbers)
   1129  1.1.1.2  christos     {
   1130  1.1.1.2  christos       /* Reset input_line pointer.  */
   1131  1.1.1.2  christos       input_line_pointer = start;
   1132  1.1.1.2  christos 
   1133  1.1.1.2  christos       if (ISDIGIT (*input_line_pointer))
   1134  1.1.1.2  christos 	{
   1135  1.1.1.2  christos 	  reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
   1136  1.1.1.2  christos 	}
   1137  1.1.1.2  christos     }
   1138  1.1.1.2  christos 
   1139  1.1.1.2  christos   expressionP->X_add_symbol = NULL;
   1140      1.1     skrll   expressionP->X_op_symbol  = NULL;
   1141      1.1     skrll 
   1142      1.1     skrll   /* Look to see if it's in the register table.  */
   1143      1.1     skrll   if (reg_number >= 0)
   1144      1.1     skrll     {
   1145      1.1     skrll       expressionP->X_op		= O_constant;
   1146      1.1     skrll       expressionP->X_add_number = reg_number;
   1147      1.1     skrll 
   1148  1.1.1.2  christos       return TRUE;
   1149  1.1.1.2  christos     }
   1150  1.1.1.2  christos 
   1151  1.1.1.2  christos   /* Reset the line as if we had not done anything.  */
   1152  1.1.1.2  christos   input_line_pointer = start;
   1153  1.1.1.2  christos 
   1154  1.1.1.2  christos   expressionP->X_op = O_illegal;
   1155  1.1.1.2  christos   expressionP->X_add_number = 0;
   1156  1.1.1.2  christos 
   1157  1.1.1.2  christos   return FALSE;
   1158  1.1.1.2  christos }
   1159  1.1.1.2  christos 
   1160  1.1.1.2  christos static bfd_boolean
   1161  1.1.1.2  christos float_cc_name (expressionS *expressionP,
   1162  1.1.1.2  christos 	       bfd_boolean accept_numbers)
   1163  1.1.1.2  christos {
   1164  1.1.1.2  christos   int reg_number;
   1165  1.1.1.2  christos   char *name;
   1166  1.1.1.2  christos   char *start;
   1167  1.1.1.2  christos   char c;
   1168  1.1.1.3  christos 
   1169  1.1.1.3  christos   /* Find the spelling of the operand.  */
   1170  1.1.1.2  christos   start = input_line_pointer;
   1171  1.1.1.2  christos   c = get_symbol_name (&name);
   1172  1.1.1.2  christos   reg_number = reg_name_search (float_cc_names, FLOAT_CC_NAME_CNT, name, accept_numbers);
   1173  1.1.1.3  christos 
   1174  1.1.1.2  christos   /* Put back the delimiting char.  */
   1175  1.1.1.2  christos   (void) restore_line_pointer (c);
   1176  1.1.1.2  christos 
   1177      1.1     skrll   if (reg_number < 0
   1178  1.1.1.2  christos       && accept_numbers)
   1179      1.1     skrll     {
   1180      1.1     skrll       /* Reset input_line pointer.  */
   1181  1.1.1.2  christos       input_line_pointer = start;
   1182  1.1.1.2  christos 
   1183  1.1.1.2  christos       if (ISDIGIT (*input_line_pointer))
   1184  1.1.1.2  christos 	{
   1185  1.1.1.2  christos 	  reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
   1186  1.1.1.2  christos 	}
   1187  1.1.1.2  christos     }
   1188  1.1.1.2  christos 
   1189  1.1.1.2  christos   expressionP->X_add_symbol = NULL;
   1190  1.1.1.2  christos   expressionP->X_op_symbol  = NULL;
   1191  1.1.1.2  christos 
   1192  1.1.1.2  christos   /* Look to see if it's in the register table.  */
   1193  1.1.1.2  christos   if (reg_number >= 0)
   1194  1.1.1.2  christos     {
   1195  1.1.1.2  christos       expressionP->X_op		= O_constant;
   1196  1.1.1.2  christos       expressionP->X_add_number = reg_number;
   1197      1.1     skrll 
   1198  1.1.1.2  christos       return TRUE;
   1199  1.1.1.2  christos     }
   1200  1.1.1.2  christos 
   1201  1.1.1.2  christos   /* Reset the line as if we had not done anything.  */
   1202  1.1.1.2  christos   input_line_pointer = start;
   1203  1.1.1.2  christos 
   1204  1.1.1.2  christos   expressionP->X_op = O_illegal;
   1205  1.1.1.2  christos   expressionP->X_add_number = 0;
   1206      1.1     skrll 
   1207      1.1     skrll   return FALSE;
   1208  1.1.1.3  christos }
   1209  1.1.1.3  christos 
   1210  1.1.1.3  christos static bfd_boolean
   1211  1.1.1.3  christos cacheop_name (expressionS * expressionP,
   1212  1.1.1.3  christos 	      bfd_boolean accept_numbers)
   1213  1.1.1.3  christos {
   1214  1.1.1.3  christos   int reg_number;
   1215  1.1.1.3  christos   char *name;
   1216  1.1.1.3  christos   char *start;
   1217  1.1.1.3  christos   char c;
   1218  1.1.1.3  christos 
   1219  1.1.1.3  christos   /* Find the spelling of the operand.  */
   1220  1.1.1.3  christos   start = input_line_pointer;
   1221  1.1.1.3  christos   c = get_symbol_name (&name);
   1222  1.1.1.3  christos   reg_number = reg_name_search (cacheop_names, CACHEOP_NAME_CNT, name, accept_numbers);
   1223  1.1.1.3  christos 
   1224  1.1.1.3  christos   /* Put back the delimiting char.  */
   1225  1.1.1.3  christos   (void) restore_line_pointer (c);
   1226  1.1.1.3  christos 
   1227  1.1.1.3  christos   if (reg_number < 0
   1228  1.1.1.3  christos       && accept_numbers)
   1229  1.1.1.3  christos     {
   1230  1.1.1.3  christos       /* Reset input_line pointer.  */
   1231  1.1.1.3  christos       input_line_pointer = start;
   1232  1.1.1.3  christos 
   1233  1.1.1.3  christos       if (ISDIGIT (*input_line_pointer))
   1234  1.1.1.3  christos 	reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
   1235  1.1.1.3  christos     }
   1236  1.1.1.3  christos 
   1237  1.1.1.3  christos   expressionP->X_add_symbol = NULL;
   1238  1.1.1.3  christos   expressionP->X_op_symbol  = NULL;
   1239  1.1.1.3  christos 
   1240  1.1.1.3  christos   /* Look to see if it's in the register table.  */
   1241  1.1.1.3  christos   if (reg_number >= 0)
   1242  1.1.1.3  christos     {
   1243  1.1.1.3  christos       expressionP->X_op		= O_constant;
   1244  1.1.1.3  christos       expressionP->X_add_number = reg_number;
   1245  1.1.1.3  christos 
   1246  1.1.1.3  christos       return TRUE;
   1247  1.1.1.3  christos     }
   1248  1.1.1.3  christos 
   1249  1.1.1.3  christos   /* Reset the line as if we had not done anything.  */
   1250  1.1.1.3  christos   input_line_pointer = start;
   1251  1.1.1.3  christos 
   1252  1.1.1.3  christos   expressionP->X_op = O_illegal;
   1253  1.1.1.3  christos   expressionP->X_add_number = 0;
   1254  1.1.1.3  christos 
   1255  1.1.1.3  christos   return FALSE;
   1256  1.1.1.3  christos }
   1257  1.1.1.3  christos 
   1258  1.1.1.3  christos static bfd_boolean
   1259  1.1.1.3  christos prefop_name (expressionS * expressionP,
   1260  1.1.1.3  christos 	     bfd_boolean accept_numbers)
   1261  1.1.1.3  christos {
   1262  1.1.1.3  christos   int reg_number;
   1263  1.1.1.3  christos   char *name;
   1264  1.1.1.3  christos   char *start;
   1265  1.1.1.3  christos   char c;
   1266  1.1.1.3  christos 
   1267  1.1.1.3  christos   /* Find the spelling of the operand.  */
   1268  1.1.1.3  christos   start = input_line_pointer;
   1269  1.1.1.3  christos   c = get_symbol_name (&name);
   1270  1.1.1.3  christos   reg_number = reg_name_search (prefop_names, PREFOP_NAME_CNT, name, accept_numbers);
   1271  1.1.1.3  christos 
   1272  1.1.1.3  christos   /* Put back the delimiting char.  */
   1273  1.1.1.3  christos   (void) restore_line_pointer (c);
   1274  1.1.1.3  christos 
   1275  1.1.1.3  christos   if (reg_number < 0
   1276  1.1.1.3  christos       && accept_numbers)
   1277  1.1.1.3  christos     {
   1278  1.1.1.3  christos       /* Reset input_line pointer.  */
   1279  1.1.1.3  christos       input_line_pointer = start;
   1280  1.1.1.3  christos 
   1281  1.1.1.3  christos       if (ISDIGIT (*input_line_pointer))
   1282  1.1.1.3  christos 	reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
   1283  1.1.1.3  christos     }
   1284  1.1.1.3  christos 
   1285  1.1.1.3  christos   expressionP->X_add_symbol = NULL;
   1286  1.1.1.3  christos   expressionP->X_op_symbol  = NULL;
   1287  1.1.1.3  christos 
   1288  1.1.1.3  christos   /* Look to see if it's in the register table.  */
   1289  1.1.1.3  christos   if (reg_number >= 0)
   1290  1.1.1.3  christos     {
   1291  1.1.1.3  christos       expressionP->X_op		= O_constant;
   1292  1.1.1.3  christos       expressionP->X_add_number = reg_number;
   1293  1.1.1.3  christos 
   1294  1.1.1.3  christos       return TRUE;
   1295  1.1.1.3  christos     }
   1296  1.1.1.3  christos 
   1297  1.1.1.3  christos   /* Reset the line as if we had not done anything.  */
   1298  1.1.1.3  christos   input_line_pointer = start;
   1299  1.1.1.3  christos 
   1300  1.1.1.3  christos   expressionP->X_op = O_illegal;
   1301  1.1.1.3  christos   expressionP->X_add_number = 0;
   1302  1.1.1.3  christos 
   1303  1.1.1.3  christos   return FALSE;
   1304  1.1.1.3  christos }
   1305  1.1.1.3  christos 
   1306  1.1.1.3  christos static bfd_boolean
   1307  1.1.1.3  christos vector_register_name (expressionS *expressionP)
   1308  1.1.1.3  christos {
   1309  1.1.1.3  christos   int reg_number;
   1310  1.1.1.3  christos   char *name;
   1311  1.1.1.3  christos   char *start;
   1312  1.1.1.3  christos   char c;
   1313  1.1.1.3  christos 
   1314  1.1.1.3  christos   /* Find the spelling of the operand.  */
   1315  1.1.1.3  christos   start = input_line_pointer;
   1316  1.1.1.3  christos   c = get_symbol_name (&name);
   1317  1.1.1.3  christos 
   1318  1.1.1.3  christos   reg_number = reg_name_search (vector_registers, VREG_NAME_CNT,
   1319  1.1.1.3  christos 				name, FALSE);
   1320  1.1.1.3  christos 
   1321  1.1.1.3  christos   /* Put back the delimiting char.  */
   1322  1.1.1.3  christos   (void) restore_line_pointer (c);
   1323  1.1.1.3  christos 
   1324  1.1.1.3  christos   expressionP->X_add_symbol = NULL;
   1325  1.1.1.3  christos   expressionP->X_op_symbol  = NULL;
   1326  1.1.1.3  christos 
   1327  1.1.1.3  christos   /* Look to see if it's in the register table.  */
   1328  1.1.1.3  christos   if (reg_number >= 0)
   1329  1.1.1.3  christos     {
   1330  1.1.1.3  christos       expressionP->X_op		= O_register;
   1331  1.1.1.3  christos       expressionP->X_add_number = reg_number;
   1332  1.1.1.3  christos 
   1333  1.1.1.3  christos       return TRUE;
   1334  1.1.1.3  christos     }
   1335  1.1.1.3  christos 
   1336  1.1.1.3  christos   /* Reset the line as if we had not done anything.  */
   1337  1.1.1.3  christos   input_line_pointer = start;
   1338  1.1.1.3  christos 
   1339  1.1.1.3  christos   expressionP->X_op = O_illegal;
   1340  1.1.1.3  christos 
   1341  1.1.1.3  christos   return FALSE;
   1342      1.1     skrll }
   1343      1.1     skrll 
   1344      1.1     skrll static void
   1345      1.1     skrll skip_white_space (void)
   1346      1.1     skrll {
   1347      1.1     skrll   while (*input_line_pointer == ' '
   1348      1.1     skrll 	 || *input_line_pointer == '\t')
   1349      1.1     skrll     ++input_line_pointer;
   1350      1.1     skrll }
   1351      1.1     skrll 
   1352      1.1     skrll /* Summary of parse_register_list ().
   1353      1.1     skrll 
   1354      1.1     skrll    in: INPUT_LINE_POINTER  points to 1st char of a list of registers.
   1355      1.1     skrll        INSN		   is the partially constructed instruction.
   1356      1.1     skrll        OPERAND		   is the operand being inserted.
   1357      1.1     skrll 
   1358      1.1     skrll    out: NULL if the parse completed successfully, otherwise a
   1359      1.1     skrll 	pointer to an error message is returned.  If the parse
   1360      1.1     skrll 	completes the correct bit fields in the instruction
   1361      1.1     skrll 	will be filled in.
   1362      1.1     skrll 
   1363      1.1     skrll    Parses register lists with the syntax:
   1364      1.1     skrll 
   1365      1.1     skrll      { rX }
   1366      1.1     skrll      { rX, rY }
   1367      1.1     skrll      { rX - rY }
   1368      1.1     skrll      { rX - rY, rZ }
   1369  1.1.1.5  christos      etc
   1370      1.1     skrll 
   1371      1.1     skrll    and also parses constant expressions whose bits indicate the
   1372      1.1     skrll    registers in the lists.  The LSB in the expression refers to
   1373      1.1     skrll    the lowest numbered permissible register in the register list,
   1374      1.1     skrll    and so on upwards.  System registers are considered to be very
   1375  1.1.1.4  christos    high numbers.  */
   1376      1.1     skrll 
   1377      1.1     skrll static const char *
   1378      1.1     skrll parse_register_list (unsigned long *insn,
   1379      1.1     skrll 		     const struct v850_operand *operand)
   1380      1.1     skrll {
   1381      1.1     skrll   static int type1_regs[32] =
   1382      1.1     skrll   {
   1383      1.1     skrll     30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   1384  1.1.1.2  christos      0,  0,  0,  0,  0, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
   1385      1.1     skrll   };
   1386      1.1     skrll 
   1387      1.1     skrll   int *regs;
   1388      1.1     skrll   expressionS exp;
   1389      1.1     skrll 
   1390      1.1     skrll   /* Select a register array to parse.  */
   1391      1.1     skrll   switch (operand->shift)
   1392      1.1     skrll     {
   1393      1.1     skrll     case 0xffe00001: regs = type1_regs; break;
   1394      1.1     skrll     default:
   1395      1.1     skrll       as_bad (_("unknown operand shift: %x\n"), operand->shift);
   1396      1.1     skrll       return _("internal failure in parse_register_list");
   1397      1.1     skrll     }
   1398      1.1     skrll 
   1399      1.1     skrll   skip_white_space ();
   1400  1.1.1.5  christos 
   1401      1.1     skrll   /* If the expression starts with a curly brace it is a register list.
   1402      1.1     skrll      Otherwise it is a constant expression, whose bits indicate which
   1403      1.1     skrll      registers are to be included in the list.  */
   1404      1.1     skrll   if (*input_line_pointer != '{')
   1405      1.1     skrll     {
   1406      1.1     skrll       int reg;
   1407      1.1     skrll       int i;
   1408      1.1     skrll 
   1409      1.1     skrll       expression (&exp);
   1410      1.1     skrll 
   1411      1.1     skrll       if (exp.X_op != O_constant)
   1412      1.1     skrll 	return _("constant expression or register list expected");
   1413      1.1     skrll 
   1414      1.1     skrll       if (regs == type1_regs)
   1415      1.1     skrll 	{
   1416      1.1     skrll 	  if (exp.X_add_number & 0xFFFFF000)
   1417      1.1     skrll 	    return _("high bits set in register list expression");
   1418      1.1     skrll 
   1419      1.1     skrll 	  for (reg = 20; reg < 32; reg++)
   1420      1.1     skrll 	    if (exp.X_add_number & (1 << (reg - 20)))
   1421      1.1     skrll 	      {
   1422      1.1     skrll 		for (i = 0; i < 32; i++)
   1423      1.1     skrll 		  if (regs[i] == reg)
   1424      1.1     skrll 		    *insn |= (1 << i);
   1425      1.1     skrll 	      }
   1426      1.1     skrll 	}
   1427      1.1     skrll 
   1428      1.1     skrll       return NULL;
   1429      1.1     skrll     }
   1430      1.1     skrll 
   1431      1.1     skrll   input_line_pointer++;
   1432      1.1     skrll 
   1433      1.1     skrll   /* Parse the register list until a terminator (closing curly brace or
   1434      1.1     skrll      new-line) is found.  */
   1435  1.1.1.2  christos   for (;;)
   1436  1.1.1.2  christos     {
   1437      1.1     skrll       skip_white_space ();
   1438      1.1     skrll 
   1439      1.1     skrll       if (register_name (&exp))
   1440      1.1     skrll 	{
   1441      1.1     skrll 	  int i;
   1442      1.1     skrll 
   1443      1.1     skrll 	  /* Locate the given register in the list, and if it is there,
   1444      1.1     skrll 	     insert the corresponding bit into the instruction.  */
   1445      1.1     skrll 	  for (i = 0; i < 32; i++)
   1446      1.1     skrll 	    {
   1447      1.1     skrll 	      if (regs[i] == exp.X_add_number)
   1448      1.1     skrll 		{
   1449      1.1     skrll 		  *insn |= (1 << i);
   1450      1.1     skrll 		  break;
   1451      1.1     skrll 		}
   1452      1.1     skrll 	    }
   1453      1.1     skrll 
   1454      1.1     skrll 	  if (i == 32)
   1455  1.1.1.2  christos 	    return _("illegal register included in list");
   1456      1.1     skrll 	}
   1457      1.1     skrll       else if (system_register_name (&exp, TRUE))
   1458      1.1     skrll 	{
   1459      1.1     skrll 	  if (regs == type1_regs)
   1460      1.1     skrll 	    {
   1461      1.1     skrll 	      return _("system registers cannot be included in list");
   1462  1.1.1.2  christos 	    }
   1463  1.1.1.2  christos 	}
   1464      1.1     skrll 
   1465      1.1     skrll       if (*input_line_pointer == '}')
   1466      1.1     skrll 	{
   1467      1.1     skrll 	  input_line_pointer++;
   1468      1.1     skrll 	  break;
   1469      1.1     skrll 	}
   1470      1.1     skrll       else if (*input_line_pointer == ',')
   1471      1.1     skrll 	{
   1472      1.1     skrll 	  input_line_pointer++;
   1473      1.1     skrll 	  continue;
   1474      1.1     skrll 	}
   1475      1.1     skrll       else if (*input_line_pointer == '-')
   1476      1.1     skrll 	{
   1477      1.1     skrll 	  /* We have encountered a range of registers: rX - rY.  */
   1478      1.1     skrll 	  int j;
   1479      1.1     skrll 	  expressionS exp2;
   1480      1.1     skrll 
   1481      1.1     skrll 	  /* Skip the dash.  */
   1482      1.1     skrll 	  ++input_line_pointer;
   1483      1.1     skrll 
   1484      1.1     skrll 	  /* Get the second register in the range.  */
   1485      1.1     skrll 	  if (! register_name (&exp2))
   1486  1.1.1.2  christos 	    {
   1487  1.1.1.2  christos 	      return _("second register should follow dash in register list");
   1488  1.1.1.2  christos 	    }
   1489  1.1.1.2  christos 
   1490  1.1.1.2  christos 	  if (exp.X_add_number > exp2.X_add_number)
   1491      1.1     skrll 	    {
   1492      1.1     skrll 	      return _("second register should be greater than first register");
   1493      1.1     skrll 	    }
   1494      1.1     skrll 
   1495      1.1     skrll 	  /* Add the rest of the registers in the range.  */
   1496      1.1     skrll 	  for (j = exp.X_add_number + 1; j <= exp2.X_add_number; j++)
   1497      1.1     skrll 	    {
   1498      1.1     skrll 	      int i;
   1499      1.1     skrll 
   1500      1.1     skrll 	      /* Locate the given register in the list, and if it is there,
   1501      1.1     skrll 		 insert the corresponding bit into the instruction.  */
   1502      1.1     skrll 	      for (i = 0; i < 32; i++)
   1503      1.1     skrll 		{
   1504      1.1     skrll 		  if (regs[i] == j)
   1505      1.1     skrll 		    {
   1506      1.1     skrll 		      *insn |= (1 << i);
   1507      1.1     skrll 		      break;
   1508      1.1     skrll 		    }
   1509      1.1     skrll 		}
   1510      1.1     skrll 
   1511      1.1     skrll 	      if (i == 32)
   1512  1.1.1.2  christos 		return _("illegal register included in list");
   1513  1.1.1.2  christos 	    }
   1514      1.1     skrll 
   1515      1.1     skrll 	  exp = exp2;
   1516      1.1     skrll 	}
   1517      1.1     skrll       else
   1518      1.1     skrll 	break;
   1519      1.1     skrll     }
   1520      1.1     skrll 
   1521      1.1     skrll   return NULL;
   1522      1.1     skrll }
   1523      1.1     skrll 
   1524      1.1     skrll const char *md_shortopts = "m:";
   1525      1.1     skrll 
   1526  1.1.1.2  christos struct option md_longopts[] =
   1527  1.1.1.2  christos {
   1528  1.1.1.2  christos #define OPTION_DISP_SIZE_DEFAULT_22 (OPTION_MD_BASE)
   1529  1.1.1.2  christos   {"disp-size-default-22", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_22},
   1530      1.1     skrll #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 1)
   1531      1.1     skrll   {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
   1532      1.1     skrll   {NULL, no_argument, NULL, 0}
   1533      1.1     skrll };
   1534      1.1     skrll 
   1535  1.1.1.3  christos size_t md_longopts_size = sizeof (md_longopts);
   1536  1.1.1.3  christos 
   1537      1.1     skrll static bfd_boolean v850_data_8 = FALSE;
   1538      1.1     skrll 
   1539      1.1     skrll void
   1540      1.1     skrll md_show_usage (FILE *stream)
   1541      1.1     skrll {
   1542      1.1     skrll   fprintf (stream, _(" V850 options:\n"));
   1543      1.1     skrll   fprintf (stream, _("  -mwarn-signed-overflow    Warn if signed immediate values overflow\n"));
   1544      1.1     skrll   fprintf (stream, _("  -mwarn-unsigned-overflow  Warn if unsigned immediate values overflow\n"));
   1545      1.1     skrll   fprintf (stream, _("  -mv850                    The code is targeted at the v850\n"));
   1546  1.1.1.2  christos   fprintf (stream, _("  -mv850e                   The code is targeted at the v850e\n"));
   1547  1.1.1.2  christos   fprintf (stream, _("  -mv850e1                  The code is targeted at the v850e1\n"));
   1548  1.1.1.3  christos   fprintf (stream, _("  -mv850e2                  The code is targeted at the v850e2\n"));
   1549  1.1.1.3  christos   fprintf (stream, _("  -mv850e2v3                The code is targeted at the v850e2v3\n"));
   1550      1.1     skrll   fprintf (stream, _("  -mv850e2v4                Alias for -mv850e3v5\n"));
   1551  1.1.1.2  christos   fprintf (stream, _("  -mv850e3v5                The code is targeted at the v850e3v5\n"));
   1552  1.1.1.2  christos   fprintf (stream, _("  -mrelax                   Enable relaxation\n"));
   1553  1.1.1.2  christos   fprintf (stream, _("  --disp-size-default-22    branch displacement with unknown size is 22 bits (default)\n"));
   1554  1.1.1.2  christos   fprintf (stream, _("  --disp-size-default-32    branch displacement with unknown size is 32 bits\n"));
   1555  1.1.1.2  christos   fprintf (stream, _("  -mextension               enable extension opcode support\n"));
   1556  1.1.1.3  christos   fprintf (stream, _("  -mno-bcond17		  disable b<cond> disp17 instruction\n"));
   1557  1.1.1.3  christos   fprintf (stream, _("  -mno-stld23		  disable st/ld offset23 instruction\n"));
   1558  1.1.1.3  christos   fprintf (stream, _("  -mgcc-abi                 Mark the binary as using the old GCC ABI\n"));
   1559  1.1.1.3  christos   fprintf (stream, _("  -mrh850-abi               Mark the binary as using the RH850 ABI (default)\n"));
   1560  1.1.1.3  christos   fprintf (stream, _("  -m8byte-align             Mark the binary as using 64-bit alignment\n"));
   1561  1.1.1.3  christos   fprintf (stream, _("  -m4byte-align             Mark the binary as using 32-bit alignment (default)\n"));
   1562      1.1     skrll   fprintf (stream, _("  -msoft-float              Mark the binary as not using FP insns (default for pre e2v3)\n"));
   1563      1.1     skrll   fprintf (stream, _("  -mhard-float              Mark the binary as using FP insns (default for e2v3 and up)\n"));
   1564      1.1     skrll }
   1565  1.1.1.4  christos 
   1566      1.1     skrll int
   1567      1.1     skrll md_parse_option (int c, const char *arg)
   1568  1.1.1.2  christos {
   1569  1.1.1.2  christos   if (c != 'm')
   1570  1.1.1.2  christos     {
   1571  1.1.1.2  christos       switch (c)
   1572  1.1.1.2  christos         {
   1573  1.1.1.2  christos         case OPTION_DISP_SIZE_DEFAULT_22:
   1574  1.1.1.2  christos           default_disp_size = 22;
   1575  1.1.1.2  christos           return 1;
   1576  1.1.1.2  christos 
   1577  1.1.1.2  christos         case OPTION_DISP_SIZE_DEFAULT_32:
   1578  1.1.1.2  christos           default_disp_size = 32;
   1579  1.1.1.2  christos           return 1;
   1580  1.1.1.2  christos         }
   1581      1.1     skrll       return 0;
   1582      1.1     skrll     }
   1583      1.1     skrll 
   1584      1.1     skrll   if (strcmp (arg, "warn-signed-overflow") == 0)
   1585      1.1     skrll     warn_signed_overflows = TRUE;
   1586      1.1     skrll 
   1587      1.1     skrll   else if (strcmp (arg, "warn-unsigned-overflow") == 0)
   1588      1.1     skrll     warn_unsigned_overflows = TRUE;
   1589      1.1     skrll 
   1590      1.1     skrll   else if (strcmp (arg, "v850") == 0)
   1591  1.1.1.2  christos     {
   1592      1.1     skrll       machine = 0;
   1593      1.1     skrll       SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);
   1594      1.1     skrll     }
   1595      1.1     skrll   else if (strcmp (arg, "v850e") == 0)
   1596  1.1.1.2  christos     {
   1597      1.1     skrll       machine = bfd_mach_v850e;
   1598      1.1     skrll       SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);
   1599      1.1     skrll     }
   1600      1.1     skrll   else if (strcmp (arg, "v850e1") == 0)
   1601  1.1.1.2  christos     {
   1602      1.1     skrll       machine = bfd_mach_v850e1;
   1603  1.1.1.2  christos       SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E1);
   1604      1.1     skrll     }
   1605  1.1.1.2  christos   else if (strcmp (arg, "v850e2") == 0)
   1606  1.1.1.2  christos     {
   1607  1.1.1.2  christos       machine = bfd_mach_v850e2;
   1608  1.1.1.2  christos       SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2);
   1609  1.1.1.2  christos     }
   1610  1.1.1.2  christos   else if (strcmp (arg, "v850e2v3") == 0)
   1611  1.1.1.2  christos     {
   1612  1.1.1.2  christos       machine = bfd_mach_v850e2v3;
   1613  1.1.1.3  christos       SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3);
   1614  1.1.1.3  christos     }
   1615  1.1.1.3  christos   else if (strcmp (arg, "v850e2v4") == 0)
   1616  1.1.1.3  christos     {
   1617  1.1.1.3  christos       machine = bfd_mach_v850e3v5;
   1618  1.1.1.3  christos       SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
   1619  1.1.1.3  christos     }
   1620  1.1.1.3  christos   else if (strcmp (arg, "v850e3v5") == 0)
   1621  1.1.1.3  christos     {
   1622  1.1.1.3  christos       machine = bfd_mach_v850e3v5;
   1623  1.1.1.2  christos       SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
   1624  1.1.1.2  christos     }
   1625  1.1.1.3  christos   else if (strcmp (arg, "extension") == 0)
   1626  1.1.1.2  christos     {
   1627  1.1.1.2  christos       processor_mask |= PROCESSOR_OPTION_EXTENSION | PROCESSOR_OPTION_ALIAS;
   1628  1.1.1.2  christos     }
   1629  1.1.1.2  christos   else if (strcmp (arg, "no-bcond17") == 0)
   1630  1.1.1.2  christos     {
   1631  1.1.1.2  christos       no_bcond17 = 1;
   1632  1.1.1.2  christos     }
   1633  1.1.1.2  christos   else if (strcmp (arg, "no-stld23") == 0)
   1634      1.1     skrll     {
   1635      1.1     skrll       no_stld23 = 1;
   1636      1.1     skrll     }
   1637  1.1.1.3  christos   else if (strcmp (arg, "relax") == 0)
   1638  1.1.1.3  christos     v850_relax = 1;
   1639  1.1.1.3  christos   else if (strcmp (arg, "gcc-abi") == 0)
   1640  1.1.1.3  christos     {
   1641  1.1.1.3  christos       v850_target_arch = bfd_arch_v850;
   1642  1.1.1.3  christos       v850_target_format = "elf32-v850";
   1643  1.1.1.3  christos     }
   1644  1.1.1.3  christos   else if (strcmp (arg, "rh850-abi") == 0)
   1645  1.1.1.3  christos     {
   1646  1.1.1.3  christos       v850_target_arch = bfd_arch_v850_rh850;
   1647  1.1.1.3  christos       v850_target_format = "elf32-v850-rh850";
   1648  1.1.1.3  christos     }
   1649  1.1.1.3  christos   else if (strcmp (arg, "8byte-align") == 0)
   1650  1.1.1.3  christos     {
   1651  1.1.1.3  christos       v850_data_8 = TRUE;
   1652  1.1.1.3  christos       v850_e_flags |= EF_RH850_DATA_ALIGN8;
   1653  1.1.1.3  christos     }
   1654  1.1.1.3  christos   else if (strcmp (arg, "4byte-align") == 0)
   1655  1.1.1.3  christos     {
   1656  1.1.1.3  christos       v850_data_8 = FALSE;
   1657  1.1.1.3  christos       v850_e_flags &= ~ EF_RH850_DATA_ALIGN8;
   1658  1.1.1.3  christos     }
   1659  1.1.1.3  christos   else if (strcmp (arg, "soft-float") == 0)
   1660  1.1.1.3  christos     soft_float = 1;
   1661      1.1     skrll   else if (strcmp (arg, "hard-float") == 0)
   1662      1.1     skrll     soft_float = 0;
   1663      1.1     skrll   else
   1664      1.1     skrll     return 0;
   1665      1.1     skrll 
   1666      1.1     skrll   return 1;
   1667      1.1     skrll }
   1668      1.1     skrll 
   1669      1.1     skrll symbolS *
   1670      1.1     skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   1671      1.1     skrll {
   1672      1.1     skrll   return 0;
   1673  1.1.1.4  christos }
   1674      1.1     skrll 
   1675      1.1     skrll const char *
   1676      1.1     skrll md_atof (int type, char *litp, int *sizep)
   1677      1.1     skrll {
   1678      1.1     skrll   return ieee_md_atof (type, litp, sizep, FALSE);
   1679      1.1     skrll }
   1680      1.1     skrll 
   1681      1.1     skrll /* Very gross.  */
   1682      1.1     skrll 
   1683      1.1     skrll void
   1684      1.1     skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
   1685      1.1     skrll 		 asection *sec,
   1686      1.1     skrll 		 fragS *fragP)
   1687      1.1     skrll {
   1688      1.1     skrll   union u
   1689      1.1     skrll   {
   1690      1.1     skrll     bfd_reloc_code_real_type fx_r_type;
   1691      1.1     skrll     char * fr_opcode;
   1692      1.1     skrll   }
   1693      1.1     skrll   opcode_converter;
   1694      1.1     skrll   subseg_change (sec, 0);
   1695  1.1.1.2  christos 
   1696  1.1.1.2  christos   opcode_converter.fr_opcode = fragP->fr_opcode;
   1697  1.1.1.2  christos 
   1698  1.1.1.3  christos   subseg_change (sec, 0);
   1699  1.1.1.3  christos 
   1700  1.1.1.3  christos   if (fragP->fr_subtype == SUBYPTE_LOOP_16_22)
   1701  1.1.1.3  christos     {
   1702  1.1.1.3  christos       fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
   1703  1.1.1.3  christos 	       fragP->fr_offset, 1,
   1704  1.1.1.3  christos 	       BFD_RELOC_UNUSED + opcode_converter.fx_r_type);
   1705  1.1.1.3  christos       fragP->fr_fix += 4;
   1706  1.1.1.3  christos     }
   1707  1.1.1.3  christos   else if (fragP->fr_subtype == SUBYPTE_LOOP_16_22 + 1)
   1708  1.1.1.3  christos     {
   1709  1.1.1.3  christos       unsigned char * buffer =
   1710  1.1.1.3  christos 	(unsigned char *) (fragP->fr_fix + fragP->fr_literal);
   1711  1.1.1.3  christos       int loop_reg = (buffer[0] & 0x1f);
   1712  1.1.1.3  christos 
   1713  1.1.1.3  christos       /* Add -1.reg.  */
   1714  1.1.1.3  christos       md_number_to_chars ((char *) buffer, 0x025f | (loop_reg << 11), 2);
   1715  1.1.1.3  christos       /* Now create the conditional branch + fixup to the final target.  */
   1716  1.1.1.3  christos       /* 0x000107ea = bne LBL(disp17).  */
   1717  1.1.1.3  christos       md_number_to_chars ((char *) buffer + 2, 0x000107ea, 4);
   1718  1.1.1.3  christos       fix_new (fragP, fragP->fr_fix+2, 4, fragP->fr_symbol,
   1719  1.1.1.3  christos 	       fragP->fr_offset, 1,
   1720  1.1.1.3  christos 	       BFD_RELOC_V850_17_PCREL);
   1721      1.1     skrll       fragP->fr_fix += 6;
   1722  1.1.1.3  christos     }
   1723  1.1.1.2  christos   /* In range conditional or unconditional branch.  */
   1724  1.1.1.2  christos   else if (fragP->fr_subtype == SUBYPTE_COND_9_22
   1725  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_UNCOND_9_22
   1726  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_COND_9_22_32
   1727  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32
   1728  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_COND_9_17_22
   1729  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32
   1730  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_SA_9_22
   1731  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_SA_9_22_32
   1732  1.1.1.2  christos       || fragP->fr_subtype == SUBYPTE_SA_9_17_22
   1733      1.1     skrll       || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32)
   1734      1.1     skrll 
   1735      1.1     skrll     {
   1736      1.1     skrll       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
   1737      1.1     skrll 	       fragP->fr_offset, 1,
   1738      1.1     skrll 	       BFD_RELOC_UNUSED + opcode_converter.fx_r_type);
   1739  1.1.1.2  christos       fragP->fr_fix += 2;
   1740  1.1.1.2  christos     }
   1741  1.1.1.2  christos   /* V850e2r-v3 17bit conditional branch.  */
   1742  1.1.1.2  christos   else if (fragP->fr_subtype == SUBYPTE_COND_9_17_22 + 1
   1743  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 1
   1744  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_SA_9_17_22 + 1
   1745  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 1)
   1746  1.1.1.2  christos     {
   1747  1.1.1.2  christos       unsigned char *buffer =
   1748  1.1.1.2  christos 	(unsigned char *) (fragP->fr_fix + fragP->fr_literal);
   1749  1.1.1.2  christos 
   1750  1.1.1.2  christos       buffer[0] &= 0x0f;	/* Use condition.  */
   1751  1.1.1.2  christos       buffer[0] |= 0xe0;
   1752  1.1.1.2  christos       buffer[1] = 0x07;
   1753  1.1.1.2  christos 
   1754  1.1.1.2  christos       /* Now create the unconditional branch + fixup to the final
   1755  1.1.1.2  christos 	 target.  */
   1756  1.1.1.2  christos       md_number_to_chars ((char *) buffer + 2, 0x0001, 2);
   1757  1.1.1.2  christos       fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
   1758  1.1.1.2  christos 	       fragP->fr_offset, 1, BFD_RELOC_V850_17_PCREL);
   1759  1.1.1.2  christos       fragP->fr_fix += 4;
   1760  1.1.1.2  christos     }
   1761  1.1.1.2  christos   /* Out of range conditional branch.  Emit a branch around a 22bit jump.  */
   1762  1.1.1.3  christos   else if (fragP->fr_subtype == SUBYPTE_COND_9_22 + 1
   1763  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_COND_9_22_32 + 1
   1764      1.1     skrll 	   || fragP->fr_subtype == SUBYPTE_COND_9_17_22 + 2
   1765      1.1     skrll 	   || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 2)
   1766      1.1     skrll     {
   1767      1.1     skrll       unsigned char *buffer =
   1768      1.1     skrll 	(unsigned char *) (fragP->fr_fix + fragP->fr_literal);
   1769      1.1     skrll 
   1770      1.1     skrll       /* Reverse the condition of the first branch.  */
   1771      1.1     skrll       buffer[0] ^= 0x08;
   1772      1.1     skrll       /* Mask off all the displacement bits.  */
   1773      1.1     skrll       buffer[0] &= 0x8f;
   1774      1.1     skrll       buffer[1] &= 0x07;
   1775      1.1     skrll       /* Now set the displacement bits so that we branch
   1776      1.1     skrll 	 around the unconditional branch.  */
   1777      1.1     skrll       buffer[0] |= 0x30;
   1778      1.1     skrll 
   1779      1.1     skrll       /* Now create the unconditional branch + fixup to the final
   1780      1.1     skrll 	 target.  */
   1781  1.1.1.2  christos       md_number_to_chars ((char *) buffer + 2, 0x00000780, 4);
   1782      1.1     skrll       fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
   1783      1.1     skrll 	       fragP->fr_offset, 1, BFD_RELOC_V850_22_PCREL);
   1784  1.1.1.2  christos       fragP->fr_fix += 6;
   1785  1.1.1.2  christos     }
   1786  1.1.1.2  christos   /* Out of range conditional branch.  Emit a branch around a 32bit jump.  */
   1787  1.1.1.2  christos   else if (fragP->fr_subtype == SUBYPTE_COND_9_22_32 + 2
   1788  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 3)
   1789  1.1.1.2  christos     {
   1790  1.1.1.2  christos       unsigned char *buffer =
   1791  1.1.1.2  christos 	(unsigned char *) (fragP->fr_fix + fragP->fr_literal);
   1792  1.1.1.2  christos 
   1793  1.1.1.2  christos       /* Reverse the condition of the first branch.  */
   1794  1.1.1.2  christos       buffer[0] ^= 0x08;
   1795  1.1.1.2  christos       /* Mask off all the displacement bits.  */
   1796  1.1.1.2  christos       buffer[0] &= 0x8f;
   1797  1.1.1.2  christos       buffer[1] &= 0x07;
   1798  1.1.1.2  christos       /* Now set the displacement bits so that we branch
   1799  1.1.1.2  christos 	 around the unconditional branch.  */
   1800  1.1.1.2  christos       buffer[0] |= 0x40;
   1801  1.1.1.2  christos 
   1802  1.1.1.2  christos       /* Now create the unconditional branch + fixup to the final
   1803  1.1.1.2  christos 	 target.  */
   1804  1.1.1.2  christos       md_number_to_chars ((char *) buffer + 2, 0x02e0, 2);
   1805  1.1.1.2  christos       fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
   1806  1.1.1.2  christos 	       fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
   1807  1.1.1.2  christos       fragP->fr_fix += 8;
   1808  1.1.1.2  christos     }
   1809  1.1.1.2  christos   /* Out of range unconditional branch.  Emit a 22bit jump.  */
   1810      1.1     skrll   else if (fragP->fr_subtype == SUBYPTE_UNCOND_9_22 + 1
   1811      1.1     skrll 	   || fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32 + 1)
   1812      1.1     skrll     {
   1813  1.1.1.2  christos       md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x00000780, 4);
   1814      1.1     skrll       fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
   1815      1.1     skrll 	       fragP->fr_offset, 1, BFD_RELOC_V850_22_PCREL);
   1816  1.1.1.2  christos       fragP->fr_fix += 4;
   1817  1.1.1.2  christos     }
   1818  1.1.1.2  christos   /* Out of range unconditional branch.  Emit a 32bit jump.  */
   1819  1.1.1.2  christos   else if (fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32 + 2)
   1820  1.1.1.2  christos     {
   1821  1.1.1.2  christos       md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x02e0, 2);
   1822  1.1.1.2  christos       fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
   1823  1.1.1.2  christos 	       fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
   1824  1.1.1.2  christos       fragP->fr_fix += 6;
   1825  1.1.1.2  christos     }
   1826  1.1.1.2  christos   /* Out of range SA conditional branch.  Emit a branch to a 22bit jump.  */
   1827  1.1.1.2  christos   else if (fragP->fr_subtype == SUBYPTE_SA_9_22 + 1
   1828  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_SA_9_22_32 + 1
   1829  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_SA_9_17_22 + 2
   1830  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 2)
   1831  1.1.1.2  christos     {
   1832  1.1.1.2  christos       unsigned char *buffer =
   1833  1.1.1.2  christos 	(unsigned char *) (fragP->fr_fix + fragP->fr_literal);
   1834  1.1.1.2  christos 
   1835  1.1.1.2  christos       /* bsa .+4 */
   1836  1.1.1.2  christos       buffer[0] &= 0x8f;
   1837  1.1.1.2  christos       buffer[0] |= 0x20;
   1838  1.1.1.2  christos       buffer[1] &= 0x07;
   1839  1.1.1.2  christos 
   1840  1.1.1.2  christos       /* br .+6 */
   1841  1.1.1.2  christos       md_number_to_chars ((char *) buffer + 2, 0x05b5, 2);
   1842  1.1.1.2  christos 
   1843  1.1.1.2  christos       /* Now create the unconditional branch + fixup to the final
   1844  1.1.1.2  christos 	 target.  */
   1845  1.1.1.2  christos       /* jr SYM */
   1846  1.1.1.2  christos       md_number_to_chars ((char *) buffer + 4, 0x00000780, 4);
   1847  1.1.1.2  christos       fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
   1848  1.1.1.2  christos 	       fragP->fr_offset, 1,
   1849  1.1.1.2  christos 	       BFD_RELOC_V850_22_PCREL);
   1850  1.1.1.2  christos       fragP->fr_fix += 8;
   1851  1.1.1.2  christos     }
   1852  1.1.1.2  christos   /* Out of range SA conditional branch.  Emit a branch around a 32bit jump.  */
   1853  1.1.1.2  christos   else if (fragP->fr_subtype == SUBYPTE_SA_9_22_32 + 2
   1854  1.1.1.2  christos 	   || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 3)
   1855  1.1.1.2  christos     {
   1856  1.1.1.2  christos       unsigned char *buffer =
   1857  1.1.1.2  christos 	(unsigned char *) (fragP->fr_fix + fragP->fr_literal);
   1858  1.1.1.2  christos 
   1859  1.1.1.2  christos       /* bsa .+2 */
   1860  1.1.1.2  christos       buffer[0] &= 0x8f;
   1861  1.1.1.2  christos       buffer[0] |= 0x20;
   1862  1.1.1.2  christos       buffer[1] &= 0x07;
   1863  1.1.1.2  christos 
   1864  1.1.1.2  christos       /* br .+8 */
   1865  1.1.1.2  christos       md_number_to_chars ((char *) buffer + 2, 0x05c5, 2);
   1866  1.1.1.2  christos 
   1867  1.1.1.2  christos       /* Now create the unconditional branch + fixup to the final
   1868  1.1.1.2  christos 	 target.  */
   1869  1.1.1.2  christos       /* jr SYM */
   1870  1.1.1.2  christos       md_number_to_chars ((char *) buffer + 4, 0x02e0, 2);
   1871  1.1.1.2  christos       fix_new (fragP, fragP->fr_fix + 6, 4, fragP->fr_symbol,
   1872  1.1.1.2  christos 	       fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
   1873  1.1.1.2  christos 
   1874      1.1     skrll       fragP->fr_fix += 10;
   1875      1.1     skrll     }
   1876      1.1     skrll   else
   1877      1.1     skrll     abort ();
   1878      1.1     skrll }
   1879      1.1     skrll 
   1880      1.1     skrll valueT
   1881  1.1.1.6  christos md_section_align (asection *seg, valueT addr)
   1882  1.1.1.3  christos {
   1883      1.1     skrll   int align = bfd_section_alignment (seg);
   1884      1.1     skrll   return ((addr + (1 << align) - 1) & -(1 << align));
   1885      1.1     skrll }
   1886      1.1     skrll 
   1887      1.1     skrll void
   1888  1.1.1.4  christos md_begin (void)
   1889      1.1     skrll {
   1890      1.1     skrll   const char *prev_name = "";
   1891  1.1.1.3  christos   const struct v850_opcode *op;
   1892  1.1.1.3  christos 
   1893  1.1.1.3  christos   if (strncmp (TARGET_CPU, "v850e3v5", 8) == 0)
   1894  1.1.1.3  christos     {
   1895  1.1.1.3  christos       if (machine == -1)
   1896  1.1.1.3  christos 	machine = bfd_mach_v850e3v5;
   1897  1.1.1.3  christos 
   1898  1.1.1.3  christos       if (!processor_mask)
   1899  1.1.1.3  christos 	SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
   1900  1.1.1.3  christos     }
   1901  1.1.1.3  christos   else if (strncmp (TARGET_CPU, "v850e2v4", 8) == 0)
   1902  1.1.1.3  christos     {
   1903  1.1.1.3  christos       if (machine == -1)
   1904  1.1.1.3  christos 	machine = bfd_mach_v850e3v5;
   1905  1.1.1.3  christos 
   1906  1.1.1.3  christos       if (!processor_mask)
   1907  1.1.1.3  christos 	SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
   1908  1.1.1.2  christos     }
   1909  1.1.1.2  christos   else if (strncmp (TARGET_CPU, "v850e2v3", 8) == 0)
   1910  1.1.1.2  christos     {
   1911  1.1.1.2  christos       if (machine == -1)
   1912  1.1.1.2  christos         machine = bfd_mach_v850e2v3;
   1913  1.1.1.2  christos 
   1914  1.1.1.2  christos       if (!processor_mask)
   1915  1.1.1.2  christos         SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3);
   1916  1.1.1.2  christos     }
   1917  1.1.1.2  christos   else if (strncmp (TARGET_CPU, "v850e2", 6) == 0)
   1918  1.1.1.2  christos     {
   1919  1.1.1.2  christos       if (machine == -1)
   1920  1.1.1.2  christos 	machine = bfd_mach_v850e2;
   1921  1.1.1.2  christos 
   1922  1.1.1.2  christos       if (!processor_mask)
   1923  1.1.1.2  christos 	SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2);
   1924      1.1     skrll     }
   1925      1.1     skrll   else if (strncmp (TARGET_CPU, "v850e1", 6) == 0)
   1926  1.1.1.2  christos     {
   1927      1.1     skrll       if (machine == -1)
   1928  1.1.1.2  christos         machine = bfd_mach_v850e1;
   1929  1.1.1.2  christos 
   1930      1.1     skrll       if (!processor_mask)
   1931      1.1     skrll         SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E1);
   1932      1.1     skrll     }
   1933      1.1     skrll   else if (strncmp (TARGET_CPU, "v850e", 5) == 0)
   1934      1.1     skrll     {
   1935      1.1     skrll       if (machine == -1)
   1936  1.1.1.2  christos 	machine = bfd_mach_v850e;
   1937  1.1.1.2  christos 
   1938      1.1     skrll       if (!processor_mask)
   1939      1.1     skrll 	SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);
   1940      1.1     skrll     }
   1941      1.1     skrll   else if (strncmp (TARGET_CPU, "v850", 4) == 0)
   1942      1.1     skrll     {
   1943      1.1     skrll       if (machine == -1)
   1944  1.1.1.2  christos 	machine = 0;
   1945  1.1.1.2  christos 
   1946      1.1     skrll       if (!processor_mask)
   1947      1.1     skrll 	SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);
   1948      1.1     skrll     }
   1949      1.1     skrll   else
   1950      1.1     skrll     /* xgettext:c-format  */
   1951      1.1     skrll     as_bad (_("Unable to determine default target processor from string: %s"),
   1952  1.1.1.3  christos 	    TARGET_CPU);
   1953  1.1.1.3  christos 
   1954  1.1.1.3  christos   if (soft_float == -1)
   1955      1.1     skrll     soft_float = machine < bfd_mach_v850e2v3;
   1956      1.1     skrll 
   1957      1.1     skrll   v850_hash = hash_new ();
   1958      1.1     skrll 
   1959      1.1     skrll   /* Insert unique names into hash table.  The V850 instruction set
   1960      1.1     skrll      has many identical opcode names that have different opcodes based
   1961      1.1     skrll      on the operands.  This hash table then provides a quick index to
   1962      1.1     skrll      the first opcode with a particular name in the opcode table.  */
   1963      1.1     skrll   op = v850_opcodes;
   1964      1.1     skrll   while (op->name)
   1965      1.1     skrll     {
   1966      1.1     skrll       if (strcmp (prev_name, op->name))
   1967      1.1     skrll 	{
   1968      1.1     skrll 	  prev_name = (char *) op->name;
   1969      1.1     skrll 	  hash_insert (v850_hash, op->name, (char *) op);
   1970      1.1     skrll 	}
   1971      1.1     skrll       op++;
   1972      1.1     skrll     }
   1973  1.1.1.3  christos 
   1974  1.1.1.3  christos   v850_seg_table[BSS_SECTION].s = bss_section;
   1975      1.1     skrll   bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
   1976      1.1     skrll   bfd_set_private_flags (stdoutput, v850_e_flags);
   1977  1.1.1.2  christos }
   1978      1.1     skrll 
   1979  1.1.1.2  christos 
   1980      1.1     skrll static bfd_reloc_code_real_type
   1981  1.1.1.2  christos handle_hi016 (const struct v850_operand *operand, const char **errmsg)
   1982  1.1.1.2  christos {
   1983      1.1     skrll   if (operand == NULL)
   1984  1.1.1.2  christos     return BFD_RELOC_HI16;
   1985  1.1.1.2  christos 
   1986  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_HI16)
   1987  1.1.1.2  christos     return BFD_RELOC_HI16;
   1988  1.1.1.2  christos 
   1989  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_HI16_S)
   1990  1.1.1.2  christos     return BFD_RELOC_HI16;
   1991  1.1.1.2  christos 
   1992  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_16)
   1993  1.1.1.2  christos     return BFD_RELOC_HI16;
   1994  1.1.1.2  christos 
   1995  1.1.1.2  christos   *errmsg = _("hi0() relocation used on an instruction which does "
   1996  1.1.1.2  christos 	      "not support it");
   1997  1.1.1.2  christos   return BFD_RELOC_64;  /* Used to indicate an error condition.  */
   1998  1.1.1.2  christos }
   1999  1.1.1.2  christos 
   2000  1.1.1.2  christos static bfd_reloc_code_real_type
   2001  1.1.1.2  christos handle_hi16 (const struct v850_operand *operand, const char **errmsg)
   2002  1.1.1.2  christos {
   2003  1.1.1.2  christos   if (operand == NULL)
   2004  1.1.1.2  christos     return BFD_RELOC_HI16_S;
   2005  1.1.1.2  christos 
   2006  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_HI16_S)
   2007  1.1.1.2  christos     return BFD_RELOC_HI16_S;
   2008  1.1.1.2  christos 
   2009  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_HI16)
   2010  1.1.1.2  christos     return BFD_RELOC_HI16_S;
   2011  1.1.1.2  christos 
   2012  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_16)
   2013  1.1.1.2  christos     return BFD_RELOC_HI16_S;
   2014  1.1.1.2  christos 
   2015  1.1.1.2  christos   *errmsg = _("hi() relocation used on an instruction which does "
   2016  1.1.1.2  christos 	      "not support it");
   2017  1.1.1.2  christos   return BFD_RELOC_64;  /* Used to indicate an error condition.  */
   2018  1.1.1.2  christos }
   2019  1.1.1.2  christos 
   2020  1.1.1.2  christos static bfd_reloc_code_real_type
   2021  1.1.1.2  christos handle_lo16 (const struct v850_operand *operand, const char **errmsg)
   2022  1.1.1.2  christos {
   2023  1.1.1.2  christos   if (operand == NULL)
   2024  1.1.1.2  christos     return BFD_RELOC_LO16;
   2025  1.1.1.2  christos 
   2026  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_LO16)
   2027  1.1.1.2  christos     return BFD_RELOC_LO16;
   2028  1.1.1.2  christos 
   2029  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
   2030  1.1.1.2  christos     return BFD_RELOC_V850_LO16_SPLIT_OFFSET;
   2031  1.1.1.2  christos 
   2032  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_V850_16_S1)
   2033  1.1.1.2  christos     return BFD_RELOC_V850_LO16_S1;
   2034  1.1.1.2  christos 
   2035  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_16)
   2036  1.1.1.2  christos     return BFD_RELOC_LO16;
   2037  1.1.1.2  christos 
   2038  1.1.1.2  christos   *errmsg = _("lo() relocation used on an instruction which does "
   2039      1.1     skrll 	      "not support it");
   2040      1.1     skrll   return BFD_RELOC_64;  /* Used to indicate an error condition.  */
   2041      1.1     skrll }
   2042  1.1.1.2  christos 
   2043      1.1     skrll static bfd_reloc_code_real_type
   2044  1.1.1.3  christos handle_ctoff (const struct v850_operand *operand, const char **errmsg)
   2045  1.1.1.3  christos {
   2046  1.1.1.3  christos   if (v850_target_arch == bfd_arch_v850_rh850)
   2047  1.1.1.3  christos     {
   2048  1.1.1.3  christos       *errmsg = _("ctoff() is not supported by the rh850 ABI. Use -mgcc-abi instead");
   2049  1.1.1.3  christos       return BFD_RELOC_64;  /* Used to indicate an error condition.  */
   2050      1.1     skrll     }
   2051      1.1     skrll 
   2052      1.1     skrll   if (operand == NULL)
   2053  1.1.1.2  christos     return BFD_RELOC_V850_CALLT_16_16_OFFSET;
   2054  1.1.1.2  christos 
   2055  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_V850_CALLT_6_7_OFFSET)
   2056  1.1.1.2  christos     return operand->default_reloc;
   2057  1.1.1.2  christos 
   2058  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_V850_16_S1)
   2059  1.1.1.2  christos     return BFD_RELOC_V850_CALLT_15_16_OFFSET;
   2060  1.1.1.2  christos 
   2061      1.1     skrll   if (operand->default_reloc == BFD_RELOC_16)
   2062  1.1.1.2  christos     return BFD_RELOC_V850_CALLT_16_16_OFFSET;
   2063  1.1.1.2  christos 
   2064      1.1     skrll   *errmsg = _("ctoff() relocation used on an instruction which does not support it");
   2065      1.1     skrll   return BFD_RELOC_64;  /* Used to indicate an error condition.  */
   2066      1.1     skrll }
   2067  1.1.1.2  christos 
   2068      1.1     skrll static bfd_reloc_code_real_type
   2069      1.1     skrll handle_sdaoff (const struct v850_operand *operand, const char **errmsg)
   2070      1.1     skrll {
   2071      1.1     skrll   if (operand == NULL)
   2072  1.1.1.2  christos     return BFD_RELOC_V850_SDA_16_16_OFFSET;
   2073      1.1     skrll 
   2074      1.1     skrll   if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
   2075  1.1.1.2  christos     return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET;
   2076  1.1.1.2  christos 
   2077  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_16)
   2078  1.1.1.2  christos     return BFD_RELOC_V850_SDA_16_16_OFFSET;
   2079  1.1.1.2  christos 
   2080      1.1     skrll   if (operand->default_reloc == BFD_RELOC_V850_16_S1)
   2081  1.1.1.2  christos     return BFD_RELOC_V850_SDA_15_16_OFFSET;
   2082  1.1.1.2  christos 
   2083      1.1     skrll   *errmsg = _("sdaoff() relocation used on an instruction which does not support it");
   2084      1.1     skrll   return BFD_RELOC_64;  /* Used to indicate an error condition.  */
   2085      1.1     skrll }
   2086  1.1.1.2  christos 
   2087      1.1     skrll static bfd_reloc_code_real_type
   2088      1.1     skrll handle_zdaoff (const struct v850_operand *operand, const char **errmsg)
   2089      1.1     skrll {
   2090      1.1     skrll   if (operand == NULL)
   2091  1.1.1.2  christos     return BFD_RELOC_V850_ZDA_16_16_OFFSET;
   2092      1.1     skrll 
   2093      1.1     skrll   if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
   2094  1.1.1.2  christos     return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET;
   2095  1.1.1.2  christos 
   2096      1.1     skrll   if (operand->default_reloc == BFD_RELOC_16)
   2097  1.1.1.2  christos     return BFD_RELOC_V850_ZDA_16_16_OFFSET;
   2098  1.1.1.2  christos 
   2099  1.1.1.2  christos   if (operand->default_reloc == BFD_RELOC_V850_16_S1)
   2100  1.1.1.2  christos     return BFD_RELOC_V850_ZDA_15_16_OFFSET;
   2101  1.1.1.2  christos 
   2102      1.1     skrll   *errmsg = _("zdaoff() relocation used on an instruction which does not support it");
   2103      1.1     skrll   return BFD_RELOC_64;  /* Used to indicate an error condition.  */
   2104      1.1     skrll }
   2105  1.1.1.2  christos 
   2106      1.1     skrll static bfd_reloc_code_real_type
   2107      1.1     skrll handle_tdaoff (const struct v850_operand *operand, const char **errmsg)
   2108      1.1     skrll {
   2109  1.1.1.2  christos   if (operand == NULL)
   2110      1.1     skrll     /* Data item, not an instruction.  */
   2111  1.1.1.2  christos     return BFD_RELOC_V850_TDA_16_16_OFFSET;
   2112  1.1.1.2  christos 
   2113  1.1.1.2  christos   switch (operand->default_reloc)
   2114  1.1.1.2  christos     {
   2115  1.1.1.2  christos       /* sld.hu, operand: D5-4.  */
   2116  1.1.1.2  christos     case BFD_RELOC_V850_TDA_4_5_OFFSET:
   2117      1.1     skrll       /* sld.bu, operand: D4.  */
   2118  1.1.1.2  christos     case BFD_RELOC_V850_TDA_4_4_OFFSET:
   2119  1.1.1.2  christos     /* sld.w/sst.w, operand: D8_6.  */
   2120  1.1.1.2  christos     case BFD_RELOC_V850_TDA_6_8_OFFSET:
   2121  1.1.1.2  christos     /* sld.h/sst.h, operand: D8_7.  */
   2122  1.1.1.2  christos     case BFD_RELOC_V850_TDA_7_8_OFFSET:
   2123  1.1.1.2  christos       /* sld.b/sst.b, operand: D7.  */
   2124  1.1.1.2  christos     case BFD_RELOC_V850_TDA_7_7_OFFSET:
   2125  1.1.1.2  christos       return operand->default_reloc;
   2126  1.1.1.2  christos     default:
   2127      1.1     skrll       break;
   2128  1.1.1.2  christos     }
   2129      1.1     skrll 
   2130      1.1     skrll   if (operand->default_reloc == BFD_RELOC_16 && operand->shift == 16)
   2131      1.1     skrll     /* set1 & chums, operands: D16.  */
   2132  1.1.1.2  christos     return BFD_RELOC_V850_TDA_16_16_OFFSET;
   2133  1.1.1.2  christos 
   2134  1.1.1.2  christos   *errmsg = _("tdaoff() relocation used on an instruction which does not support it");
   2135      1.1     skrll   /* Used to indicate an error condition.  */
   2136      1.1     skrll   return BFD_RELOC_64;
   2137      1.1     skrll }
   2138      1.1     skrll 
   2139      1.1     skrll /* Warning: The code in this function relies upon the definitions
   2140      1.1     skrll    in the v850_operands[] array (defined in opcodes/v850-opc.c)
   2141      1.1     skrll    matching the hard coded values contained herein.  */
   2142  1.1.1.2  christos 
   2143      1.1     skrll static bfd_reloc_code_real_type
   2144      1.1     skrll v850_reloc_prefix (const struct v850_operand *operand, const char **errmsg)
   2145      1.1     skrll {
   2146      1.1     skrll   bfd_boolean paren_skipped = FALSE;
   2147      1.1     skrll 
   2148      1.1     skrll   /* Skip leading opening parenthesis.  */
   2149      1.1     skrll   if (*input_line_pointer == '(')
   2150      1.1     skrll     {
   2151      1.1     skrll       ++input_line_pointer;
   2152      1.1     skrll       paren_skipped = TRUE;
   2153      1.1     skrll     }
   2154      1.1     skrll 
   2155      1.1     skrll #define CHECK_(name, reloc) 						\
   2156      1.1     skrll   if (strncmp (input_line_pointer, name "(", strlen (name) + 1) == 0)	\
   2157      1.1     skrll     {									\
   2158      1.1     skrll       input_line_pointer += strlen (name);				\
   2159      1.1     skrll       return reloc;							\
   2160  1.1.1.2  christos     }
   2161  1.1.1.2  christos 
   2162  1.1.1.2  christos   CHECK_ ("hi0",    handle_hi016(operand, errmsg)  );
   2163  1.1.1.2  christos   CHECK_ ("hi",	    handle_hi16(operand, errmsg)   );
   2164  1.1.1.2  christos   CHECK_ ("lo",	    handle_lo16 (operand, errmsg)  );
   2165  1.1.1.2  christos   CHECK_ ("sdaoff", handle_sdaoff (operand, errmsg));
   2166  1.1.1.2  christos   CHECK_ ("zdaoff", handle_zdaoff (operand, errmsg));
   2167  1.1.1.2  christos   CHECK_ ("tdaoff", handle_tdaoff (operand, errmsg));
   2168  1.1.1.2  christos   CHECK_ ("hilo",   BFD_RELOC_32);
   2169      1.1     skrll   CHECK_ ("lo23",   BFD_RELOC_V850_23);
   2170      1.1     skrll   CHECK_ ("ctoff",  handle_ctoff (operand, errmsg) );
   2171      1.1     skrll 
   2172      1.1     skrll   /* Restore skipped parenthesis.  */
   2173      1.1     skrll   if (paren_skipped)
   2174  1.1.1.3  christos     --input_line_pointer;
   2175      1.1     skrll 
   2176      1.1     skrll   return BFD_RELOC_NONE;
   2177      1.1     skrll }
   2178      1.1     skrll 
   2179      1.1     skrll /* Insert an operand value into an instruction.  */
   2180      1.1     skrll 
   2181      1.1     skrll static unsigned long
   2182      1.1     skrll v850_insert_operand (unsigned long insn,
   2183  1.1.1.2  christos 		     const struct v850_operand *operand,
   2184      1.1     skrll 		     offsetT val,
   2185      1.1     skrll 		     const char **errmsg)
   2186      1.1     skrll {
   2187      1.1     skrll   if (operand->insert)
   2188      1.1     skrll     {
   2189      1.1     skrll       const char *message = NULL;
   2190      1.1     skrll 
   2191      1.1     skrll       insn = operand->insert (insn, val, &message);
   2192      1.1     skrll       if (message != NULL)
   2193      1.1     skrll 	{
   2194  1.1.1.2  christos 	  if ((operand->flags & V850_OPERAND_SIGNED)
   2195      1.1     skrll 	      && ! warn_signed_overflows
   2196      1.1     skrll               && v850_msg_is_out_of_range (message))
   2197      1.1     skrll 	    {
   2198      1.1     skrll 	      /* Skip warning...  */
   2199      1.1     skrll 	    }
   2200  1.1.1.2  christos 	  else if ((operand->flags & V850_OPERAND_SIGNED) == 0
   2201      1.1     skrll 		   && ! warn_unsigned_overflows
   2202      1.1     skrll                   && v850_msg_is_out_of_range (message))
   2203      1.1     skrll 	    {
   2204      1.1     skrll 	      /* Skip warning...  */
   2205      1.1     skrll 	    }
   2206  1.1.1.2  christos 	  else
   2207  1.1.1.2  christos 	    {
   2208      1.1     skrll              if (errmsg != NULL)
   2209      1.1     skrll                *errmsg = message;
   2210      1.1     skrll 	    }
   2211  1.1.1.2  christos 	}
   2212  1.1.1.2  christos     }
   2213  1.1.1.2  christos   else if (operand->bits == -1
   2214  1.1.1.2  christos           || operand->flags & V850E_IMMEDIATE16
   2215  1.1.1.2  christos           || operand->flags & V850E_IMMEDIATE23
   2216  1.1.1.2  christos           || operand->flags & V850E_IMMEDIATE32)
   2217  1.1.1.2  christos     {
   2218      1.1     skrll       abort ();
   2219      1.1     skrll     }
   2220  1.1.1.2  christos   else
   2221      1.1     skrll     {
   2222      1.1     skrll       if (operand->bits < 32)
   2223      1.1     skrll 	{
   2224      1.1     skrll 	  long min, max;
   2225      1.1     skrll 
   2226      1.1     skrll 	  if ((operand->flags & V850_OPERAND_SIGNED) != 0)
   2227      1.1     skrll 	    {
   2228      1.1     skrll 	      if (! warn_signed_overflows)
   2229      1.1     skrll 		max = (1 << operand->bits) - 1;
   2230      1.1     skrll 	      else
   2231      1.1     skrll 		max = (1 << (operand->bits - 1)) - 1;
   2232      1.1     skrll 
   2233      1.1     skrll 	      min = -(1 << (operand->bits - 1));
   2234      1.1     skrll 	    }
   2235      1.1     skrll 	  else
   2236      1.1     skrll 	    {
   2237      1.1     skrll 	      max = (1 << operand->bits) - 1;
   2238      1.1     skrll 
   2239      1.1     skrll 	      if (! warn_unsigned_overflows)
   2240      1.1     skrll 		min = -(1 << (operand->bits - 1));
   2241      1.1     skrll 	      else
   2242      1.1     skrll 		min = 0;
   2243  1.1.1.2  christos 	    }
   2244  1.1.1.2  christos 
   2245  1.1.1.2  christos 	  /* Some people write constants with the sign extension done by
   2246  1.1.1.2  christos 	     hand but only up to 32 bits.  This shouldn't really be valid,
   2247  1.1.1.2  christos 	     but, to permit this code to assemble on a 64-bit host, we
   2248  1.1.1.2  christos 	     sign extend the 32-bit value to 64 bits if so doing makes the
   2249  1.1.1.2  christos 	     value valid.  */
   2250  1.1.1.2  christos 	  if (val > max
   2251  1.1.1.2  christos 	      && (offsetT) (val - 0x80000000 - 0x80000000) >= min
   2252  1.1.1.2  christos 	      && (offsetT) (val - 0x80000000 - 0x80000000) <= max)
   2253  1.1.1.2  christos 	    val = val - 0x80000000 - 0x80000000;
   2254  1.1.1.2  christos 
   2255  1.1.1.2  christos 	  /* Similarly, people write expressions like ~(1<<15), and expect
   2256  1.1.1.2  christos 	     this to be OK for a 32-bit unsigned value.  */
   2257  1.1.1.2  christos 	  else if (val < min
   2258  1.1.1.2  christos 		   && (offsetT) (val + 0x80000000 + 0x80000000) >= min
   2259  1.1.1.2  christos 		   && (offsetT) (val + 0x80000000 + 0x80000000) <= max)
   2260  1.1.1.2  christos 	    val = val + 0x80000000 + 0x80000000;
   2261      1.1     skrll 
   2262  1.1.1.3  christos 	  else if (val < (offsetT) min || val > (offsetT) max)
   2263      1.1     skrll 	    {
   2264      1.1     skrll 	      static char buf [128];
   2265      1.1     skrll 
   2266      1.1     skrll 	      /* Restore min and mix to expected values for decimal ranges.  */
   2267      1.1     skrll 	      if ((operand->flags & V850_OPERAND_SIGNED)
   2268      1.1     skrll 		  && ! warn_signed_overflows)
   2269      1.1     skrll 		max = (1 << (operand->bits - 1)) - 1;
   2270      1.1     skrll 
   2271      1.1     skrll 	      if (! (operand->flags & V850_OPERAND_SIGNED)
   2272      1.1     skrll 		  && ! warn_unsigned_overflows)
   2273  1.1.1.2  christos 		min = 0;
   2274  1.1.1.2  christos 
   2275  1.1.1.2  christos 	      sprintf (buf, _("operand out of range (%d is not between %d and %d)"),
   2276      1.1     skrll 		       (int) val, (int) min, (int) max);
   2277      1.1     skrll 	      *errmsg = buf;
   2278  1.1.1.2  christos 	    }
   2279  1.1.1.2  christos 
   2280  1.1.1.2  christos 	  insn |= (((long) val & ((1 << operand->bits) - 1)) << operand->shift);
   2281  1.1.1.2  christos 	}
   2282  1.1.1.2  christos       else
   2283  1.1.1.2  christos 	{
   2284      1.1     skrll 	  insn |= (((long) val) << operand->shift);
   2285      1.1     skrll 	}
   2286      1.1     skrll     }
   2287      1.1     skrll 
   2288      1.1     skrll   return insn;
   2289      1.1     skrll }
   2290      1.1     skrll 
   2291      1.1     skrll static char copy_of_instruction[128];
   2293      1.1     skrll 
   2294      1.1     skrll void
   2295      1.1     skrll md_assemble (char *str)
   2296      1.1     skrll {
   2297      1.1     skrll   char *s;
   2298      1.1     skrll   char *start_of_operands;
   2299      1.1     skrll   struct v850_opcode *opcode;
   2300      1.1     skrll   struct v850_opcode *next_opcode;
   2301  1.1.1.5  christos   const unsigned char *opindex_ptr;
   2302      1.1     skrll   int next_opindex;
   2303  1.1.1.3  christos   int relaxable = 0;
   2304      1.1     skrll   unsigned long insn = 0;
   2305      1.1     skrll   unsigned long insn_size;
   2306      1.1     skrll   char *f = NULL;
   2307      1.1     skrll   int i;
   2308      1.1     skrll   int match;
   2309      1.1     skrll   bfd_boolean extra_data_after_insn = FALSE;
   2310  1.1.1.2  christos   unsigned extra_data_len = 0;
   2311  1.1.1.2  christos   unsigned long extra_data = 0;
   2312      1.1     skrll   char *saved_input_line_pointer;
   2313      1.1     skrll   char most_match_errmsg[1024];
   2314  1.1.1.2  christos   int most_match_count = -1;
   2315      1.1     skrll 
   2316      1.1     skrll   strncpy (copy_of_instruction, str, sizeof (copy_of_instruction) - 1);
   2317      1.1     skrll   most_match_errmsg[0] = 0;
   2318      1.1     skrll 
   2319      1.1     skrll   /* Get the opcode.  */
   2320      1.1     skrll   for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
   2321      1.1     skrll     continue;
   2322      1.1     skrll 
   2323      1.1     skrll   if (*s != '\0')
   2324      1.1     skrll     *s++ = '\0';
   2325      1.1     skrll 
   2326      1.1     skrll   /* Find the first opcode with the proper name.  */
   2327      1.1     skrll   opcode = (struct v850_opcode *) hash_find (v850_hash, str);
   2328      1.1     skrll   if (opcode == NULL)
   2329      1.1     skrll     {
   2330      1.1     skrll       /* xgettext:c-format  */
   2331      1.1     skrll       as_bad (_("Unrecognized opcode: `%s'"), str);
   2332      1.1     skrll       ignore_rest_of_line ();
   2333      1.1     skrll       return;
   2334      1.1     skrll     }
   2335      1.1     skrll 
   2336      1.1     skrll   str = s;
   2337      1.1     skrll   while (ISSPACE (*str))
   2338      1.1     skrll     ++str;
   2339      1.1     skrll 
   2340      1.1     skrll   start_of_operands = str;
   2341      1.1     skrll 
   2342      1.1     skrll   saved_input_line_pointer = input_line_pointer;
   2343      1.1     skrll 
   2344  1.1.1.2  christos   for (;;)
   2345      1.1     skrll     {
   2346      1.1     skrll       const char *errmsg = NULL;
   2347  1.1.1.2  christos       const char *warningmsg = NULL;
   2348      1.1     skrll 
   2349  1.1.1.2  christos       match = 0;
   2350  1.1.1.2  christos       opindex_ptr = opcode->operands;
   2351  1.1.1.2  christos 
   2352  1.1.1.2  christos       if (no_stld23)
   2353  1.1.1.2  christos 	{
   2354  1.1.1.2  christos 	  if ((strncmp (opcode->name, "st.", 3) == 0
   2355  1.1.1.2  christos 	       && v850_operands[opcode->operands[1]].bits == 23)
   2356  1.1.1.2  christos 	      || (strncmp (opcode->name, "ld.", 3) == 0
   2357  1.1.1.2  christos 		  && v850_operands[opcode->operands[0]].bits == 23))
   2358  1.1.1.2  christos 	    {
   2359  1.1.1.2  christos 	      errmsg = _("st/ld offset 23 instruction was disabled .");
   2360  1.1.1.2  christos 	      goto error;
   2361  1.1.1.2  christos 	    }
   2362  1.1.1.2  christos 	}
   2363  1.1.1.2  christos 
   2364      1.1     skrll       if ((opcode->processors & processor_mask & PROCESSOR_MASK) == 0
   2365      1.1     skrll 	  || (((opcode->processors & ~PROCESSOR_MASK) != 0)
   2366      1.1     skrll 	      && ((opcode->processors & processor_mask & ~PROCESSOR_MASK) == 0)))
   2367      1.1     skrll 	{
   2368      1.1     skrll 	  errmsg = _("Target processor does not support this instruction.");
   2369      1.1     skrll 	  goto error;
   2370      1.1     skrll 	}
   2371      1.1     skrll 
   2372      1.1     skrll       relaxable = 0;
   2373  1.1.1.2  christos       fc = 0;
   2374      1.1     skrll       next_opindex = 0;
   2375      1.1     skrll       insn = opcode->opcode;
   2376      1.1     skrll       extra_data_len = 0;
   2377      1.1     skrll       extra_data_after_insn = FALSE;
   2378      1.1     skrll 
   2379      1.1     skrll       input_line_pointer = str = start_of_operands;
   2380      1.1     skrll 
   2381      1.1     skrll       for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
   2382      1.1     skrll 	{
   2383      1.1     skrll 	  const struct v850_operand *operand;
   2384      1.1     skrll 	  char *hold;
   2385      1.1     skrll 	  expressionS ex;
   2386      1.1     skrll 	  bfd_reloc_code_real_type reloc;
   2387      1.1     skrll 
   2388      1.1     skrll 	  if (next_opindex == 0)
   2389      1.1     skrll 	    operand = &v850_operands[*opindex_ptr];
   2390      1.1     skrll 	  else
   2391      1.1     skrll 	    {
   2392      1.1     skrll 	      operand = &v850_operands[next_opindex];
   2393      1.1     skrll 	      next_opindex = 0;
   2394      1.1     skrll 	    }
   2395  1.1.1.2  christos 
   2396  1.1.1.2  christos 	  errmsg = NULL;
   2397  1.1.1.2  christos 
   2398  1.1.1.2  christos 	  while (*str == ' ')
   2399  1.1.1.2  christos 	    ++str;
   2400  1.1.1.2  christos 
   2401  1.1.1.2  christos 	  if (operand->flags & V850_OPERAND_BANG
   2402  1.1.1.2  christos 	      && *str == '!')
   2403  1.1.1.2  christos 	    ++str;
   2404  1.1.1.2  christos 	  else if (operand->flags & V850_OPERAND_PERCENT
   2405  1.1.1.2  christos 		   && *str == '%')
   2406  1.1.1.2  christos 	    ++str;
   2407  1.1.1.2  christos 
   2408  1.1.1.2  christos 	  if (*str == ',' || *str == '[' || *str == ']')
   2409      1.1     skrll 	    ++str;
   2410      1.1     skrll 
   2411  1.1.1.3  christos 	  while (*str == ' ')
   2412  1.1.1.3  christos 	    ++str;
   2413  1.1.1.3  christos 
   2414  1.1.1.3  christos 	  if (   (strcmp (opcode->name, "pushsp") == 0
   2415  1.1.1.3  christos 	       || strcmp (opcode->name, "popsp") == 0
   2416  1.1.1.3  christos 	       || strcmp (opcode->name, "dbpush") == 0)
   2417      1.1     skrll 	      && (*str == '-'))
   2418      1.1     skrll 	    ++str;
   2419      1.1     skrll 
   2420      1.1     skrll 	  if (operand->flags & V850_OPERAND_RELAX)
   2421      1.1     skrll 	    relaxable = 1;
   2422      1.1     skrll 
   2423      1.1     skrll 	  /* Gather the operand.  */
   2424      1.1     skrll 	  hold = input_line_pointer;
   2425  1.1.1.3  christos 	  input_line_pointer = str;
   2426      1.1     skrll 
   2427      1.1     skrll 	  /* lo(), hi(), hi0(), etc...  */
   2428      1.1     skrll 	  if ((reloc = v850_reloc_prefix (operand, &errmsg)) != BFD_RELOC_NONE)
   2429      1.1     skrll 	    {
   2430  1.1.1.2  christos 	      /* This is a fake reloc, used to indicate an error condition.  */
   2431      1.1     skrll 	      if (reloc == BFD_RELOC_64)
   2432      1.1     skrll 		{
   2433      1.1     skrll 		  /* match = 1;  */
   2434      1.1     skrll 		  goto error;
   2435      1.1     skrll 		}
   2436      1.1     skrll 
   2437      1.1     skrll 	      expression (&ex);
   2438      1.1     skrll 
   2439      1.1     skrll 	      if (ex.X_op == O_constant)
   2440      1.1     skrll 		{
   2441  1.1.1.2  christos 		  switch (reloc)
   2442  1.1.1.2  christos 		    {
   2443      1.1     skrll 		    case BFD_RELOC_V850_ZDA_16_16_OFFSET:
   2444      1.1     skrll 		    case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET:
   2445      1.1     skrll 		    case BFD_RELOC_V850_ZDA_15_16_OFFSET:
   2446      1.1     skrll 		      /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
   2447      1.1     skrll 			 and the like.  */
   2448  1.1.1.2  christos 		      /* Fall through.  */
   2449      1.1     skrll 
   2450      1.1     skrll 		    case BFD_RELOC_LO16:
   2451      1.1     skrll 		    case BFD_RELOC_V850_LO16_S1:
   2452      1.1     skrll 		    case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
   2453      1.1     skrll 		      {
   2454      1.1     skrll 			/* Truncate, then sign extend the value.  */
   2455      1.1     skrll 			ex.X_add_number = SEXT16 (ex.X_add_number);
   2456      1.1     skrll 			break;
   2457      1.1     skrll 		      }
   2458      1.1     skrll 
   2459      1.1     skrll 		    case BFD_RELOC_HI16:
   2460      1.1     skrll 		      {
   2461      1.1     skrll 			/* Truncate, then sign extend the value.  */
   2462      1.1     skrll 			ex.X_add_number = SEXT16 (ex.X_add_number >> 16);
   2463      1.1     skrll 			break;
   2464      1.1     skrll 		      }
   2465      1.1     skrll 
   2466      1.1     skrll 		    case BFD_RELOC_HI16_S:
   2467      1.1     skrll 		      {
   2468      1.1     skrll 			/* Truncate, then sign extend the value.  */
   2469      1.1     skrll 			int temp = (ex.X_add_number >> 16) & 0xffff;
   2470      1.1     skrll 
   2471      1.1     skrll 			temp += (ex.X_add_number >> 15) & 1;
   2472      1.1     skrll 
   2473      1.1     skrll 			ex.X_add_number = SEXT16 (temp);
   2474  1.1.1.2  christos 			break;
   2475  1.1.1.2  christos 		      }
   2476  1.1.1.2  christos 
   2477  1.1.1.2  christos 		    case BFD_RELOC_V850_23:
   2478  1.1.1.2  christos 		      if ((operand->flags & V850E_IMMEDIATE23) == 0)
   2479  1.1.1.2  christos 			{
   2480  1.1.1.2  christos 			  errmsg = _("immediate operand is too large");
   2481  1.1.1.2  christos 			  goto error;
   2482      1.1     skrll 			}
   2483  1.1.1.2  christos 		      break;
   2484  1.1.1.2  christos 
   2485      1.1     skrll 		    case BFD_RELOC_32:
   2486      1.1     skrll 		    case BFD_RELOC_V850_32_ABS:
   2487      1.1     skrll 		    case BFD_RELOC_V850_32_PCREL:
   2488      1.1     skrll 		      if ((operand->flags & V850E_IMMEDIATE32) == 0)
   2489      1.1     skrll 			{
   2490      1.1     skrll 			  errmsg = _("immediate operand is too large");
   2491      1.1     skrll 			  goto error;
   2492      1.1     skrll 			}
   2493      1.1     skrll 
   2494  1.1.1.3  christos 		      break;
   2495      1.1     skrll 
   2496      1.1     skrll 		    default:
   2497      1.1     skrll 		      as_bad (_("AAARG -> unhandled constant reloc: %d"), reloc);
   2498  1.1.1.2  christos 		      break;
   2499  1.1.1.2  christos 		    }
   2500  1.1.1.2  christos 
   2501  1.1.1.2  christos 		  if (operand->flags & V850E_IMMEDIATE32)
   2502  1.1.1.2  christos 		    {
   2503  1.1.1.2  christos 		      extra_data_after_insn = TRUE;
   2504  1.1.1.2  christos 		      extra_data_len	    = 4;
   2505  1.1.1.2  christos 		      extra_data	    = 0;
   2506  1.1.1.2  christos 		    }
   2507  1.1.1.2  christos 		  else if (operand->flags & V850E_IMMEDIATE23)
   2508  1.1.1.2  christos 		    {
   2509  1.1.1.2  christos 		      if (reloc != BFD_RELOC_V850_23)
   2510  1.1.1.2  christos 			{
   2511  1.1.1.2  christos 			  errmsg = _("immediate operand is too large");
   2512  1.1.1.2  christos 			  goto error;
   2513  1.1.1.2  christos 			}
   2514  1.1.1.2  christos 		      extra_data_after_insn = TRUE;
   2515  1.1.1.2  christos 		      extra_data_len	    = 2;
   2516  1.1.1.2  christos 		      extra_data	    = 0;
   2517  1.1.1.2  christos 		    }
   2518  1.1.1.2  christos 		  else if ((operand->flags & V850E_IMMEDIATE16)
   2519  1.1.1.2  christos 			   || (operand->flags & V850E_IMMEDIATE16HI))
   2520  1.1.1.2  christos 		    {
   2521  1.1.1.2  christos 		      if (operand->flags & V850E_IMMEDIATE16HI
   2522  1.1.1.2  christos 			  && reloc != BFD_RELOC_HI16
   2523  1.1.1.2  christos 			  && reloc != BFD_RELOC_HI16_S)
   2524  1.1.1.2  christos 			{
   2525  1.1.1.2  christos 			  errmsg = _("immediate operand is too large");
   2526  1.1.1.2  christos 			  goto error;
   2527  1.1.1.2  christos 			}
   2528  1.1.1.2  christos 		      else if (operand->flags & V850E_IMMEDIATE16
   2529  1.1.1.2  christos 			       && reloc != BFD_RELOC_LO16)
   2530  1.1.1.2  christos 			{
   2531  1.1.1.2  christos 			  errmsg = _("immediate operand is too large");
   2532  1.1.1.2  christos 			  goto error;
   2533  1.1.1.2  christos 			}
   2534  1.1.1.2  christos 
   2535  1.1.1.2  christos 		      extra_data_after_insn = TRUE;
   2536  1.1.1.2  christos 		      extra_data_len	    = 2;
   2537      1.1     skrll 		      extra_data	    = 0;
   2538      1.1     skrll 		    }
   2539      1.1     skrll 
   2540      1.1     skrll 		  if (fc > MAX_INSN_FIXUPS)
   2541      1.1     skrll 		    as_fatal (_("too many fixups"));
   2542      1.1     skrll 
   2543      1.1     skrll 		  fixups[fc].exp     = ex;
   2544      1.1     skrll 		  fixups[fc].opindex = *opindex_ptr;
   2545  1.1.1.2  christos 		  fixups[fc].reloc   = reloc;
   2546      1.1     skrll 		  fc++;
   2547  1.1.1.2  christos 		}
   2548  1.1.1.2  christos 	      else	/* ex.X_op != O_constant.  */
   2549  1.1.1.2  christos 		{
   2550  1.1.1.2  christos 		  if ((reloc == BFD_RELOC_32
   2551      1.1     skrll 		       || reloc == BFD_RELOC_V850_32_ABS
   2552  1.1.1.2  christos 		       || reloc == BFD_RELOC_V850_32_PCREL)
   2553  1.1.1.2  christos 		      && operand->bits < 32)
   2554  1.1.1.2  christos 		    {
   2555  1.1.1.2  christos 		      errmsg = _("immediate operand is too large");
   2556  1.1.1.2  christos 		      goto error;
   2557  1.1.1.2  christos 		    }
   2558  1.1.1.2  christos 		  else if (reloc == BFD_RELOC_V850_23
   2559  1.1.1.2  christos 			   && (operand->flags & V850E_IMMEDIATE23) == 0)
   2560  1.1.1.2  christos 		    {
   2561  1.1.1.2  christos 		      errmsg = _("immediate operand is too large");
   2562  1.1.1.2  christos 		      goto error;
   2563  1.1.1.2  christos 		    }
   2564  1.1.1.2  christos 		  else if ((reloc == BFD_RELOC_HI16
   2565  1.1.1.2  christos 			    || reloc == BFD_RELOC_HI16_S)
   2566  1.1.1.2  christos 			   && operand->bits < 16)
   2567  1.1.1.2  christos 		    {
   2568  1.1.1.2  christos 		      errmsg = _("immediate operand is too large");
   2569  1.1.1.2  christos 		      goto error;
   2570  1.1.1.2  christos 		    }
   2571  1.1.1.2  christos 
   2572  1.1.1.2  christos 		  if (operand->flags & V850E_IMMEDIATE32)
   2573  1.1.1.2  christos 		    {
   2574  1.1.1.2  christos 		      extra_data_after_insn = TRUE;
   2575  1.1.1.2  christos 		      extra_data_len	    = 4;
   2576  1.1.1.2  christos 		      extra_data	    = 0;
   2577  1.1.1.2  christos 		    }
   2578  1.1.1.2  christos 		  else if (operand->flags & V850E_IMMEDIATE23)
   2579  1.1.1.2  christos 		    {
   2580  1.1.1.2  christos 		      if (reloc != BFD_RELOC_V850_23)
   2581  1.1.1.2  christos 			{
   2582  1.1.1.2  christos 			  errmsg = _("immediate operand is too large");
   2583  1.1.1.2  christos 			  goto error;
   2584  1.1.1.2  christos 			}
   2585  1.1.1.2  christos 		      extra_data_after_insn = TRUE;
   2586  1.1.1.2  christos 		      extra_data_len	    = 2;
   2587  1.1.1.2  christos 		      extra_data	    = 0;
   2588  1.1.1.2  christos 		    }
   2589  1.1.1.2  christos 		  else if ((operand->flags & V850E_IMMEDIATE16)
   2590  1.1.1.2  christos 			   || (operand->flags & V850E_IMMEDIATE16HI))
   2591  1.1.1.2  christos 		    {
   2592  1.1.1.2  christos 		      if (operand->flags & V850E_IMMEDIATE16HI
   2593  1.1.1.2  christos 			  && reloc != BFD_RELOC_HI16
   2594  1.1.1.2  christos 			  && reloc != BFD_RELOC_HI16_S)
   2595  1.1.1.2  christos 			{
   2596  1.1.1.2  christos 			  errmsg = _("immediate operand is too large");
   2597  1.1.1.2  christos 			  goto error;
   2598      1.1     skrll 			}
   2599      1.1     skrll 		      else if (operand->flags & V850E_IMMEDIATE16
   2600      1.1     skrll 			       && reloc != BFD_RELOC_LO16)
   2601      1.1     skrll 			{
   2602      1.1     skrll 			  errmsg = _("immediate operand is too large");
   2603      1.1     skrll 			  goto error;
   2604  1.1.1.2  christos 			}
   2605  1.1.1.2  christos 
   2606      1.1     skrll 		      extra_data_after_insn = TRUE;
   2607      1.1     skrll 		      extra_data_len	    = 2;
   2608      1.1     skrll 		      extra_data	    = 0;
   2609      1.1     skrll 		    }
   2610      1.1     skrll 
   2611      1.1     skrll 		  if (fc > MAX_INSN_FIXUPS)
   2612      1.1     skrll 		    as_fatal (_("too many fixups"));
   2613      1.1     skrll 
   2614      1.1     skrll 		  fixups[fc].exp     = ex;
   2615      1.1     skrll 		  fixups[fc].opindex = *opindex_ptr;
   2616      1.1     skrll 		  fixups[fc].reloc   = reloc;
   2617  1.1.1.2  christos 		  fc++;
   2618  1.1.1.2  christos 		}
   2619  1.1.1.2  christos 	    }
   2620  1.1.1.2  christos 	  else if (operand->flags & V850E_IMMEDIATE16
   2621  1.1.1.2  christos 		   || operand->flags & V850E_IMMEDIATE16HI)
   2622  1.1.1.2  christos 	    {
   2623  1.1.1.2  christos 	      expression (&ex);
   2624  1.1.1.2  christos 
   2625  1.1.1.2  christos 	      switch (ex.X_op)
   2626  1.1.1.2  christos 		{
   2627  1.1.1.2  christos 		case O_constant:
   2628  1.1.1.2  christos 		  if (operand->flags & V850E_IMMEDIATE16HI)
   2629  1.1.1.2  christos 		    {
   2630  1.1.1.2  christos 		      if (ex.X_add_number & 0xffff)
   2631  1.1.1.2  christos 			{
   2632  1.1.1.2  christos 			  errmsg = _("constant too big to fit into instruction");
   2633  1.1.1.2  christos 			  goto error;
   2634  1.1.1.2  christos 			}
   2635  1.1.1.2  christos 
   2636  1.1.1.2  christos 		      ex.X_add_number >>= 16;
   2637  1.1.1.3  christos 		    }
   2638  1.1.1.3  christos 		  if (operand->flags & V850E_IMMEDIATE16)
   2639  1.1.1.2  christos 		    {
   2640  1.1.1.2  christos 		      if ((ex.X_add_number & 0xffff8000)
   2641  1.1.1.2  christos 			  && ((ex.X_add_number & 0xffff8000) != 0xffff8000))
   2642  1.1.1.2  christos 			{
   2643  1.1.1.2  christos 			  errmsg = _("constant too big to fit into instruction");
   2644  1.1.1.2  christos 			  goto error;
   2645  1.1.1.2  christos 			}
   2646  1.1.1.2  christos 		    }
   2647  1.1.1.2  christos 		  break;
   2648  1.1.1.2  christos 
   2649  1.1.1.2  christos 		case O_illegal:
   2650  1.1.1.2  christos 		  errmsg = _("illegal operand");
   2651  1.1.1.2  christos 		  goto error;
   2652  1.1.1.2  christos 
   2653  1.1.1.2  christos 		case O_absent:
   2654  1.1.1.2  christos 		  errmsg = _("missing operand");
   2655  1.1.1.2  christos 		  goto error;
   2656  1.1.1.2  christos 
   2657  1.1.1.2  christos 		default:
   2658  1.1.1.2  christos 		  if (fc >= MAX_INSN_FIXUPS)
   2659  1.1.1.2  christos 		    as_fatal (_("too many fixups"));
   2660  1.1.1.2  christos 
   2661  1.1.1.2  christos 		  fixups[fc].exp     = ex;
   2662  1.1.1.2  christos 		  fixups[fc].opindex = *opindex_ptr;
   2663  1.1.1.2  christos 		  fixups[fc].reloc   = operand->default_reloc;
   2664  1.1.1.2  christos 		  ++fc;
   2665  1.1.1.2  christos 
   2666  1.1.1.2  christos 		  ex.X_add_number = 0;
   2667  1.1.1.2  christos 		  break;
   2668  1.1.1.2  christos 		}
   2669  1.1.1.2  christos 
   2670  1.1.1.2  christos 	      extra_data_after_insn = TRUE;
   2671  1.1.1.2  christos 	      extra_data_len        = 2;
   2672  1.1.1.2  christos 	      extra_data            = ex.X_add_number;
   2673  1.1.1.2  christos 	    }
   2674  1.1.1.2  christos 	  else if (operand->flags & V850E_IMMEDIATE23)
   2675  1.1.1.2  christos 	    {
   2676  1.1.1.2  christos 	      expression (&ex);
   2677  1.1.1.2  christos 
   2678  1.1.1.2  christos 	      switch (ex.X_op)
   2679  1.1.1.2  christos 		{
   2680  1.1.1.2  christos 		case O_constant:
   2681  1.1.1.2  christos 		  break;
   2682  1.1.1.2  christos 
   2683  1.1.1.2  christos 		case O_illegal:
   2684  1.1.1.2  christos 		  errmsg = _("illegal operand");
   2685  1.1.1.2  christos 		  goto error;
   2686  1.1.1.2  christos 
   2687  1.1.1.2  christos 		case O_absent:
   2688  1.1.1.2  christos 		  errmsg = _("missing operand");
   2689  1.1.1.2  christos 		  goto error;
   2690  1.1.1.2  christos 
   2691  1.1.1.2  christos 		default:
   2692  1.1.1.2  christos 		  break;
   2693  1.1.1.2  christos 		}
   2694  1.1.1.2  christos 
   2695  1.1.1.2  christos 	      if (fc >= MAX_INSN_FIXUPS)
   2696  1.1.1.2  christos 		as_fatal (_("too many fixups"));
   2697  1.1.1.2  christos 
   2698  1.1.1.2  christos 	      fixups[fc].exp     = ex;
   2699  1.1.1.2  christos 	      fixups[fc].opindex = *opindex_ptr;
   2700  1.1.1.2  christos 	      fixups[fc].reloc   = operand->default_reloc;
   2701  1.1.1.2  christos 	      ++fc;
   2702  1.1.1.2  christos 
   2703  1.1.1.2  christos 	      extra_data_after_insn = TRUE;
   2704  1.1.1.2  christos 	      extra_data_len        = 2;
   2705  1.1.1.2  christos 	      extra_data            = 0;
   2706  1.1.1.2  christos 	    }
   2707  1.1.1.2  christos 	  else if (operand->flags & V850E_IMMEDIATE32)
   2708  1.1.1.2  christos 	    {
   2709  1.1.1.2  christos 	      expression (&ex);
   2710  1.1.1.2  christos 
   2711  1.1.1.2  christos 	      switch (ex.X_op)
   2712  1.1.1.2  christos 		{
   2713  1.1.1.2  christos 		case O_constant:
   2714  1.1.1.2  christos 		  if ((operand->default_reloc == BFD_RELOC_V850_32_ABS
   2715  1.1.1.2  christos 		       || operand->default_reloc == BFD_RELOC_V850_32_PCREL)
   2716  1.1.1.2  christos 		      && (ex.X_add_number & 1))
   2717  1.1.1.2  christos 		    {
   2718  1.1.1.2  christos 		      errmsg = _("odd number cannot be used here");
   2719  1.1.1.2  christos 		      goto error;
   2720  1.1.1.2  christos 		    }
   2721  1.1.1.2  christos 		  break;
   2722  1.1.1.2  christos 
   2723  1.1.1.2  christos 		case O_illegal:
   2724  1.1.1.2  christos 		  errmsg = _("illegal operand");
   2725  1.1.1.2  christos 		  goto error;
   2726  1.1.1.2  christos 
   2727  1.1.1.2  christos 		case O_absent:
   2728  1.1.1.2  christos 		  errmsg = _("missing operand");
   2729  1.1.1.2  christos 		  goto error;
   2730  1.1.1.2  christos 
   2731  1.1.1.2  christos 		default:
   2732  1.1.1.2  christos 		  if (fc >= MAX_INSN_FIXUPS)
   2733  1.1.1.2  christos 		    as_fatal (_("too many fixups"));
   2734  1.1.1.2  christos 
   2735  1.1.1.2  christos 		  fixups[fc].exp     = ex;
   2736  1.1.1.2  christos 		  fixups[fc].opindex = *opindex_ptr;
   2737  1.1.1.2  christos 		  fixups[fc].reloc   = operand->default_reloc;
   2738  1.1.1.2  christos 		  ++fc;
   2739  1.1.1.2  christos 
   2740  1.1.1.2  christos 		  ex.X_add_number = 0;
   2741  1.1.1.2  christos 		  break;
   2742  1.1.1.2  christos 		}
   2743  1.1.1.2  christos 
   2744  1.1.1.2  christos 	      extra_data_after_insn = TRUE;
   2745  1.1.1.2  christos 	      extra_data_len        = 4;
   2746  1.1.1.2  christos 	      extra_data            = ex.X_add_number;
   2747  1.1.1.2  christos 	    }
   2748  1.1.1.2  christos 	  else if (operand->flags & V850E_OPERAND_REG_LIST)
   2749  1.1.1.2  christos 	    {
   2750  1.1.1.2  christos 	      errmsg = parse_register_list (&insn, operand);
   2751  1.1.1.2  christos 
   2752      1.1     skrll 	      if (errmsg)
   2753      1.1     skrll 		goto error;
   2754      1.1     skrll 	    }
   2755      1.1     skrll 	  else
   2756      1.1     skrll 	    {
   2757      1.1     skrll 	      errmsg = NULL;
   2758      1.1     skrll 
   2759  1.1.1.2  christos 	      if ((operand->flags & V850_OPERAND_REG) != 0)
   2760  1.1.1.2  christos 		{
   2761  1.1.1.2  christos 		  if (!register_name (&ex))
   2762  1.1.1.2  christos 		    {
   2763  1.1.1.2  christos 		      errmsg = _("invalid register name");
   2764      1.1     skrll 		    }
   2765      1.1     skrll 
   2766      1.1     skrll 		  if ((operand->flags & V850_NOT_R0)
   2767  1.1.1.2  christos 			   && ex.X_add_number == 0)
   2768      1.1     skrll 		    {
   2769  1.1.1.2  christos 		      errmsg = _("register r0 cannot be used here");
   2770  1.1.1.2  christos 		    }
   2771  1.1.1.2  christos 
   2772  1.1.1.2  christos 		  if (operand->flags & V850_REG_EVEN)
   2773  1.1.1.2  christos 		    {
   2774      1.1     skrll 		      if (ex.X_add_number % 2)
   2775  1.1.1.2  christos 			errmsg = _("odd register cannot be used here");
   2776      1.1     skrll 		      ex.X_add_number = ex.X_add_number / 2;
   2777      1.1     skrll 		    }
   2778      1.1     skrll 
   2779  1.1.1.2  christos 		}
   2780  1.1.1.2  christos 	      else if ((operand->flags & V850_OPERAND_SRG) != 0)
   2781  1.1.1.2  christos 		{
   2782  1.1.1.2  christos 		  if (!system_register_name (&ex, TRUE))
   2783      1.1     skrll 		    {
   2784      1.1     skrll 		      errmsg = _("invalid system register name");
   2785      1.1     skrll 		    }
   2786      1.1     skrll 		}
   2787  1.1.1.3  christos 	      else if ((operand->flags & V850_OPERAND_EP) != 0)
   2788  1.1.1.3  christos 		{
   2789      1.1     skrll 		  char *start = input_line_pointer;
   2790  1.1.1.3  christos 		  char *name;
   2791      1.1     skrll 		  char c = get_symbol_name (&name);
   2792      1.1     skrll 
   2793  1.1.1.3  christos 		  if (strcmp (name, "ep") != 0 && strcmp (name, "r30") != 0)
   2794      1.1     skrll 		    {
   2795      1.1     skrll 		      /* Put things back the way we found them.  */
   2796      1.1     skrll 		      (void) restore_line_pointer (c);
   2797      1.1     skrll 		      input_line_pointer = start;
   2798      1.1     skrll 		      errmsg = _("expected EP register");
   2799  1.1.1.3  christos 		      goto error;
   2800      1.1     skrll 		    }
   2801      1.1     skrll 
   2802      1.1     skrll 		  (void) restore_line_pointer (c);
   2803      1.1     skrll 		  str = input_line_pointer;
   2804      1.1     skrll 		  input_line_pointer = hold;
   2805      1.1     skrll 
   2806      1.1     skrll 		  while (*str == ' ' || *str == ','
   2807      1.1     skrll 			 || *str == '[' || *str == ']')
   2808      1.1     skrll 		    ++str;
   2809      1.1     skrll 		  continue;
   2810  1.1.1.2  christos 		}
   2811      1.1     skrll 	      else if ((operand->flags & V850_OPERAND_CC) != 0)
   2812  1.1.1.2  christos 		{
   2813      1.1     skrll 		  if (!cc_name (&ex, TRUE))
   2814      1.1     skrll 		    {
   2815  1.1.1.2  christos 		      errmsg = _("invalid condition code name");
   2816  1.1.1.2  christos 		    }
   2817  1.1.1.2  christos 
   2818  1.1.1.2  christos 		  if ((operand->flags & V850_NOT_SA)
   2819  1.1.1.2  christos 		      && ex.X_add_number == COND_SA_NUM)
   2820      1.1     skrll 		    {
   2821  1.1.1.2  christos 		      errmsg = _("condition sa cannot be used here");
   2822      1.1     skrll 		    }
   2823  1.1.1.2  christos 		}
   2824  1.1.1.2  christos 	      else if ((operand->flags & V850_OPERAND_FLOAT_CC) != 0)
   2825  1.1.1.2  christos 		{
   2826  1.1.1.2  christos 		  if (!float_cc_name (&ex, TRUE))
   2827      1.1     skrll 		    {
   2828  1.1.1.3  christos 		      errmsg = _("invalid condition code name");
   2829  1.1.1.3  christos 		    }
   2830  1.1.1.3  christos 		}
   2831  1.1.1.5  christos 	      else if ((operand->flags & V850_OPERAND_CACHEOP) != 0)
   2832  1.1.1.3  christos 		{
   2833  1.1.1.3  christos 		  if (!cacheop_name (&ex, TRUE))
   2834  1.1.1.3  christos 		    errmsg = _("invalid cache operation name");
   2835  1.1.1.3  christos 		}
   2836  1.1.1.5  christos 	      else if ((operand->flags & V850_OPERAND_PREFOP) != 0)
   2837  1.1.1.3  christos 		{
   2838  1.1.1.3  christos 		  if (!prefop_name (&ex, TRUE))
   2839  1.1.1.3  christos 		    errmsg = _("invalid pref operation name");
   2840  1.1.1.3  christos 		}
   2841  1.1.1.3  christos 	      else if ((operand->flags & V850_OPERAND_VREG) != 0)
   2842  1.1.1.3  christos 		{
   2843  1.1.1.2  christos 		  if (!vector_register_name (&ex))
   2844  1.1.1.2  christos 		    errmsg = _("invalid vector register name");
   2845      1.1     skrll 		}
   2846  1.1.1.3  christos 	      else if ((register_name (&ex)
   2847      1.1     skrll 			&& (operand->flags & V850_OPERAND_REG) == 0))
   2848      1.1     skrll 		{
   2849      1.1     skrll 		  char *name;
   2850      1.1     skrll 		  char c;
   2851      1.1     skrll 		  int exists = 0;
   2852      1.1     skrll 
   2853      1.1     skrll 		  /* It is possible that an alias has been defined that
   2854      1.1     skrll 		     matches a register name.  For example the code may
   2855      1.1     skrll 		     include a ".set ZERO, 0" directive, which matches
   2856      1.1     skrll 		     the register name "zero".  Attempt to reparse the
   2857      1.1     skrll 		     field as an expression, and only complain if we
   2858      1.1     skrll 		     cannot generate a constant.  */
   2859  1.1.1.3  christos 
   2860      1.1     skrll 		  input_line_pointer = str;
   2861  1.1.1.3  christos 
   2862      1.1     skrll 		  c = get_symbol_name (&name);
   2863      1.1     skrll 
   2864  1.1.1.3  christos 		  if (symbol_find (name) != NULL)
   2865      1.1     skrll 		    exists = 1;
   2866      1.1     skrll 
   2867      1.1     skrll 		  (void) restore_line_pointer (c);
   2868      1.1     skrll 		  input_line_pointer = str;
   2869      1.1     skrll 
   2870      1.1     skrll 		  expression (&ex);
   2871      1.1     skrll 
   2872      1.1     skrll 		  if (ex.X_op != O_constant)
   2873      1.1     skrll 		    {
   2874      1.1     skrll 		      /* If this register is actually occurring too early on
   2875  1.1.1.2  christos 			 the parsing of the instruction, (because another
   2876  1.1.1.2  christos 			 field is missing) then report this.  */
   2877  1.1.1.2  christos 		      if (opindex_ptr[1] != 0
   2878  1.1.1.2  christos 			  && ((v850_operands[opindex_ptr[1]].flags
   2879      1.1     skrll 			       & V850_OPERAND_REG)
   2880      1.1     skrll 			      ||(v850_operands[opindex_ptr[1]].flags
   2881      1.1     skrll 				 & V850_OPERAND_VREG)))
   2882      1.1     skrll 			errmsg = _("syntax error: value is missing before the register name");
   2883      1.1     skrll 		      else
   2884      1.1     skrll 			errmsg = _("syntax error: register not expected");
   2885      1.1     skrll 
   2886      1.1     skrll 		      /* If we created a symbol in the process of this
   2887      1.1     skrll 			 test then delete it now, so that it will not
   2888      1.1     skrll 			 be output with the real symbols...  */
   2889      1.1     skrll 		      if (exists == 0
   2890      1.1     skrll 			  && ex.X_op == O_symbol)
   2891      1.1     skrll 			symbol_remove (ex.X_add_symbol,
   2892  1.1.1.2  christos 				       &symbol_rootP, &symbol_lastP);
   2893      1.1     skrll 		    }
   2894  1.1.1.2  christos 		}
   2895  1.1.1.2  christos 	      else if (system_register_name (&ex, FALSE)
   2896  1.1.1.2  christos 		       && (operand->flags & V850_OPERAND_SRG) == 0)
   2897  1.1.1.2  christos 		{
   2898      1.1     skrll 		  errmsg = _("syntax error: system register not expected");
   2899  1.1.1.2  christos 		}
   2900  1.1.1.2  christos 	      else if (cc_name (&ex, FALSE)
   2901  1.1.1.2  christos 		       && (operand->flags & V850_OPERAND_CC) == 0)
   2902  1.1.1.2  christos 		{
   2903  1.1.1.2  christos 		  errmsg = _("syntax error: condition code not expected");
   2904  1.1.1.2  christos 		}
   2905  1.1.1.2  christos 	      else if (float_cc_name (&ex, FALSE)
   2906  1.1.1.2  christos 		       && (operand->flags & V850_OPERAND_FLOAT_CC) == 0)
   2907  1.1.1.3  christos 		{
   2908  1.1.1.3  christos 		  errmsg = _("syntax error: condition code not expected");
   2909  1.1.1.3  christos 		}
   2910  1.1.1.3  christos 	      else if (vector_register_name (&ex)
   2911  1.1.1.3  christos 		       && (operand->flags & V850_OPERAND_VREG) == 0)
   2912      1.1     skrll 		{
   2913      1.1     skrll 		  errmsg = _("syntax error: vector register not expected");
   2914      1.1     skrll 		}
   2915  1.1.1.2  christos 	      else
   2916  1.1.1.2  christos 		{
   2917  1.1.1.2  christos 		  expression (&ex);
   2918  1.1.1.2  christos 
   2919  1.1.1.2  christos 		  if ((operand->flags & V850_NOT_IMM0)
   2920  1.1.1.2  christos 		      && ex.X_op == O_constant
   2921  1.1.1.2  christos 		      && ex.X_add_number == 0)
   2922  1.1.1.2  christos 		    {
   2923      1.1     skrll 		      errmsg = _("immediate 0 cannot be used here");
   2924  1.1.1.2  christos 		    }
   2925      1.1     skrll 
   2926  1.1.1.2  christos 		  /* Special case:
   2927      1.1     skrll 		     If we are assembling a MOV/JARL/JR instruction and the immediate
   2928      1.1     skrll 		     value does not fit into the bits available then create a
   2929  1.1.1.2  christos 		     fake error so that the next MOV/JARL/JR instruction will be
   2930  1.1.1.2  christos 		     selected.  This one has a 32 bit immediate field.  */
   2931  1.1.1.2  christos 
   2932      1.1     skrll 		  if ((strcmp (opcode->name, "mov") == 0
   2933      1.1     skrll 		       || strcmp (opcode->name, "jarl") == 0
   2934      1.1     skrll 		       || strcmp (opcode->name, "jr") == 0)
   2935  1.1.1.2  christos 		      && ex.X_op == O_constant
   2936  1.1.1.2  christos 		      && (ex.X_add_number < (-(1 << (operand->bits - 1)))
   2937  1.1.1.2  christos 			  || ex.X_add_number > ((1 << (operand->bits - 1)) - 1)))
   2938  1.1.1.2  christos 		    {
   2939  1.1.1.2  christos 		      errmsg = _("immediate operand is too large");
   2940  1.1.1.2  christos 		    }
   2941  1.1.1.2  christos 
   2942  1.1.1.2  christos 		  if ((strcmp (opcode->name, "jarl") == 0
   2943  1.1.1.2  christos 		       || strcmp (opcode->name, "jr") == 0)
   2944  1.1.1.2  christos 		      && ex.X_op != O_constant
   2945  1.1.1.2  christos 		      && operand->bits != default_disp_size)
   2946  1.1.1.3  christos 		    {
   2947  1.1.1.3  christos 		      errmsg = _("immediate operand is not match");
   2948  1.1.1.3  christos 		    }
   2949  1.1.1.3  christos 
   2950  1.1.1.3  christos                   /* Special case2 :
   2951  1.1.1.3  christos                      If we are assembling a ld/st instruction and the immediate
   2952  1.1.1.3  christos                      value does not fit into the bits available then create a
   2953  1.1.1.3  christos                      fake error so that the next ld/st instruction will be
   2954  1.1.1.3  christos                      selected.  */
   2955  1.1.1.3  christos                   if ( (  (strncmp (opcode->name, "st.", 3) == 0)
   2956  1.1.1.3  christos 		       || (strncmp (opcode->name, "ld.", 3) == 0))
   2957  1.1.1.3  christos                       && ex.X_op == O_constant
   2958      1.1     skrll                       && (ex.X_add_number < (-(1 << (operand->bits - 1)))
   2959      1.1     skrll 			  || ex.X_add_number > ((1 << (operand->bits - 1)) - 1)))
   2960      1.1     skrll 		    errmsg = _("displacement is too large");
   2961      1.1     skrll 		}
   2962      1.1     skrll 
   2963      1.1     skrll 	      if (errmsg)
   2964      1.1     skrll 		goto error;
   2965      1.1     skrll 
   2966      1.1     skrll 	      switch (ex.X_op)
   2967      1.1     skrll 		{
   2968      1.1     skrll 		case O_illegal:
   2969      1.1     skrll 		  errmsg = _("illegal operand");
   2970      1.1     skrll 		  goto error;
   2971      1.1     skrll 		case O_absent:
   2972      1.1     skrll 		  errmsg = _("missing operand");
   2973  1.1.1.2  christos 		  goto error;
   2974      1.1     skrll 		case O_register:
   2975      1.1     skrll 		  if ((operand->flags
   2976      1.1     skrll 		       & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_VREG)) == 0)
   2977      1.1     skrll 		    {
   2978  1.1.1.2  christos 		      errmsg = _("invalid operand");
   2979  1.1.1.2  christos 		      goto error;
   2980  1.1.1.2  christos 		    }
   2981  1.1.1.2  christos 
   2982  1.1.1.2  christos 		  insn = v850_insert_operand (insn, operand,
   2983      1.1     skrll 					      ex.X_add_number,
   2984      1.1     skrll 					      &warningmsg);
   2985      1.1     skrll 
   2986      1.1     skrll 		  break;
   2987  1.1.1.2  christos 
   2988      1.1     skrll 		case O_constant:
   2989      1.1     skrll 		  insn = v850_insert_operand (insn, operand, ex.X_add_number,
   2990      1.1     skrll 					      &warningmsg);
   2991      1.1     skrll 		  break;
   2992      1.1     skrll 
   2993      1.1     skrll 		default:
   2994      1.1     skrll 		  /* We need to generate a fixup for this expression.  */
   2995      1.1     skrll 		  if (fc >= MAX_INSN_FIXUPS)
   2996      1.1     skrll 		    as_fatal (_("too many fixups"));
   2997  1.1.1.3  christos 
   2998      1.1     skrll 		  fixups[fc].exp     = ex;
   2999      1.1     skrll 		  fixups[fc].opindex = *opindex_ptr;
   3000      1.1     skrll 		  fixups[fc].reloc   = BFD_RELOC_NONE;
   3001      1.1     skrll 		  ++fc;
   3002      1.1     skrll 		  break;
   3003      1.1     skrll 		}
   3004      1.1     skrll 	    }
   3005      1.1     skrll 
   3006      1.1     skrll 	  str = input_line_pointer;
   3007      1.1     skrll 	  input_line_pointer = hold;
   3008      1.1     skrll 
   3009      1.1     skrll 	  while (*str == ' ' || *str == ',' || *str == '[' || *str == ']'
   3010  1.1.1.2  christos 		 || *str == ')')
   3011  1.1.1.2  christos 	    ++str;
   3012  1.1.1.2  christos 	}
   3013  1.1.1.2  christos 
   3014  1.1.1.2  christos       while (ISSPACE (*str))
   3015  1.1.1.2  christos 	++str;
   3016      1.1     skrll 
   3017      1.1     skrll       if (*str == '\0')
   3018      1.1     skrll 	match = 1;
   3019      1.1     skrll 
   3020  1.1.1.2  christos     error:
   3021  1.1.1.2  christos       if (match == 0)
   3022  1.1.1.2  christos 	{
   3023  1.1.1.2  christos 	  if ((opindex_ptr - opcode->operands) >= most_match_count)
   3024  1.1.1.2  christos 	    {
   3025  1.1.1.2  christos 	      most_match_count = opindex_ptr - opcode->operands;
   3026  1.1.1.2  christos 	      if (errmsg != NULL)
   3027      1.1     skrll 		strncpy (most_match_errmsg, errmsg, sizeof (most_match_errmsg)-1);
   3028      1.1     skrll 	    }
   3029      1.1     skrll 
   3030      1.1     skrll 	  next_opcode = opcode + 1;
   3031      1.1     skrll 	  if (next_opcode->name != NULL
   3032      1.1     skrll 	      && strcmp (next_opcode->name, opcode->name) == 0)
   3033      1.1     skrll 	    {
   3034      1.1     skrll 	      opcode = next_opcode;
   3035      1.1     skrll 
   3036      1.1     skrll 	      /* Skip versions that are not supported by the target
   3037      1.1     skrll 		 processor.  */
   3038      1.1     skrll 	      if ((opcode->processors & processor_mask) == 0)
   3039      1.1     skrll 		goto error;
   3040      1.1     skrll 
   3041  1.1.1.2  christos 	      continue;
   3042  1.1.1.2  christos 	    }
   3043  1.1.1.2  christos 
   3044  1.1.1.2  christos 	  if (most_match_errmsg[0] == 0)
   3045  1.1.1.2  christos 	    /* xgettext:c-format.  */
   3046      1.1     skrll 	    as_bad (_("junk at end of line: `%s'"), str);
   3047      1.1     skrll 	  else
   3048      1.1     skrll 	    as_bad ("%s: %s", copy_of_instruction, most_match_errmsg);
   3049      1.1     skrll 
   3050      1.1     skrll 	  if (*input_line_pointer == ']')
   3051      1.1     skrll 	    ++input_line_pointer;
   3052      1.1     skrll 
   3053      1.1     skrll 	  ignore_rest_of_line ();
   3054  1.1.1.2  christos 	  input_line_pointer = saved_input_line_pointer;
   3055  1.1.1.2  christos 	  return;
   3056  1.1.1.2  christos 	}
   3057      1.1     skrll 
   3058      1.1     skrll       if (warningmsg != NULL)
   3059      1.1     skrll 	as_warn ("%s", warningmsg);
   3060      1.1     skrll       break;
   3061      1.1     skrll     }
   3062      1.1     skrll 
   3063      1.1     skrll   input_line_pointer = str;
   3064      1.1     skrll 
   3065      1.1     skrll   /* Tie dwarf2 debug info to the address at the start of the insn.
   3066      1.1     skrll      We can't do this after the insn has been output as the current
   3067      1.1     skrll      frag may have been closed off.  eg. by frag_var.  */
   3068      1.1     skrll   dwarf2_emit_insn (0);
   3069      1.1     skrll 
   3070      1.1     skrll   /* Write out the instruction.  */
   3071      1.1     skrll   if (relaxable && fc > 0)
   3072      1.1     skrll     {
   3073  1.1.1.3  christos       insn_size = 2;
   3074      1.1     skrll       fc = 0;
   3075  1.1.1.3  christos 
   3076  1.1.1.3  christos       if (strcmp (opcode->name, "loop") == 0)
   3077  1.1.1.3  christos 	{
   3078  1.1.1.3  christos 	  if (((processor_mask & PROCESSOR_V850E3V5_UP) == 0) || default_disp_size == 22)
   3079  1.1.1.3  christos 	    {
   3080  1.1.1.3  christos 	      insn_size = 4;
   3081  1.1.1.3  christos 	      f = frag_var (rs_machine_dependent, 6, 2, SUBYPTE_LOOP_16_22,
   3082  1.1.1.3  christos 			    fixups[0].exp.X_add_symbol,
   3083  1.1.1.3  christos 			    fixups[0].exp.X_add_number,
   3084  1.1.1.3  christos 			    (char *)(size_t) fixups[0].opindex);
   3085  1.1.1.3  christos 	      md_number_to_chars (f, insn, insn_size);
   3086  1.1.1.3  christos 	      md_number_to_chars (f+4, 0, 4);
   3087  1.1.1.3  christos 	    }
   3088  1.1.1.3  christos 	  else
   3089  1.1.1.3  christos 	    {
   3090  1.1.1.3  christos 	      as_bad (_("loop: 32-bit displacement not supported"));
   3091  1.1.1.3  christos 	    }
   3092  1.1.1.3  christos 	}
   3093  1.1.1.3  christos       else if (strcmp (opcode->name, "br") == 0
   3094  1.1.1.2  christos 	       || strcmp (opcode->name, "jbr") == 0)
   3095  1.1.1.2  christos 	{
   3096  1.1.1.2  christos 	  if ((processor_mask & PROCESSOR_V850E2_UP) == 0 || default_disp_size == 22)
   3097  1.1.1.2  christos 	    {
   3098  1.1.1.2  christos 	      f = frag_var (rs_machine_dependent, 4, 2, SUBYPTE_UNCOND_9_22,
   3099  1.1.1.2  christos 			    fixups[0].exp.X_add_symbol,
   3100  1.1.1.2  christos 			    fixups[0].exp.X_add_number,
   3101  1.1.1.2  christos 			    (char *)(size_t) fixups[0].opindex);
   3102  1.1.1.2  christos 	      md_number_to_chars (f, insn, insn_size);
   3103  1.1.1.2  christos 	      md_number_to_chars (f + 2, 0, 2);
   3104  1.1.1.2  christos 	    }
   3105  1.1.1.2  christos 	  else
   3106  1.1.1.2  christos 	    {
   3107  1.1.1.2  christos 	      f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_UNCOND_9_22_32,
   3108  1.1.1.2  christos 			    fixups[0].exp.X_add_symbol,
   3109  1.1.1.2  christos 			    fixups[0].exp.X_add_number,
   3110  1.1.1.2  christos 			    (char *)(size_t) fixups[0].opindex);
   3111      1.1     skrll 	      md_number_to_chars (f, insn, insn_size);
   3112  1.1.1.2  christos 	      md_number_to_chars (f + 2, 0, 4);
   3113      1.1     skrll 	    }
   3114  1.1.1.2  christos 	}
   3115  1.1.1.3  christos       else /* b<cond>, j<cond>.  */
   3116  1.1.1.2  christos 	{
   3117  1.1.1.3  christos 	  if (default_disp_size == 22
   3118  1.1.1.2  christos 	      || (processor_mask & PROCESSOR_V850E2_UP) == 0)
   3119  1.1.1.2  christos 	    {
   3120  1.1.1.2  christos 	      if (processor_mask & PROCESSOR_V850E2V3_UP && !no_bcond17)
   3121  1.1.1.2  christos 		{
   3122  1.1.1.2  christos 		  if (strcmp (opcode->name, "bsa") == 0)
   3123  1.1.1.2  christos 		    {
   3124  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_SA_9_17_22,
   3125  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3126  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3127  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3128  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3129  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 6);
   3130  1.1.1.2  christos 		    }
   3131  1.1.1.2  christos 		  else
   3132  1.1.1.2  christos 		    {
   3133  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_COND_9_17_22,
   3134  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3135  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3136  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3137  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3138  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 4);
   3139  1.1.1.2  christos 		    }
   3140  1.1.1.2  christos 		}
   3141  1.1.1.2  christos 	      else
   3142  1.1.1.2  christos 		{
   3143  1.1.1.2  christos 		  if (strcmp (opcode->name, "bsa") == 0)
   3144  1.1.1.2  christos 		    {
   3145  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_SA_9_22,
   3146  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3147  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3148  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3149  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3150  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 6);
   3151  1.1.1.2  christos 		    }
   3152  1.1.1.2  christos 		  else
   3153  1.1.1.2  christos 		    {
   3154  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_COND_9_22,
   3155  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3156  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3157  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3158  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3159  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 4);
   3160  1.1.1.2  christos 		    }
   3161  1.1.1.2  christos 		}
   3162  1.1.1.3  christos 	    }
   3163  1.1.1.2  christos 	  else
   3164  1.1.1.2  christos 	    {
   3165  1.1.1.2  christos 	      if (processor_mask & PROCESSOR_V850E2V3_UP && !no_bcond17)
   3166  1.1.1.2  christos 		{
   3167  1.1.1.2  christos 		  if (strcmp (opcode->name, "bsa") == 0)
   3168  1.1.1.2  christos 		    {
   3169  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 10, 8, SUBYPTE_SA_9_17_22_32,
   3170  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3171  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3172  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3173  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3174  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 8);
   3175  1.1.1.2  christos 		    }
   3176  1.1.1.2  christos 		  else
   3177  1.1.1.2  christos 		    {
   3178  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_COND_9_17_22_32,
   3179  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3180  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3181  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3182  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3183  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 6);
   3184  1.1.1.2  christos 		    }
   3185  1.1.1.2  christos 		}
   3186  1.1.1.2  christos 	      else
   3187  1.1.1.2  christos 		{
   3188  1.1.1.2  christos 		  if (strcmp (opcode->name, "bsa") == 0)
   3189  1.1.1.2  christos 		    {
   3190  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 10, 8, SUBYPTE_SA_9_22_32,
   3191  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3192  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3193  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3194  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3195  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 8);
   3196  1.1.1.2  christos 		    }
   3197  1.1.1.2  christos 		  else
   3198  1.1.1.2  christos 		    {
   3199  1.1.1.2  christos 		      f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_COND_9_22_32,
   3200  1.1.1.2  christos 				    fixups[0].exp.X_add_symbol,
   3201  1.1.1.2  christos 				    fixups[0].exp.X_add_number,
   3202  1.1.1.2  christos 				    (char *)(size_t) fixups[0].opindex);
   3203  1.1.1.2  christos 		      md_number_to_chars (f, insn, insn_size);
   3204  1.1.1.2  christos 		      md_number_to_chars (f + 2, 0, 6);
   3205      1.1     skrll 		    }
   3206      1.1     skrll 		}
   3207      1.1     skrll 	    }
   3208      1.1     skrll 	}
   3209      1.1     skrll     }
   3210      1.1     skrll   else
   3211      1.1     skrll     {
   3212      1.1     skrll       /* Four byte insns have an opcode with the two high bits on.  */
   3213      1.1     skrll       if ((insn & 0x0600) == 0x0600)
   3214      1.1     skrll 	insn_size = 4;
   3215      1.1     skrll       else
   3216      1.1     skrll 	insn_size = 2;
   3217      1.1     skrll 
   3218      1.1     skrll       /* Special case: 32 bit MOV.  */
   3219  1.1.1.2  christos       if ((insn & 0xffe0) == 0x0620)
   3220  1.1.1.2  christos 	insn_size = 2;
   3221  1.1.1.2  christos 
   3222  1.1.1.2  christos       /* Special case: 32 bit JARL,JMP,JR.  */
   3223  1.1.1.2  christos       if ((insn & 0x1ffe0) == 0x2e0	/* JARL.  */
   3224  1.1.1.2  christos 	  || (insn & 0x1ffe0) == 0x6e0	/* JMP.  */
   3225  1.1.1.3  christos 	  || (insn & 0x1ffff) == 0x2e0)	/* JR.  */
   3226  1.1.1.3  christos 	insn_size = 2;
   3227  1.1.1.3  christos 
   3228  1.1.1.3  christos       if (obstack_room (& frchain_now->frch_obstack) < (insn_size + extra_data_len))
   3229  1.1.1.3  christos 	{
   3230  1.1.1.3  christos           frag_wane (frag_now);
   3231      1.1     skrll           frag_new (0);
   3232      1.1     skrll 	}
   3233      1.1     skrll 
   3234      1.1     skrll       f = frag_more (insn_size);
   3235      1.1     skrll       md_number_to_chars (f, insn, insn_size);
   3236      1.1     skrll 
   3237      1.1     skrll       if (extra_data_after_insn)
   3238      1.1     skrll 	{
   3239      1.1     skrll 	  f = frag_more (extra_data_len);
   3240      1.1     skrll 	  md_number_to_chars (f, extra_data, extra_data_len);
   3241      1.1     skrll 
   3242      1.1     skrll 	  extra_data_after_insn = FALSE;
   3243      1.1     skrll 	}
   3244      1.1     skrll     }
   3245      1.1     skrll 
   3246      1.1     skrll   /* Create any fixups.  At this point we do not use a
   3247      1.1     skrll      bfd_reloc_code_real_type, but instead just use the
   3248      1.1     skrll      BFD_RELOC_UNUSED plus the operand index.  This lets us easily
   3249      1.1     skrll      handle fixups for any operand type, although that is admittedly
   3250      1.1     skrll      not a very exciting feature.  We pick a BFD reloc type in
   3251      1.1     skrll      md_apply_fix.  */
   3252      1.1     skrll   for (i = 0; i < fc; i++)
   3253      1.1     skrll     {
   3254      1.1     skrll       const struct v850_operand *operand;
   3255      1.1     skrll       bfd_reloc_code_real_type reloc;
   3256      1.1     skrll 
   3257      1.1     skrll       operand = &v850_operands[fixups[i].opindex];
   3258  1.1.1.3  christos 
   3259      1.1     skrll       reloc = fixups[i].reloc;
   3260      1.1     skrll 
   3261      1.1     skrll       if (reloc != BFD_RELOC_NONE)
   3262      1.1     skrll 	{
   3263      1.1     skrll 	  reloc_howto_type *reloc_howto =
   3264      1.1     skrll 	    bfd_reloc_type_lookup (stdoutput, reloc);
   3265      1.1     skrll 	  int size;
   3266      1.1     skrll 	  int address;
   3267      1.1     skrll 	  fixS *fixP;
   3268      1.1     skrll 
   3269      1.1     skrll 	  if (!reloc_howto)
   3270      1.1     skrll 	    abort ();
   3271      1.1     skrll 
   3272      1.1     skrll 	  size = bfd_get_reloc_size (reloc_howto);
   3273      1.1     skrll 
   3274      1.1     skrll 	  /* XXX This will abort on an R_V850_8 reloc -
   3275      1.1     skrll 	     is this reloc actually used?  */
   3276  1.1.1.2  christos 	  if (size != 2 && size != 4)
   3277  1.1.1.2  christos 	    abort ();
   3278  1.1.1.2  christos 
   3279  1.1.1.2  christos 	  if (extra_data_len == 0)
   3280  1.1.1.2  christos 	    {
   3281  1.1.1.2  christos 	      address = (f - frag_now->fr_literal) + insn_size - size;
   3282  1.1.1.2  christos 	    }
   3283  1.1.1.2  christos 	  else
   3284      1.1     skrll 	    {
   3285  1.1.1.2  christos 	      address = (f - frag_now->fr_literal) + extra_data_len - size;
   3286  1.1.1.2  christos 	    }
   3287  1.1.1.2  christos 
   3288  1.1.1.2  christos 	  if ((operand->flags & V850E_IMMEDIATE32) && (operand->flags & V850_PCREL))
   3289  1.1.1.2  christos 	    {
   3290  1.1.1.2  christos 	      fixups[i].exp.X_add_number += 2;
   3291  1.1.1.2  christos 	    }
   3292  1.1.1.2  christos 	  else if (operand->default_reloc ==  BFD_RELOC_V850_16_PCREL)
   3293  1.1.1.2  christos 	    {
   3294      1.1     skrll 	      fixups[i].exp.X_add_number += 2;
   3295  1.1.1.2  christos 	      address += 2;
   3296      1.1     skrll 	    }
   3297      1.1     skrll 
   3298      1.1     skrll 	  /* fprintf (stderr, "0x%x %d %ld\n", address, size, fixups[i].exp.X_add_number);  */
   3299      1.1     skrll 	  fixP = fix_new_exp (frag_now, address, size,
   3300      1.1     skrll 			      &fixups[i].exp,
   3301      1.1     skrll 			      reloc_howto->pc_relative,
   3302      1.1     skrll 			      reloc);
   3303      1.1     skrll 
   3304      1.1     skrll 	  fixP->tc_fix_data = (void *) operand;
   3305      1.1     skrll 
   3306  1.1.1.2  christos 	  switch (reloc)
   3307      1.1     skrll 	    {
   3308      1.1     skrll 	    case BFD_RELOC_LO16:
   3309      1.1     skrll 	    case BFD_RELOC_V850_LO16_S1:
   3310      1.1     skrll 	    case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
   3311      1.1     skrll 	    case BFD_RELOC_HI16:
   3312      1.1     skrll 	    case BFD_RELOC_HI16_S:
   3313      1.1     skrll 	      fixP->fx_no_overflow = 1;
   3314      1.1     skrll 	      break;
   3315      1.1     skrll 	    default:
   3316      1.1     skrll 	      break;
   3317      1.1     skrll 	    }
   3318  1.1.1.3  christos 	}
   3319      1.1     skrll       else
   3320      1.1     skrll 	{
   3321      1.1     skrll 	  gas_assert (f != NULL);
   3322  1.1.1.2  christos 	  fix_new_exp (frag_now,
   3323      1.1     skrll 		       f - frag_now->fr_literal, 4,
   3324      1.1     skrll 		       & fixups[i].exp,
   3325      1.1     skrll 		       (operand->flags & V850_PCREL) != 0,
   3326      1.1     skrll 		       (bfd_reloc_code_real_type) (fixups[i].opindex
   3327      1.1     skrll 						   + (int) BFD_RELOC_UNUSED));
   3328      1.1     skrll 	}
   3329      1.1     skrll     }
   3330      1.1     skrll 
   3331      1.1     skrll   input_line_pointer = saved_input_line_pointer;
   3332      1.1     skrll }
   3333      1.1     skrll 
   3334      1.1     skrll /* If while processing a fixup, a reloc really needs to be created
   3335      1.1     skrll    then it is done here.  */
   3336      1.1     skrll 
   3337      1.1     skrll arelent *
   3338      1.1     skrll tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
   3339  1.1.1.4  christos {
   3340  1.1.1.4  christos   arelent *reloc;
   3341      1.1     skrll 
   3342      1.1     skrll   reloc		      = XNEW (arelent);
   3343      1.1     skrll   reloc->sym_ptr_ptr  = XNEW (asymbol *);
   3344      1.1     skrll   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   3345      1.1     skrll   reloc->address      = fixp->fx_frag->fr_address + fixp->fx_where;
   3346      1.1     skrll 
   3347      1.1     skrll   if (   fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
   3348      1.1     skrll       || fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   3349      1.1     skrll       || fixp->fx_r_type == BFD_RELOC_V850_LONGCALL
   3350      1.1     skrll       || fixp->fx_r_type == BFD_RELOC_V850_LONGJUMP
   3351      1.1     skrll       || fixp->fx_r_type == BFD_RELOC_V850_ALIGN)
   3352  1.1.1.2  christos     reloc->addend = fixp->fx_offset;
   3353      1.1     skrll   else
   3354      1.1     skrll     {
   3355      1.1     skrll #if 0
   3356  1.1.1.2  christos       if (fixp->fx_r_type == BFD_RELOC_32
   3357      1.1     skrll 	  && fixp->fx_pcrel)
   3358      1.1     skrll 	fixp->fx_r_type = BFD_RELOC_32_PCREL;
   3359      1.1     skrll #endif
   3360      1.1     skrll 
   3361      1.1     skrll       reloc->addend = fixp->fx_addnumber;
   3362      1.1     skrll     }
   3363      1.1     skrll 
   3364      1.1     skrll   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
   3365      1.1     skrll 
   3366      1.1     skrll   if (reloc->howto == NULL)
   3367      1.1     skrll     {
   3368      1.1     skrll       as_bad_where (fixp->fx_file, fixp->fx_line,
   3369      1.1     skrll 		    /* xgettext:c-format  */
   3370      1.1     skrll 		    _("reloc %d not supported by object file format"),
   3371      1.1     skrll 		    (int) fixp->fx_r_type);
   3372      1.1     skrll 
   3373      1.1     skrll       xfree (reloc);
   3374      1.1     skrll 
   3375      1.1     skrll       return NULL;
   3376      1.1     skrll     }
   3377      1.1     skrll 
   3378      1.1     skrll   return reloc;
   3379      1.1     skrll }
   3380      1.1     skrll 
   3381      1.1     skrll void
   3382      1.1     skrll v850_handle_align (fragS * frag)
   3383      1.1     skrll {
   3384      1.1     skrll   if (v850_relax
   3385      1.1     skrll       && frag->fr_type == rs_align
   3386      1.1     skrll       && frag->fr_address + frag->fr_fix > 0
   3387      1.1     skrll       && frag->fr_offset > 1
   3388      1.1     skrll       && now_seg != bss_section
   3389      1.1     skrll       && now_seg != v850_seg_table[SBSS_SECTION].s
   3390      1.1     skrll       && now_seg != v850_seg_table[TBSS_SECTION].s
   3391      1.1     skrll       && now_seg != v850_seg_table[ZBSS_SECTION].s)
   3392      1.1     skrll     fix_new (frag, frag->fr_fix, 2, & abs_symbol, frag->fr_offset, 0,
   3393      1.1     skrll 	     BFD_RELOC_V850_ALIGN);
   3394      1.1     skrll }
   3395      1.1     skrll 
   3396      1.1     skrll /* Return current size of variable part of frag.  */
   3397      1.1     skrll 
   3398      1.1     skrll int
   3399      1.1     skrll md_estimate_size_before_relax (fragS *fragp, asection *seg ATTRIBUTE_UNUSED)
   3400      1.1     skrll {
   3401      1.1     skrll   if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
   3402      1.1     skrll     abort ();
   3403      1.1     skrll 
   3404      1.1     skrll   return md_relax_table[fragp->fr_subtype].rlx_length;
   3405      1.1     skrll }
   3406      1.1     skrll 
   3407      1.1     skrll long
   3408      1.1     skrll v850_pcrel_from_section (fixS *fixp, segT section)
   3409      1.1     skrll {
   3410      1.1     skrll   /* If the symbol is undefined, or in a section other than our own,
   3411      1.1     skrll      or it is weak (in which case it may well be in another section,
   3412      1.1     skrll      then let the linker figure it out.  */
   3413      1.1     skrll   if (fixp->fx_addsy != (symbolS *) NULL
   3414      1.1     skrll       && (! S_IS_DEFINED (fixp->fx_addsy)
   3415      1.1     skrll 	  || S_IS_WEAK (fixp->fx_addsy)
   3416      1.1     skrll 	  || (S_GET_SEGMENT (fixp->fx_addsy) != section)))
   3417      1.1     skrll     return 0;
   3418      1.1     skrll 
   3419      1.1     skrll   return fixp->fx_frag->fr_address + fixp->fx_where;
   3420      1.1     skrll }
   3421      1.1     skrll 
   3422      1.1     skrll void
   3423      1.1     skrll md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
   3424      1.1     skrll {
   3425      1.1     skrll   valueT value = * valueP;
   3426      1.1     skrll   char *where;
   3427      1.1     skrll 
   3428      1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   3429      1.1     skrll       || fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
   3430      1.1     skrll       || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP
   3431      1.1     skrll       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
   3432      1.1     skrll     {
   3433      1.1     skrll       fixP->fx_done = 0;
   3434      1.1     skrll       return;
   3435      1.1     skrll     }
   3436      1.1     skrll 
   3437      1.1     skrll   if (fixP->fx_addsy == (symbolS *) NULL)
   3438      1.1     skrll     fixP->fx_addnumber = value,
   3439      1.1     skrll     fixP->fx_done = 1;
   3440      1.1     skrll 
   3441      1.1     skrll   else if (fixP->fx_pcrel)
   3442      1.1     skrll     fixP->fx_addnumber = fixP->fx_offset;
   3443      1.1     skrll 
   3444      1.1     skrll   else
   3445      1.1     skrll     {
   3446      1.1     skrll       value = fixP->fx_offset;
   3447      1.1     skrll       if (fixP->fx_subsy != (symbolS *) NULL)
   3448      1.1     skrll 	{
   3449      1.1     skrll 	  if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)
   3450      1.1     skrll 	    value -= S_GET_VALUE (fixP->fx_subsy);
   3451      1.1     skrll 	  else
   3452      1.1     skrll 	    /* We don't actually support subtracting a symbol.  */
   3453      1.1     skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   3454      1.1     skrll 			  _("expression too complex"));
   3455      1.1     skrll 	}
   3456      1.1     skrll       fixP->fx_addnumber = value;
   3457      1.1     skrll     }
   3458      1.1     skrll 
   3459      1.1     skrll   if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
   3460      1.1     skrll     {
   3461  1.1.1.2  christos       int opindex;
   3462      1.1     skrll       const struct v850_operand *operand;
   3463      1.1     skrll       unsigned long insn;
   3464      1.1     skrll       const char *errmsg = NULL;
   3465      1.1     skrll 
   3466      1.1     skrll       opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
   3467      1.1     skrll       operand = &v850_operands[opindex];
   3468      1.1     skrll 
   3469      1.1     skrll       /* Fetch the instruction, insert the fully resolved operand
   3470      1.1     skrll 	 value, and stuff the instruction back again.
   3471      1.1     skrll 
   3472      1.1     skrll 	 Note the instruction has been stored in little endian
   3473  1.1.1.2  christos 	 format!  */
   3474  1.1.1.2  christos       where = fixP->fx_frag->fr_literal + fixP->fx_where;
   3475  1.1.1.2  christos 
   3476  1.1.1.2  christos       if (fixP->fx_size > 2)
   3477  1.1.1.2  christos 	insn = bfd_getl32 ((unsigned char *) where);
   3478  1.1.1.5  christos       else
   3479  1.1.1.3  christos 	insn = bfd_getl16 ((unsigned char *) where);
   3480  1.1.1.3  christos 
   3481  1.1.1.3  christos       /* When inserting loop offsets a backwards displacement
   3482  1.1.1.3  christos 	 is encoded as a positive value.  */
   3483      1.1     skrll       if (operand->flags & V850_INVERSE_PCREL)
   3484  1.1.1.2  christos 	value = - value;
   3485  1.1.1.2  christos 
   3486  1.1.1.2  christos       insn = v850_insert_operand (insn, operand, (offsetT) value,
   3487  1.1.1.2  christos 				  &errmsg);
   3488  1.1.1.2  christos       if (errmsg)
   3489  1.1.1.2  christos 	as_warn_where (fixP->fx_file, fixP->fx_line, "%s", errmsg);
   3490  1.1.1.2  christos 
   3491  1.1.1.2  christos       if (fixP->fx_size > 2)
   3492      1.1     skrll 	bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
   3493      1.1     skrll       else
   3494      1.1     skrll 	bfd_putl16 ((bfd_vma) insn, (unsigned char *) where);
   3495      1.1     skrll 
   3496      1.1     skrll       if (fixP->fx_done)
   3497      1.1     skrll 	/* Nothing else to do here.  */
   3498      1.1     skrll 	return;
   3499      1.1     skrll 
   3500  1.1.1.2  christos       /* Determine a BFD reloc value based on the operand information.
   3501      1.1     skrll 	 We are only prepared to turn a few of the operands into relocs.  */
   3502      1.1     skrll 
   3503      1.1     skrll       if (operand->default_reloc == BFD_RELOC_NONE)
   3504      1.1     skrll 	{
   3505      1.1     skrll 	  as_bad_where (fixP->fx_file, fixP->fx_line,
   3506      1.1     skrll 			_("unresolved expression that must be resolved"));
   3507  1.1.1.2  christos 	  fixP->fx_done = 1;
   3508  1.1.1.2  christos 	  return;
   3509  1.1.1.2  christos 	}
   3510  1.1.1.2  christos 
   3511  1.1.1.2  christos       {
   3512  1.1.1.2  christos 	fixP->fx_r_type = operand->default_reloc;
   3513  1.1.1.2  christos 	if (operand->default_reloc ==  BFD_RELOC_V850_16_PCREL)
   3514  1.1.1.2  christos 	  {
   3515  1.1.1.2  christos 	    fixP->fx_where += 2;
   3516  1.1.1.2  christos 	    fixP->fx_size = 2;
   3517      1.1     skrll 	    fixP->fx_addnumber += 2;
   3518      1.1     skrll 	  }
   3519      1.1     skrll       }
   3520      1.1     skrll     }
   3521      1.1     skrll   else if (fixP->fx_done)
   3522      1.1     skrll     {
   3523      1.1     skrll       /* We still have to insert the value into memory!  */
   3524  1.1.1.2  christos       where = fixP->fx_frag->fr_literal + fixP->fx_where;
   3525  1.1.1.2  christos 
   3526  1.1.1.2  christos       if (fixP->tc_fix_data != NULL
   3527  1.1.1.2  christos           && ((struct v850_operand *) fixP->tc_fix_data)->insert != NULL)
   3528  1.1.1.2  christos         {
   3529  1.1.1.2  christos           const char * message = NULL;
   3530  1.1.1.2  christos           struct v850_operand * operand = (struct v850_operand *) fixP->tc_fix_data;
   3531  1.1.1.2  christos           unsigned long insn;
   3532  1.1.1.2  christos 
   3533  1.1.1.2  christos           /* The variable "where" currently points at the exact point inside
   3534  1.1.1.2  christos              the insn where we need to insert the value.  But we need to
   3535  1.1.1.2  christos              extract the entire insn so we probably need to move "where"
   3536  1.1.1.2  christos              back a few bytes.  */
   3537  1.1.1.2  christos 
   3538  1.1.1.2  christos           if (fixP->fx_size == 2)
   3539  1.1.1.2  christos             where -= 2;
   3540  1.1.1.2  christos           else if (fixP->fx_size == 1)
   3541  1.1.1.2  christos             where -= 3;
   3542  1.1.1.2  christos 
   3543  1.1.1.2  christos           insn = bfd_getl32 ((unsigned char *) where);
   3544  1.1.1.2  christos 
   3545  1.1.1.2  christos           /* Use the operand's insertion procedure, if present, in order to
   3546      1.1     skrll              make sure that the value is correctly stored in the insn.  */
   3547  1.1.1.2  christos           insn = operand->insert (insn, (offsetT) value, & message);
   3548  1.1.1.2  christos           /* Ignore message even if it is set.  */
   3549      1.1     skrll 
   3550  1.1.1.2  christos           bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
   3551  1.1.1.2  christos         }
   3552  1.1.1.2  christos       else
   3553  1.1.1.2  christos         {
   3554  1.1.1.2  christos 	  switch (fixP->fx_r_type)
   3555  1.1.1.2  christos 	    {
   3556  1.1.1.2  christos 	    case BFD_RELOC_V850_32_ABS:
   3557  1.1.1.2  christos 	    case BFD_RELOC_V850_32_PCREL:
   3558  1.1.1.2  christos 	      bfd_putl32 (value & 0xfffffffe, (unsigned char *) where);
   3559  1.1.1.2  christos 	      break;
   3560  1.1.1.2  christos 
   3561  1.1.1.2  christos 	    case BFD_RELOC_32:
   3562  1.1.1.2  christos 	      bfd_putl32 (value, (unsigned char *) where);
   3563  1.1.1.2  christos 	      break;
   3564  1.1.1.2  christos 
   3565  1.1.1.2  christos 	    case BFD_RELOC_V850_23:
   3566  1.1.1.2  christos 	      bfd_putl32 (((value & 0x7f) << 4) | ((value & 0x7fff80) << (16-7))
   3567  1.1.1.2  christos 			  | (bfd_getl32 (where) & ~((0x7f << 4) | (0xffff << 16))),
   3568  1.1.1.2  christos 			  (unsigned char *) where);
   3569  1.1.1.2  christos 	    break;
   3570  1.1.1.2  christos 
   3571  1.1.1.2  christos 	    case BFD_RELOC_16:
   3572  1.1.1.2  christos 	    case BFD_RELOC_HI16:
   3573  1.1.1.2  christos 	    case BFD_RELOC_HI16_S:
   3574  1.1.1.2  christos 	    case BFD_RELOC_LO16:
   3575  1.1.1.2  christos 	    case BFD_RELOC_V850_ZDA_16_16_OFFSET:
   3576  1.1.1.2  christos 	    case BFD_RELOC_V850_SDA_16_16_OFFSET:
   3577  1.1.1.2  christos 	    case BFD_RELOC_V850_TDA_16_16_OFFSET:
   3578  1.1.1.2  christos 	    case BFD_RELOC_V850_CALLT_16_16_OFFSET:
   3579  1.1.1.2  christos 	      bfd_putl16 (value & 0xffff, (unsigned char *) where);
   3580  1.1.1.2  christos 	      break;
   3581  1.1.1.2  christos 
   3582  1.1.1.2  christos 	    case BFD_RELOC_8:
   3583  1.1.1.2  christos 	      *where = value & 0xff;
   3584  1.1.1.2  christos 	      break;
   3585  1.1.1.2  christos 
   3586  1.1.1.2  christos 	    case BFD_RELOC_V850_9_PCREL:
   3587  1.1.1.2  christos 	      bfd_putl16 (((value & 0x1f0) << 7) | ((value & 0x0e) << 3)
   3588  1.1.1.2  christos 			  | (bfd_getl16 (where) & ~((0x1f0 << 7) | (0x0e << 3))), where);
   3589  1.1.1.2  christos 	      break;
   3590  1.1.1.2  christos 
   3591  1.1.1.2  christos 	    case BFD_RELOC_V850_17_PCREL:
   3592  1.1.1.2  christos 	      bfd_putl32 (((value & 0x10000) >> (16 - 4)) | ((value & 0xfffe) << 16)
   3593  1.1.1.2  christos 			  | (bfd_getl32 (where) & ~((0x10000 >> (16 - 4)) | (0xfffe << 16))), where);
   3594  1.1.1.3  christos 	      break;
   3595  1.1.1.3  christos 
   3596  1.1.1.2  christos 	    case BFD_RELOC_V850_16_PCREL:
   3597  1.1.1.2  christos 	      bfd_putl16 ((-value & 0xfffe) | (bfd_getl16 (where + 2) & 0x0001),
   3598  1.1.1.2  christos 			  (unsigned char *) (where + 2));
   3599  1.1.1.2  christos 	      break;
   3600  1.1.1.2  christos 
   3601  1.1.1.2  christos 	    case BFD_RELOC_V850_22_PCREL:
   3602  1.1.1.2  christos 	      bfd_putl32 (((value & 0xfffe) << 16) | ((value & 0x3f0000) >> 16)
   3603  1.1.1.2  christos 			  | (bfd_getl32 (where) & ~((0xfffe << 16) | (0x3f0000 >> 16))), where);
   3604  1.1.1.2  christos 	      break;
   3605  1.1.1.2  christos 
   3606  1.1.1.2  christos 	    case BFD_RELOC_V850_16_S1:
   3607  1.1.1.2  christos 	    case BFD_RELOC_V850_LO16_S1:
   3608  1.1.1.2  christos 	    case BFD_RELOC_V850_ZDA_15_16_OFFSET:
   3609  1.1.1.2  christos 	    case BFD_RELOC_V850_SDA_15_16_OFFSET:
   3610  1.1.1.2  christos 	      bfd_putl16 (value & 0xfffe, (unsigned char *) where);
   3611  1.1.1.2  christos 	      break;
   3612  1.1.1.2  christos 
   3613  1.1.1.2  christos 	    case BFD_RELOC_V850_16_SPLIT_OFFSET:
   3614  1.1.1.2  christos 	    case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
   3615  1.1.1.2  christos 	    case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET:
   3616  1.1.1.2  christos 	    case BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET:
   3617  1.1.1.2  christos 	      bfd_putl32 (((value << 16) & 0xfffe0000)
   3618  1.1.1.2  christos 			  | ((value << 5) & 0x20)
   3619  1.1.1.2  christos 			  | (bfd_getl32 (where) & ~0xfffe0020), where);
   3620  1.1.1.2  christos 	      break;
   3621  1.1.1.2  christos 
   3622  1.1.1.2  christos 	    case BFD_RELOC_V850_TDA_6_8_OFFSET:
   3623  1.1.1.2  christos 	      *where = (*where & ~0x7e) | ((value >> 1) & 0x7e);
   3624  1.1.1.2  christos 	      break;
   3625  1.1.1.2  christos 
   3626  1.1.1.2  christos 	    case BFD_RELOC_V850_TDA_7_8_OFFSET:
   3627  1.1.1.2  christos 	      *where = (*where & ~0x7f) | ((value >> 1) & 0x7f);
   3628  1.1.1.2  christos 	      break;
   3629  1.1.1.2  christos 
   3630  1.1.1.2  christos 	    case BFD_RELOC_V850_TDA_7_7_OFFSET:
   3631  1.1.1.2  christos 	      *where = (*where & ~0x7f) | (value & 0x7f);
   3632  1.1.1.2  christos 	      break;
   3633  1.1.1.2  christos 
   3634  1.1.1.2  christos 	    case BFD_RELOC_V850_TDA_4_5_OFFSET:
   3635  1.1.1.2  christos 	      *where = (*where & ~0xf) | ((value >> 1) & 0xf);
   3636  1.1.1.2  christos 	      break;
   3637  1.1.1.2  christos 
   3638  1.1.1.2  christos 	    case BFD_RELOC_V850_TDA_4_4_OFFSET:
   3639  1.1.1.2  christos 	      *where = (*where & ~0xf) | (value & 0xf);
   3640  1.1.1.2  christos 	      break;
   3641  1.1.1.2  christos 
   3642  1.1.1.2  christos 	    case BFD_RELOC_V850_CALLT_6_7_OFFSET:
   3643  1.1.1.2  christos 	      *where = (*where & ~0x3f) | (value & 0x3f);
   3644  1.1.1.2  christos 	      break;
   3645  1.1.1.2  christos 
   3646  1.1.1.2  christos 	    default:
   3647      1.1     skrll 	      abort ();
   3648      1.1     skrll 	    }
   3649  1.1.1.2  christos         }
   3650      1.1     skrll     }
   3651      1.1     skrll }
   3652      1.1     skrll 
   3653  1.1.1.3  christos /* Parse a cons expression.  We have to handle hi(), lo(), etc
   3654      1.1     skrll    on the v850.  */
   3655      1.1     skrll 
   3656  1.1.1.2  christos bfd_reloc_code_real_type
   3657  1.1.1.3  christos parse_cons_expression_v850 (expressionS *exp)
   3658  1.1.1.3  christos {
   3659      1.1     skrll   const char *errmsg;
   3660  1.1.1.3  christos   bfd_reloc_code_real_type r;
   3661      1.1     skrll 
   3662      1.1     skrll   /* See if there's a reloc prefix like hi() we have to handle.  */
   3663      1.1     skrll   r = v850_reloc_prefix (NULL, &errmsg);
   3664  1.1.1.3  christos 
   3665      1.1     skrll   /* Do normal expression parsing.  */
   3666      1.1     skrll   expression (exp);
   3667      1.1     skrll   return r;
   3668      1.1     skrll }
   3669      1.1     skrll 
   3670      1.1     skrll /* Create a fixup for a cons expression.  If parse_cons_expression_v850
   3671      1.1     skrll    found a reloc prefix, then we use that reloc, else we choose an
   3672      1.1     skrll    appropriate one based on the size of the expression.  */
   3673      1.1     skrll 
   3674      1.1     skrll void
   3675  1.1.1.3  christos cons_fix_new_v850 (fragS *frag,
   3676  1.1.1.3  christos 		   int where,
   3677      1.1     skrll 		   int size,
   3678  1.1.1.3  christos 		   expressionS *exp,
   3679      1.1     skrll 		   bfd_reloc_code_real_type r)
   3680      1.1     skrll {
   3681  1.1.1.3  christos   if (r == BFD_RELOC_NONE)
   3682      1.1     skrll     {
   3683  1.1.1.3  christos       if (size == 4)
   3684      1.1     skrll 	r = BFD_RELOC_32;
   3685  1.1.1.3  christos       if (size == 2)
   3686      1.1     skrll 	r = BFD_RELOC_16;
   3687      1.1     skrll       if (size == 1)
   3688      1.1     skrll 	r = BFD_RELOC_8;
   3689  1.1.1.3  christos     }
   3690      1.1     skrll 
   3691  1.1.1.3  christos   if (exp != NULL)
   3692      1.1     skrll     fix_new_exp (frag, where, size, exp, 0, r);
   3693      1.1     skrll   else
   3694      1.1     skrll     fix_new (frag, where, size, NULL, 0, 0, r);
   3695      1.1     skrll }
   3696      1.1     skrll 
   3697      1.1     skrll bfd_boolean
   3698      1.1     skrll v850_fix_adjustable (fixS *fixP)
   3699      1.1     skrll {
   3700      1.1     skrll   if (fixP->fx_addsy == NULL)
   3701      1.1     skrll     return 1;
   3702      1.1     skrll 
   3703      1.1     skrll   /* Don't adjust function names.  */
   3704      1.1     skrll   if (S_IS_FUNCTION (fixP->fx_addsy))
   3705      1.1     skrll     return 0;
   3706      1.1     skrll 
   3707      1.1     skrll   /* We need the symbol name for the VTABLE entries.  */
   3708      1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   3709      1.1     skrll       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
   3710      1.1     skrll     return 0;
   3711      1.1     skrll 
   3712      1.1     skrll   return 1;
   3713      1.1     skrll }
   3714      1.1     skrll 
   3715      1.1     skrll int
   3716      1.1     skrll v850_force_relocation (struct fix *fixP)
   3717      1.1     skrll {
   3718      1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
   3719      1.1     skrll       || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP)
   3720      1.1     skrll     return 1;
   3721      1.1     skrll 
   3722      1.1     skrll   if (v850_relax
   3723  1.1.1.2  christos       && (fixP->fx_pcrel
   3724  1.1.1.2  christos 	  || fixP->fx_r_type == BFD_RELOC_V850_ALIGN
   3725  1.1.1.2  christos 	  || fixP->fx_r_type == BFD_RELOC_V850_9_PCREL
   3726  1.1.1.2  christos 	  || fixP->fx_r_type == BFD_RELOC_V850_16_PCREL
   3727      1.1     skrll 	  || fixP->fx_r_type == BFD_RELOC_V850_17_PCREL
   3728      1.1     skrll 	  || fixP->fx_r_type == BFD_RELOC_V850_22_PCREL
   3729      1.1     skrll 	  || fixP->fx_r_type == BFD_RELOC_V850_32_PCREL
   3730      1.1     skrll 	  || fixP->fx_r_type >= BFD_RELOC_UNUSED))
   3731      1.1     skrll     return 1;
   3732  1.1.1.3  christos 
   3733  1.1.1.3  christos   return generic_force_reloc (fixP);
   3734  1.1.1.3  christos }
   3735  1.1.1.3  christos 
   3736  1.1.1.3  christos /* Create a v850 note section.  */
   3737  1.1.1.3  christos void
   3738  1.1.1.3  christos v850_md_end (void)
   3739  1.1.1.3  christos {
   3740  1.1.1.3  christos   segT note_sec;
   3741  1.1.1.3  christos   segT orig_seg = now_seg;
   3742  1.1.1.3  christos   subsegT orig_subseg = now_subseg;
   3743  1.1.1.6  christos   enum v850_notes id;
   3744  1.1.1.6  christos 
   3745  1.1.1.3  christos   note_sec = subseg_new (V850_NOTE_SECNAME, 0);
   3746  1.1.1.3  christos   bfd_set_section_flags (note_sec, SEC_HAS_CONTENTS | SEC_READONLY | SEC_MERGE);
   3747  1.1.1.3  christos   bfd_set_section_alignment (note_sec, 2);
   3748  1.1.1.3  christos 
   3749  1.1.1.3  christos   /* Provide default values for all of the notes.  */
   3750  1.1.1.3  christos   for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++)
   3751  1.1.1.3  christos     {
   3752  1.1.1.3  christos       int val = 0;
   3753  1.1.1.3  christos       char * p;
   3754  1.1.1.3  christos 
   3755  1.1.1.3  christos       /* Follow the standard note section layout:
   3756  1.1.1.3  christos 	 First write the length of the name string.  */
   3757  1.1.1.3  christos       p = frag_more (4);
   3758  1.1.1.3  christos       md_number_to_chars (p, 4, 4);
   3759  1.1.1.3  christos 
   3760  1.1.1.3  christos       /* Next comes the length of the "descriptor", i.e., the actual data.  */
   3761  1.1.1.3  christos       p = frag_more (4);
   3762  1.1.1.3  christos       md_number_to_chars (p, 4, 4);
   3763  1.1.1.3  christos 
   3764  1.1.1.3  christos       /* Write the note type.  */
   3765  1.1.1.3  christos       p = frag_more (4);
   3766  1.1.1.3  christos       md_number_to_chars (p, (valueT) id, 4);
   3767  1.1.1.3  christos 
   3768  1.1.1.3  christos       /* Write the name field.  */
   3769  1.1.1.3  christos       p = frag_more (4);
   3770  1.1.1.3  christos       memcpy (p, V850_NOTE_NAME, 4);
   3771  1.1.1.3  christos 
   3772  1.1.1.3  christos       /* Finally, write the descriptor.  */
   3773  1.1.1.3  christos       p = frag_more (4);
   3774  1.1.1.3  christos       switch (id)
   3775  1.1.1.3  christos 	{
   3776  1.1.1.3  christos 	case V850_NOTE_ALIGNMENT:
   3777  1.1.1.3  christos 	  val = v850_data_8 ? EF_RH850_DATA_ALIGN8 : EF_RH850_DATA_ALIGN4;
   3778  1.1.1.3  christos 	  break;
   3779  1.1.1.3  christos 
   3780  1.1.1.3  christos 	case V850_NOTE_DATA_SIZE:
   3781  1.1.1.3  christos 	  /* GCC does not currently support an option
   3782  1.1.1.3  christos 	     for 32-bit doubles with the V850 backend.  */
   3783  1.1.1.3  christos 	  val = EF_RH850_DOUBLE64;
   3784  1.1.1.3  christos 	  break;
   3785  1.1.1.3  christos 
   3786  1.1.1.3  christos 	case V850_NOTE_FPU_INFO:
   3787  1.1.1.3  christos 	  if (! soft_float)
   3788  1.1.1.3  christos 	    switch (machine)
   3789  1.1.1.3  christos 	      {
   3790  1.1.1.3  christos 	      case bfd_mach_v850e3v5: val = EF_RH850_FPU30; break;
   3791  1.1.1.3  christos 	      case bfd_mach_v850e2v3: val = EF_RH850_FPU20; break;
   3792  1.1.1.3  christos 	      default: break;
   3793  1.1.1.3  christos 	      }
   3794  1.1.1.3  christos 	  break;
   3795  1.1.1.3  christos 
   3796  1.1.1.3  christos 	default:
   3797  1.1.1.3  christos 	  break;
   3798  1.1.1.3  christos 	}
   3799  1.1.1.3  christos       md_number_to_chars (p, val, 4);
   3800  1.1.1.3  christos     }
   3801  1.1.1.3  christos 
   3802                      /* Paranoia - we probably do not need this.  */
   3803                      subseg_set (orig_seg, orig_subseg);
   3804                    }
   3805