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