1 1.1 skrll /* tc-sparc.c -- Assemble for the SPARC 2 1.10 christos Copyright (C) 1989-2026 Free Software Foundation, Inc. 3 1.1 skrll This file is part of GAS, the GNU Assembler. 4 1.1 skrll 5 1.1 skrll GAS is free software; you can redistribute it and/or modify 6 1.1 skrll it under the terms of the GNU General Public License as published by 7 1.1 skrll the Free Software Foundation; either version 3, or (at your option) 8 1.1 skrll any later version. 9 1.1 skrll 10 1.1 skrll GAS is distributed in the hope that it will be useful, 11 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of 12 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 1.1 skrll GNU General Public License for more details. 14 1.1 skrll 15 1.1 skrll You should have received a copy of the GNU General Public 16 1.1 skrll License along with GAS; see the file COPYING. If not, write 17 1.1 skrll to the Free Software Foundation, 51 Franklin Street - Fifth Floor, 18 1.1 skrll Boston, MA 02110-1301, USA. */ 19 1.1 skrll 20 1.1 skrll #include "as.h" 21 1.1 skrll #include "safe-ctype.h" 22 1.1 skrll #include "subsegs.h" 23 1.1 skrll 24 1.1 skrll #include "opcode/sparc.h" 25 1.1 skrll #include "dw2gencfi.h" 26 1.1 skrll 27 1.1 skrll #include "elf/sparc.h" 28 1.1 skrll #include "dwarf2dbg.h" 29 1.1 skrll 30 1.1 skrll /* Some ancient Sun C compilers would not take such hex constants as 31 1.1 skrll unsigned, and would end up sign-extending them to form an offsetT, 32 1.1 skrll so use these constants instead. */ 33 1.1 skrll #define U0xffffffff ((((unsigned long) 1 << 16) << 16) - 1) 34 1.1 skrll #define U0x80000000 ((((unsigned long) 1 << 16) << 15)) 35 1.1 skrll 36 1.1 skrll static int sparc_ip (char *, const struct sparc_opcode **); 37 1.4 christos static int parse_sparc_asi (char **, const sparc_asi **); 38 1.1 skrll static int parse_keyword_arg (int (*) (const char *), char **, int *); 39 1.1 skrll static int parse_const_expr_arg (char **, int *); 40 1.1 skrll static int get_expression (char *); 41 1.1 skrll 42 1.1 skrll /* Default architecture. */ 43 1.1 skrll /* ??? The default value should be V8, but sparclite support was added 44 1.1 skrll by making it the default. GCC now passes -Asparclite, so maybe sometime in 45 1.1 skrll the future we can set this to V8. */ 46 1.1 skrll #ifndef DEFAULT_ARCH 47 1.1 skrll #define DEFAULT_ARCH "sparclite" 48 1.1 skrll #endif 49 1.3 christos static const char *default_arch = DEFAULT_ARCH; 50 1.1 skrll 51 1.1 skrll /* Non-zero if the initial values of `max_architecture' and `sparc_arch_size' 52 1.1 skrll have been set. */ 53 1.1 skrll static int default_init_p; 54 1.1 skrll 55 1.1 skrll /* Current architecture. We don't bump up unless necessary. */ 56 1.1 skrll static enum sparc_opcode_arch_val current_architecture = SPARC_OPCODE_ARCH_V6; 57 1.1 skrll 58 1.1 skrll /* The maximum architecture level we can bump up to. 59 1.1 skrll In a 32 bit environment, don't allow bumping up to v9 by default. 60 1.1 skrll The native assembler works this way. The user is required to pass 61 1.1 skrll an explicit argument before we'll create v9 object files. However, if 62 1.1 skrll we don't see any v9 insns, a v8plus object file is not created. */ 63 1.1 skrll static enum sparc_opcode_arch_val max_architecture; 64 1.1 skrll 65 1.1 skrll /* Either 32 or 64, selects file format. */ 66 1.1 skrll static int sparc_arch_size; 67 1.1 skrll /* Initial (default) value, recorded separately in case a user option 68 1.1 skrll changes the value before md_show_usage is called. */ 69 1.1 skrll static int default_arch_size; 70 1.1 skrll 71 1.1 skrll /* The currently selected v9 memory model. Currently only used for 72 1.1 skrll ELF. */ 73 1.1 skrll static enum { MM_TSO, MM_PSO, MM_RMO } sparc_memory_model = MM_RMO; 74 1.2 joerg 75 1.2 joerg #ifndef TE_SOLARIS 76 1.2 joerg /* Bitmask of instruction types seen so far, used to populate the 77 1.2 joerg GNU attributes section with hwcap information. */ 78 1.7 christos static uint64_t hwcap_seen; 79 1.2 joerg #endif 80 1.1 skrll 81 1.7 christos static uint64_t hwcap_allowed; 82 1.2 joerg 83 1.1 skrll static int architecture_requested; 84 1.1 skrll static int warn_on_bump; 85 1.1 skrll 86 1.1 skrll /* If warn_on_bump and the needed architecture is higher than this 87 1.1 skrll architecture, issue a warning. */ 88 1.1 skrll static enum sparc_opcode_arch_val warn_after_architecture; 89 1.1 skrll 90 1.4 christos /* Non-zero if the assembler should generate error if an undeclared 91 1.4 christos g[23] register has been used in -64. */ 92 1.1 skrll static int no_undeclared_regs; 93 1.1 skrll 94 1.4 christos /* Non-zero if the assembler should generate a warning if an 95 1.4 christos unpredictable DCTI (delayed control transfer instruction) couple is 96 1.4 christos found. */ 97 1.4 christos static int dcti_couples_detect; 98 1.4 christos 99 1.1 skrll /* Non-zero if we should try to relax jumps and calls. */ 100 1.1 skrll static int sparc_relax; 101 1.1 skrll 102 1.1 skrll /* Non-zero if we are generating PIC code. */ 103 1.1 skrll int sparc_pic_code; 104 1.1 skrll 105 1.1 skrll /* Non-zero if we should give an error when misaligned data is seen. */ 106 1.1 skrll static int enforce_aligned_data; 107 1.1 skrll 108 1.1 skrll extern int target_big_endian; 109 1.1 skrll 110 1.1 skrll static int target_little_endian_data; 111 1.1 skrll 112 1.1 skrll /* Symbols for global registers on v9. */ 113 1.1 skrll static symbolS *globals[8]; 114 1.1 skrll 115 1.1 skrll /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */ 116 1.1 skrll int sparc_cie_data_alignment; 117 1.1 skrll 118 1.1 skrll /* V9 and 86x have big and little endian data, but instructions are always big 119 1.1 skrll endian. The sparclet has bi-endian support but both data and insns have 120 1.1 skrll the same endianness. Global `target_big_endian' is used for data. 121 1.1 skrll The following macro is used for instructions. */ 122 1.1 skrll #ifndef INSN_BIG_ENDIAN 123 1.1 skrll #define INSN_BIG_ENDIAN (target_big_endian \ 124 1.1 skrll || default_arch_type == sparc86x \ 125 1.1 skrll || SPARC_OPCODE_ARCH_V9_P (max_architecture)) 126 1.1 skrll #endif 127 1.1 skrll 128 1.1 skrll /* Handle of the OPCODE hash table. */ 129 1.7 christos static htab_t op_hash; 130 1.1 skrll 131 1.1 skrll static void s_data1 (void); 132 1.1 skrll static void s_seg (int); 133 1.1 skrll static void s_proc (int); 134 1.1 skrll static void s_reserve (int); 135 1.1 skrll static void s_common (int); 136 1.1 skrll static void s_empty (int); 137 1.1 skrll static void s_uacons (int); 138 1.1 skrll static void s_ncons (int); 139 1.1 skrll static void s_register (int); 140 1.1 skrll 141 1.1 skrll const pseudo_typeS md_pseudo_table[] = 142 1.1 skrll { 143 1.1 skrll {"align", s_align_bytes, 0}, /* Defaulting is invalid (0). */ 144 1.1 skrll {"common", s_common, 0}, 145 1.1 skrll {"empty", s_empty, 0}, 146 1.1 skrll {"global", s_globl, 0}, 147 1.1 skrll {"half", cons, 2}, 148 1.1 skrll {"nword", s_ncons, 0}, 149 1.1 skrll {"optim", s_ignore, 0}, 150 1.1 skrll {"proc", s_proc, 0}, 151 1.1 skrll {"reserve", s_reserve, 0}, 152 1.1 skrll {"seg", s_seg, 0}, 153 1.1 skrll {"skip", s_space, 0}, 154 1.1 skrll {"word", cons, 4}, 155 1.1 skrll {"xword", cons, 8}, 156 1.1 skrll {"uahalf", s_uacons, 2}, 157 1.1 skrll {"uaword", s_uacons, 4}, 158 1.1 skrll {"uaxword", s_uacons, 8}, 159 1.1 skrll /* These are specific to sparc/svr4. */ 160 1.1 skrll {"2byte", s_uacons, 2}, 161 1.1 skrll {"4byte", s_uacons, 4}, 162 1.1 skrll {"8byte", s_uacons, 8}, 163 1.1 skrll {"register", s_register, 0}, 164 1.1 skrll {NULL, 0, 0}, 165 1.1 skrll }; 166 1.1 skrll 167 1.1 skrll /* This array holds the chars that always start a comment. If the 168 1.1 skrll pre-processor is disabled, these aren't very useful. */ 169 1.1 skrll const char comment_chars[] = "!"; /* JF removed '|' from 170 1.1 skrll comment_chars. */ 171 1.1 skrll 172 1.1 skrll /* This array holds the chars that only start a comment at the beginning of 173 1.1 skrll a line. If the line seems to have the form '# 123 filename' 174 1.1 skrll .line and .file directives will appear in the pre-processed output. */ 175 1.1 skrll /* Note that input_file.c hand checks for '#' at the beginning of the 176 1.1 skrll first line of the input file. This is because the compiler outputs 177 1.1 skrll #NO_APP at the beginning of its output. */ 178 1.1 skrll /* Also note that comments started like this one will always 179 1.1 skrll work if '/' isn't otherwise defined. */ 180 1.1 skrll const char line_comment_chars[] = "#"; 181 1.1 skrll 182 1.1 skrll const char line_separator_chars[] = ";"; 183 1.1 skrll 184 1.1 skrll /* Chars that can be used to separate mant from exp in floating point 185 1.1 skrll nums. */ 186 1.1 skrll const char EXP_CHARS[] = "eE"; 187 1.1 skrll 188 1.1 skrll /* Chars that mean this number is a floating point constant. 189 1.1 skrll As in 0f12.456 190 1.1 skrll or 0d1.2345e12 */ 191 1.1 skrll const char FLT_CHARS[] = "rRsSfFdDxXpP"; 192 1.1 skrll 193 1.1 skrll /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be 194 1.1 skrll changed in read.c. Ideally it shouldn't have to know about it at all, 195 1.1 skrll but nothing is ideal around here. */ 196 1.1 skrll 197 1.1 skrll #define isoctal(c) ((unsigned) ((c) - '0') < 8) 198 1.1 skrll 199 1.1 skrll struct sparc_it 200 1.1 skrll { 201 1.3 christos const char *error; 202 1.1 skrll unsigned long opcode; 203 1.1 skrll struct nlist *nlistp; 204 1.1 skrll expressionS exp; 205 1.1 skrll expressionS exp2; 206 1.1 skrll int pcrel; 207 1.1 skrll bfd_reloc_code_real_type reloc; 208 1.1 skrll }; 209 1.1 skrll 210 1.1 skrll struct sparc_it the_insn, set_insn; 211 1.1 skrll 212 1.1 skrll static void output_insn (const struct sparc_opcode *, struct sparc_it *); 213 1.1 skrll 214 1.1 skrll /* Table of arguments to -A. 216 1.1 skrll The sparc_opcode_arch table in sparc-opc.c is insufficient and incorrect 217 1.1 skrll for this use. That table is for opcodes only. This table is for opcodes 218 1.1 skrll and file formats. */ 219 1.2 joerg 220 1.1 skrll enum sparc_arch_types {v6, v7, v8, leon, sparclet, sparclite, sparc86x, v8plus, 221 1.1 skrll v8plusa, v9, v9a, v9b, v9_64}; 222 1.1 skrll 223 1.3 christos static struct sparc_arch { 224 1.3 christos const char *name; 225 1.1 skrll const char *opcode_arch; 226 1.1 skrll enum sparc_arch_types arch_type; 227 1.1 skrll /* Default word size, as specified during configuration. 228 1.1 skrll A value of zero means can't be used to specify default architecture. */ 229 1.1 skrll int default_arch_size; 230 1.1 skrll /* Allowable arg to -A? */ 231 1.4 christos int user_option_p; 232 1.4 christos /* Extra hardware capabilities allowed. These are added to the 233 1.4 christos hardware capabilities associated with the opcode 234 1.2 joerg architecture. */ 235 1.2 joerg int hwcap_allowed; 236 1.1 skrll int hwcap2_allowed; 237 1.2 joerg } sparc_arch_table[] = { 238 1.2 joerg { "v6", "v6", v6, 0, 1, 0, 0 }, 239 1.4 christos { "v7", "v7", v7, 0, 1, 0, 0 }, 240 1.4 christos { "v8", "v8", v8, 32, 1, 0, 0 }, 241 1.4 christos { "v8a", "v8", v8, 32, 1, 0, 0 }, 242 1.4 christos { "sparc", "v9", v9, 0, 1, HWCAP_V8PLUS, 0 }, 243 1.4 christos { "sparcvis", "v9a", v9, 0, 1, 0, 0 }, 244 1.4 christos { "sparcvis2", "v9b", v9, 0, 1, 0, 0 }, 245 1.4 christos { "sparcfmaf", "v9b", v9, 0, 1, HWCAP_FMAF, 0 }, 246 1.4 christos { "sparcima", "v9b", v9, 0, 1, HWCAP_FMAF|HWCAP_IMA, 0 }, 247 1.4 christos { "sparcvis3", "v9b", v9, 0, 1, HWCAP_FMAF|HWCAP_VIS3|HWCAP_HPC, 0 }, 248 1.4 christos { "sparcvis3r", "v9b", v9, 0, 1, HWCAP_FMAF|HWCAP_VIS3|HWCAP_HPC|HWCAP_FJFMAU, 0 }, 249 1.4 christos 250 1.4 christos { "sparc4", "v9v", v9, 0, 1, 0, 0 }, 251 1.4 christos { "sparc5", "v9m", v9, 0, 1, 0, 0 }, 252 1.4 christos { "sparc6", "m8", v9, 0, 1, 0, 0 }, 253 1.4 christos 254 1.4 christos { "leon", "leon", leon, 32, 1, 0, 0 }, 255 1.4 christos { "sparclet", "sparclet", sparclet, 32, 1, 0, 0 }, 256 1.4 christos { "sparclite", "sparclite", sparclite, 32, 1, 0, 0 }, 257 1.4 christos { "sparc86x", "sparclite", sparc86x, 32, 1, 0, 0 }, 258 1.4 christos 259 1.4 christos { "v8plus", "v9", v9, 0, 1, HWCAP_V8PLUS, 0 }, 260 1.4 christos { "v8plusa", "v9a", v9, 0, 1, HWCAP_V8PLUS, 0 }, 261 1.4 christos { "v8plusb", "v9b", v9, 0, 1, HWCAP_V8PLUS, 0 }, 262 1.4 christos { "v8plusc", "v9c", v9, 0, 1, HWCAP_V8PLUS, 0 }, 263 1.4 christos { "v8plusd", "v9d", v9, 0, 1, HWCAP_V8PLUS, 0 }, 264 1.4 christos { "v8pluse", "v9e", v9, 0, 1, HWCAP_V8PLUS, 0 }, 265 1.4 christos { "v8plusv", "v9v", v9, 0, 1, HWCAP_V8PLUS, 0 }, 266 1.4 christos { "v8plusm", "v9m", v9, 0, 1, HWCAP_V8PLUS, 0 }, 267 1.4 christos { "v8plusm8", "m8", v9, 0, 1, HWCAP_V8PLUS, 0 }, 268 1.4 christos 269 1.4 christos { "v9", "v9", v9, 0, 1, 0, 0 }, 270 1.4 christos { "v9a", "v9a", v9, 0, 1, 0, 0 }, 271 1.4 christos { "v9b", "v9b", v9, 0, 1, 0, 0 }, 272 1.4 christos { "v9c", "v9c", v9, 0, 1, 0, 0 }, 273 1.4 christos { "v9d", "v9d", v9, 0, 1, 0, 0 }, 274 1.4 christos { "v9e", "v9e", v9, 0, 1, 0, 0 }, 275 1.4 christos { "v9v", "v9v", v9, 0, 1, 0, 0 }, 276 1.4 christos { "v9m", "v9m", v9, 0, 1, 0, 0 }, 277 1.2 joerg { "v9m8", "m8", v9, 0, 1, 0, 0 }, 278 1.10 christos 279 1.1 skrll /* These exist to allow configure.tgt to pass one 280 1.10 christos value to specify both the default machine and default word size. */ 281 1.4 christos { "v8plus-32", "v9", v9, 32, 0, 0, 0 }, 282 1.2 joerg { "v9-64", "v9", v9, 64, 0, 0, 0 }, 283 1.1 skrll { NULL, NULL, v8, 0, 0, 0, 0 } 284 1.1 skrll }; 285 1.1 skrll 286 1.1 skrll /* Variant of default_arch */ 287 1.1 skrll static enum sparc_arch_types default_arch_type; 288 1.1 skrll 289 1.3 christos static struct sparc_arch * 290 1.1 skrll lookup_arch (const char *name) 291 1.1 skrll { 292 1.1 skrll struct sparc_arch *sa; 293 1.1 skrll 294 1.1 skrll for (sa = &sparc_arch_table[0]; sa->name != NULL; sa++) 295 1.1 skrll if (strcmp (sa->name, name) == 0) 296 1.1 skrll break; 297 1.1 skrll if (sa->name == NULL) 298 1.1 skrll return NULL; 299 1.1 skrll return sa; 300 1.1 skrll } 301 1.1 skrll 302 1.1 skrll /* Initialize the default opcode arch and word size from the default 303 1.1 skrll architecture name. */ 304 1.1 skrll 305 1.1 skrll static void 306 1.1 skrll init_default_arch (void) 307 1.1 skrll { 308 1.1 skrll struct sparc_arch *sa = lookup_arch (default_arch); 309 1.1 skrll 310 1.1 skrll if (sa == NULL 311 1.1 skrll || sa->default_arch_size == 0) 312 1.1 skrll as_fatal (_("Invalid default architecture, broken assembler.")); 313 1.1 skrll 314 1.1 skrll max_architecture = sparc_opcode_lookup_arch (sa->opcode_arch); 315 1.1 skrll if (max_architecture == SPARC_OPCODE_ARCH_BAD) 316 1.1 skrll as_fatal (_("Bad opcode table, broken assembler.")); 317 1.1 skrll default_arch_size = sparc_arch_size = sa->default_arch_size; 318 1.1 skrll default_init_p = 1; 319 1.1 skrll default_arch_type = sa->arch_type; 320 1.1 skrll } 321 1.5 christos 322 1.5 christos /* Called by TARGET_MACH. */ 323 1.5 christos 324 1.5 christos unsigned long 325 1.5 christos sparc_mach (void) 326 1.5 christos { 327 1.5 christos /* We don't get a chance to initialize anything before we're called, 328 1.5 christos so handle that now. */ 329 1.5 christos if (! default_init_p) 330 1.5 christos init_default_arch (); 331 1.5 christos 332 1.5 christos return sparc_arch_size == 64 ? bfd_mach_sparc_v9 : bfd_mach_sparc; 333 1.5 christos } 334 1.1 skrll 335 1.1 skrll /* Called by TARGET_FORMAT. */ 336 1.1 skrll 337 1.1 skrll const char * 338 1.1 skrll sparc_target_format (void) 339 1.1 skrll { 340 1.1 skrll /* We don't get a chance to initialize anything before we're called, 341 1.1 skrll so handle that now. */ 342 1.1 skrll if (! default_init_p) 343 1.1 skrll init_default_arch (); 344 1.1 skrll 345 1.1 skrll #ifdef TE_VXWORKS 346 1.1 skrll return "elf32-sparc-vxworks"; 347 1.1 skrll #endif 348 1.1 skrll 349 1.1 skrll return sparc_arch_size == 64 ? ELF64_TARGET_FORMAT : ELF_TARGET_FORMAT; 350 1.1 skrll } 351 1.1 skrll 352 1.1 skrll /* md_parse_option 354 1.1 skrll * Invocation line includes a switch not recognized by the base assembler. 355 1.1 skrll * See if it's a processor-specific option. These are: 356 1.1 skrll * 357 1.1 skrll * -bump 358 1.2 joerg * Warn on architecture bumps. See also -A. 359 1.1 skrll * 360 1.1 skrll * -Av6, -Av7, -Av8, -Aleon, -Asparclite, -Asparclet 361 1.1 skrll * Standard 32 bit architectures. 362 1.1 skrll * -Av9, -Av9a, -Av9b 363 1.1 skrll * Sparc64 in either a 32 or 64 bit world (-32/-64 says which). 364 1.1 skrll * This used to only mean 64 bits, but properly specifying it 365 1.1 skrll * complicated gcc's ASM_SPECs, so now opcode selection is 366 1.1 skrll * specified orthogonally to word size (except when specifying 367 1.1 skrll * the default, but that is an internal implementation detail). 368 1.1 skrll * -Av8plus, -Av8plusa, -Av8plusb 369 1.1 skrll * Same as -Av9{,a,b}. 370 1.1 skrll * -xarch=v8plus, -xarch=v8plusa, -xarch=v8plusb 371 1.1 skrll * Same as -Av8plus{,a,b} -32, for compatibility with Sun's 372 1.1 skrll * assembler. 373 1.1 skrll * -xarch=v9, -xarch=v9a, -xarch=v9b 374 1.1 skrll * Same as -Av9{,a,b} -64, for compatibility with Sun's 375 1.1 skrll * assembler. 376 1.1 skrll * 377 1.1 skrll * Select the architecture and possibly the file format. 378 1.1 skrll * Instructions or features not supported by the selected 379 1.1 skrll * architecture cause fatal errors. 380 1.1 skrll * 381 1.1 skrll * The default is to start at v6, and bump the architecture up 382 1.1 skrll * whenever an instruction is seen at a higher level. In 32 bit 383 1.1 skrll * environments, v9 is not bumped up to, the user must pass 384 1.1 skrll * -Av8plus{,a,b}. 385 1.1 skrll * 386 1.1 skrll * If -bump is specified, a warning is printing when bumping to 387 1.1 skrll * higher levels. 388 1.1 skrll * 389 1.1 skrll * If an architecture is specified, all instructions must match 390 1.1 skrll * that architecture. Any higher level instructions are flagged 391 1.1 skrll * as errors. Note that in the 32 bit environment specifying 392 1.1 skrll * -Av8plus does not automatically create a v8plus object file, a 393 1.1 skrll * v9 insn must be seen. 394 1.1 skrll * 395 1.1 skrll * If both an architecture and -bump are specified, the 396 1.1 skrll * architecture starts at the specified level, but bumps are 397 1.1 skrll * warnings. Note that we can't set `current_architecture' to 398 1.1 skrll * the requested level in this case: in the 32 bit environment, 399 1.1 skrll * we still must avoid creating v8plus object files unless v9 400 1.1 skrll * insns are seen. 401 1.1 skrll * 402 1.1 skrll * Note: 403 1.1 skrll * Bumping between incompatible architectures is always an 404 1.1 skrll * error. For example, from sparclite to v9. 405 1.9 christos */ 406 1.9 christos 407 1.1 skrll const char md_shortopts[] = "A:K:VQ:sq"; 408 1.1 skrll const struct option md_longopts[] = { 409 1.1 skrll #define OPTION_BUMP (OPTION_MD_BASE) 410 1.1 skrll {"bump", no_argument, NULL, OPTION_BUMP}, 411 1.1 skrll #define OPTION_SPARC (OPTION_MD_BASE + 1) 412 1.1 skrll {"sparc", no_argument, NULL, OPTION_SPARC}, 413 1.1 skrll #define OPTION_XARCH (OPTION_MD_BASE + 2) 414 1.1 skrll {"xarch", required_argument, NULL, OPTION_XARCH}, 415 1.1 skrll #define OPTION_32 (OPTION_MD_BASE + 3) 416 1.1 skrll {"32", no_argument, NULL, OPTION_32}, 417 1.1 skrll #define OPTION_64 (OPTION_MD_BASE + 4) 418 1.1 skrll {"64", no_argument, NULL, OPTION_64}, 419 1.1 skrll #define OPTION_TSO (OPTION_MD_BASE + 5) 420 1.1 skrll {"TSO", no_argument, NULL, OPTION_TSO}, 421 1.1 skrll #define OPTION_PSO (OPTION_MD_BASE + 6) 422 1.1 skrll {"PSO", no_argument, NULL, OPTION_PSO}, 423 1.1 skrll #define OPTION_RMO (OPTION_MD_BASE + 7) 424 1.1 skrll {"RMO", no_argument, NULL, OPTION_RMO}, 425 1.1 skrll #ifdef SPARC_BIENDIAN 426 1.1 skrll #define OPTION_LITTLE_ENDIAN (OPTION_MD_BASE + 8) 427 1.1 skrll {"EL", no_argument, NULL, OPTION_LITTLE_ENDIAN}, 428 1.1 skrll #define OPTION_BIG_ENDIAN (OPTION_MD_BASE + 9) 429 1.1 skrll {"EB", no_argument, NULL, OPTION_BIG_ENDIAN}, 430 1.1 skrll #endif 431 1.1 skrll #define OPTION_ENFORCE_ALIGNED_DATA (OPTION_MD_BASE + 10) 432 1.1 skrll {"enforce-aligned-data", no_argument, NULL, OPTION_ENFORCE_ALIGNED_DATA}, 433 1.1 skrll #define OPTION_LITTLE_ENDIAN_DATA (OPTION_MD_BASE + 11) 434 1.1 skrll {"little-endian-data", no_argument, NULL, OPTION_LITTLE_ENDIAN_DATA}, 435 1.1 skrll #define OPTION_NO_UNDECLARED_REGS (OPTION_MD_BASE + 12) 436 1.1 skrll {"no-undeclared-regs", no_argument, NULL, OPTION_NO_UNDECLARED_REGS}, 437 1.1 skrll #define OPTION_UNDECLARED_REGS (OPTION_MD_BASE + 13) 438 1.1 skrll {"undeclared-regs", no_argument, NULL, OPTION_UNDECLARED_REGS}, 439 1.1 skrll #define OPTION_RELAX (OPTION_MD_BASE + 14) 440 1.1 skrll {"relax", no_argument, NULL, OPTION_RELAX}, 441 1.4 christos #define OPTION_NO_RELAX (OPTION_MD_BASE + 15) 442 1.4 christos {"no-relax", no_argument, NULL, OPTION_NO_RELAX}, 443 1.1 skrll #define OPTION_DCTI_COUPLES_DETECT (OPTION_MD_BASE + 16) 444 1.1 skrll {"dcti-couples-detect", no_argument, NULL, OPTION_DCTI_COUPLES_DETECT}, 445 1.1 skrll {NULL, no_argument, NULL, 0} 446 1.9 christos }; 447 1.1 skrll 448 1.1 skrll const size_t md_longopts_size = sizeof (md_longopts); 449 1.3 christos 450 1.1 skrll int 451 1.1 skrll md_parse_option (int c, const char *arg) 452 1.1 skrll { 453 1.1 skrll /* We don't get a chance to initialize anything before we're called, 454 1.1 skrll so handle that now. */ 455 1.1 skrll if (! default_init_p) 456 1.1 skrll init_default_arch (); 457 1.1 skrll 458 1.1 skrll switch (c) 459 1.1 skrll { 460 1.1 skrll case OPTION_BUMP: 461 1.1 skrll warn_on_bump = 1; 462 1.1 skrll warn_after_architecture = SPARC_OPCODE_ARCH_V6; 463 1.1 skrll break; 464 1.7 christos 465 1.2 joerg case OPTION_XARCH: 466 1.1 skrll if (startswith (arg, "v9")) 467 1.2 joerg md_parse_option (OPTION_64, NULL); 468 1.7 christos else 469 1.7 christos { 470 1.7 christos if (startswith (arg, "v8") 471 1.2 joerg || startswith (arg, "v7") 472 1.2 joerg || startswith (arg, "v6") 473 1.2 joerg || !strcmp (arg, "sparclet") 474 1.2 joerg || !strcmp (arg, "sparclite") 475 1.2 joerg || !strcmp (arg, "sparc86x")) 476 1.1 skrll md_parse_option (OPTION_32, NULL); 477 1.1 skrll } 478 1.1 skrll /* Fall through. */ 479 1.1 skrll 480 1.1 skrll case 'A': 481 1.1 skrll { 482 1.1 skrll struct sparc_arch *sa; 483 1.1 skrll enum sparc_opcode_arch_val opcode_arch; 484 1.1 skrll 485 1.1 skrll sa = lookup_arch (arg); 486 1.1 skrll if (sa == NULL 487 1.1 skrll || ! sa->user_option_p) 488 1.1 skrll { 489 1.1 skrll if (c == OPTION_XARCH) 490 1.1 skrll as_bad (_("invalid architecture -xarch=%s"), arg); 491 1.1 skrll else 492 1.1 skrll as_bad (_("invalid architecture -A%s"), arg); 493 1.1 skrll return 0; 494 1.1 skrll } 495 1.1 skrll 496 1.1 skrll opcode_arch = sparc_opcode_lookup_arch (sa->opcode_arch); 497 1.1 skrll if (opcode_arch == SPARC_OPCODE_ARCH_BAD) 498 1.2 joerg as_fatal (_("Bad opcode table, broken assembler.")); 499 1.2 joerg 500 1.2 joerg if (!architecture_requested 501 1.4 christos || opcode_arch > max_architecture) 502 1.7 christos max_architecture = opcode_arch; 503 1.7 christos 504 1.7 christos /* The allowed hardware capabilities are the implied by the 505 1.7 christos opcodes arch plus any extra capabilities defined in the GAS 506 1.7 christos arch. */ 507 1.7 christos hwcap_allowed 508 1.7 christos = (hwcap_allowed 509 1.7 christos | ((uint64_t) sparc_opcode_archs[opcode_arch].hwcaps2 << 32) 510 1.7 christos | ((uint64_t) sa->hwcap2_allowed << 32) 511 1.1 skrll | sparc_opcode_archs[opcode_arch].hwcaps 512 1.1 skrll | sa->hwcap_allowed); 513 1.1 skrll architecture_requested = 1; 514 1.1 skrll } 515 1.1 skrll break; 516 1.1 skrll 517 1.1 skrll case OPTION_SPARC: 518 1.1 skrll /* Ignore -sparc, used by SunOS make default .s.o rule. */ 519 1.1 skrll break; 520 1.1 skrll 521 1.1 skrll case OPTION_ENFORCE_ALIGNED_DATA: 522 1.1 skrll enforce_aligned_data = 1; 523 1.1 skrll break; 524 1.1 skrll 525 1.1 skrll #ifdef SPARC_BIENDIAN 526 1.1 skrll case OPTION_LITTLE_ENDIAN: 527 1.1 skrll target_big_endian = 0; 528 1.1 skrll if (default_arch_type != sparclet) 529 1.1 skrll as_fatal ("This target does not support -EL"); 530 1.1 skrll break; 531 1.1 skrll case OPTION_LITTLE_ENDIAN_DATA: 532 1.1 skrll target_little_endian_data = 1; 533 1.1 skrll target_big_endian = 0; 534 1.1 skrll if (default_arch_type != sparc86x 535 1.1 skrll && default_arch_type != v9) 536 1.1 skrll as_fatal ("This target does not support --little-endian-data"); 537 1.1 skrll break; 538 1.1 skrll case OPTION_BIG_ENDIAN: 539 1.1 skrll target_big_endian = 1; 540 1.1 skrll break; 541 1.1 skrll #endif 542 1.1 skrll 543 1.1 skrll case OPTION_32: 544 1.1 skrll case OPTION_64: 545 1.1 skrll { 546 1.1 skrll const char **list, **l; 547 1.1 skrll 548 1.1 skrll sparc_arch_size = c == OPTION_32 ? 32 : 64; 549 1.1 skrll list = bfd_target_list (); 550 1.1 skrll for (l = list; *l != NULL; l++) 551 1.1 skrll { 552 1.7 christos if (sparc_arch_size == 32) 553 1.1 skrll { 554 1.1 skrll if (startswith (*l, "elf32-sparc")) 555 1.1 skrll break; 556 1.1 skrll } 557 1.7 christos else 558 1.1 skrll { 559 1.1 skrll if (startswith (*l, "elf64-sparc")) 560 1.1 skrll break; 561 1.1 skrll } 562 1.1 skrll } 563 1.1 skrll if (*l == NULL) 564 1.1 skrll as_fatal (_("No compiled in support for %d bit object file format"), 565 1.2 joerg sparc_arch_size); 566 1.2 joerg free (list); 567 1.2 joerg 568 1.2 joerg if (sparc_arch_size == 64 569 1.1 skrll && max_architecture < SPARC_OPCODE_ARCH_V9) 570 1.1 skrll max_architecture = SPARC_OPCODE_ARCH_V9; 571 1.1 skrll } 572 1.1 skrll break; 573 1.1 skrll 574 1.1 skrll case OPTION_TSO: 575 1.1 skrll sparc_memory_model = MM_TSO; 576 1.1 skrll break; 577 1.1 skrll 578 1.1 skrll case OPTION_PSO: 579 1.1 skrll sparc_memory_model = MM_PSO; 580 1.1 skrll break; 581 1.1 skrll 582 1.1 skrll case OPTION_RMO: 583 1.1 skrll sparc_memory_model = MM_RMO; 584 1.1 skrll break; 585 1.1 skrll 586 1.1 skrll case 'V': 587 1.1 skrll print_version_id (); 588 1.1 skrll break; 589 1.1 skrll 590 1.1 skrll case 'Q': 591 1.1 skrll /* Qy - do emit .comment 592 1.1 skrll Qn - do not emit .comment. */ 593 1.1 skrll break; 594 1.1 skrll 595 1.1 skrll case 's': 596 1.1 skrll /* Use .stab instead of .stab.excl. */ 597 1.1 skrll break; 598 1.1 skrll 599 1.1 skrll case 'q': 600 1.1 skrll /* quick -- Native assembler does fewer checks. */ 601 1.1 skrll break; 602 1.1 skrll 603 1.1 skrll case 'K': 604 1.1 skrll if (strcmp (arg, "PIC") != 0) 605 1.1 skrll as_warn (_("Unrecognized option following -K")); 606 1.1 skrll else 607 1.1 skrll sparc_pic_code = 1; 608 1.1 skrll break; 609 1.1 skrll 610 1.1 skrll case OPTION_NO_UNDECLARED_REGS: 611 1.1 skrll no_undeclared_regs = 1; 612 1.1 skrll break; 613 1.1 skrll 614 1.1 skrll case OPTION_UNDECLARED_REGS: 615 1.1 skrll no_undeclared_regs = 0; 616 1.1 skrll break; 617 1.1 skrll 618 1.1 skrll case OPTION_RELAX: 619 1.1 skrll sparc_relax = 1; 620 1.1 skrll break; 621 1.1 skrll 622 1.1 skrll case OPTION_NO_RELAX: 623 1.1 skrll sparc_relax = 0; 624 1.4 christos break; 625 1.4 christos 626 1.4 christos case OPTION_DCTI_COUPLES_DETECT: 627 1.4 christos dcti_couples_detect = 1; 628 1.1 skrll break; 629 1.1 skrll 630 1.1 skrll default: 631 1.1 skrll return 0; 632 1.1 skrll } 633 1.1 skrll 634 1.1 skrll return 1; 635 1.1 skrll } 636 1.1 skrll 637 1.1 skrll void 638 1.1 skrll md_show_usage (FILE *stream) 639 1.1 skrll { 640 1.1 skrll const struct sparc_arch *arch; 641 1.1 skrll int column; 642 1.1 skrll 643 1.1 skrll /* We don't get a chance to initialize anything before we're called, 644 1.1 skrll so handle that now. */ 645 1.1 skrll if (! default_init_p) 646 1.1 skrll init_default_arch (); 647 1.1 skrll 648 1.1 skrll fprintf (stream, _("SPARC options:\n")); 649 1.1 skrll column = 0; 650 1.1 skrll for (arch = &sparc_arch_table[0]; arch->name; arch++) 651 1.1 skrll { 652 1.1 skrll if (!arch->user_option_p) 653 1.1 skrll continue; 654 1.1 skrll if (arch != &sparc_arch_table[0]) 655 1.1 skrll fprintf (stream, " | "); 656 1.1 skrll if (column + strlen (arch->name) > 70) 657 1.1 skrll { 658 1.1 skrll column = 0; 659 1.1 skrll fputc ('\n', stream); 660 1.1 skrll } 661 1.1 skrll column += 5 + 2 + strlen (arch->name); 662 1.1 skrll fprintf (stream, "-A%s", arch->name); 663 1.1 skrll } 664 1.1 skrll for (arch = &sparc_arch_table[0]; arch->name; arch++) 665 1.1 skrll { 666 1.1 skrll if (!arch->user_option_p) 667 1.1 skrll continue; 668 1.1 skrll fprintf (stream, " | "); 669 1.1 skrll if (column + strlen (arch->name) > 65) 670 1.1 skrll { 671 1.1 skrll column = 0; 672 1.1 skrll fputc ('\n', stream); 673 1.1 skrll } 674 1.1 skrll column += 5 + 7 + strlen (arch->name); 675 1.1 skrll fprintf (stream, "-xarch=%s", arch->name); 676 1.1 skrll } 677 1.1 skrll fprintf (stream, _("\n\ 678 1.1 skrll specify variant of SPARC architecture\n\ 679 1.1 skrll -bump warn when assembler switches architectures\n\ 680 1.1 skrll -sparc ignored\n\ 681 1.1 skrll --enforce-aligned-data force .long, etc., to be aligned correctly\n\ 682 1.1 skrll -relax relax jumps and branches (default)\n\ 683 1.1 skrll -no-relax avoid changing any jumps and branches\n")); 684 1.1 skrll fprintf (stream, _("\ 685 1.1 skrll -32 create 32 bit object file\n\ 686 1.1 skrll -64 create 64 bit object file\n")); 687 1.1 skrll fprintf (stream, _("\ 688 1.1 skrll [default is %d]\n"), default_arch_size); 689 1.1 skrll fprintf (stream, _("\ 690 1.1 skrll -TSO use Total Store Ordering\n\ 691 1.1 skrll -PSO use Partial Store Ordering\n\ 692 1.1 skrll -RMO use Relaxed Memory Ordering\n")); 693 1.1 skrll fprintf (stream, _("\ 694 1.1 skrll [default is %s]\n"), (default_arch_size == 64) ? "RMO" : "TSO"); 695 1.1 skrll fprintf (stream, _("\ 696 1.1 skrll -KPIC generate PIC\n\ 697 1.1 skrll -V print assembler version number\n\ 698 1.1 skrll -undeclared-regs ignore application global register usage without\n\ 699 1.1 skrll appropriate .register directive (default)\n\ 700 1.4 christos -no-undeclared-regs force error on application global register usage\n\ 701 1.1 skrll without appropriate .register directive\n\ 702 1.1 skrll --dcti-couples-detect warn when an unpredictable DCTI couple is found\n\ 703 1.1 skrll -q ignored\n\ 704 1.1 skrll -Qy, -Qn ignored\n\ 705 1.1 skrll -s ignored\n")); 706 1.1 skrll #ifdef SPARC_BIENDIAN 707 1.1 skrll fprintf (stream, _("\ 708 1.1 skrll -EL generate code for a little endian machine\n\ 709 1.1 skrll -EB generate code for a big endian machine\n\ 710 1.1 skrll --little-endian-data generate code for a machine having big endian\n\ 711 1.1 skrll instructions and little endian data.\n")); 712 1.1 skrll #endif 713 1.1 skrll } 714 1.3 christos 715 1.1 skrll /* Native operand size opcode translation. */ 717 1.3 christos static struct 718 1.3 christos { 719 1.1 skrll const char *name; 720 1.1 skrll const char *name32; 721 1.1 skrll const char *name64; 722 1.1 skrll } native_op_table[] = 723 1.1 skrll { 724 1.1 skrll {"ldn", "ld", "ldx"}, 725 1.1 skrll {"ldna", "lda", "ldxa"}, 726 1.1 skrll {"stn", "st", "stx"}, 727 1.1 skrll {"stna", "sta", "stxa"}, 728 1.1 skrll {"slln", "sll", "sllx"}, 729 1.1 skrll {"srln", "srl", "srlx"}, 730 1.1 skrll {"sran", "sra", "srax"}, 731 1.1 skrll {"casn", "cas", "casx"}, 732 1.1 skrll {"casna", "casa", "casxa"}, 733 1.1 skrll {"clrn", "clr", "clrx"}, 734 1.1 skrll {NULL, NULL, NULL}, 735 1.1 skrll }; 736 1.1 skrll 737 1.1 skrll /* sparc64 privileged and hyperprivileged registers. */ 739 1.1 skrll 740 1.1 skrll struct priv_reg_entry 741 1.1 skrll { 742 1.1 skrll const char *name; 743 1.1 skrll int regnum; 744 1.1 skrll }; 745 1.1 skrll 746 1.1 skrll struct priv_reg_entry priv_reg_table[] = 747 1.1 skrll { 748 1.1 skrll {"tpc", 0}, 749 1.1 skrll {"tnpc", 1}, 750 1.1 skrll {"tstate", 2}, 751 1.1 skrll {"tt", 3}, 752 1.1 skrll {"tick", 4}, 753 1.1 skrll {"tba", 5}, 754 1.1 skrll {"pstate", 6}, 755 1.1 skrll {"tl", 7}, 756 1.1 skrll {"pil", 8}, 757 1.1 skrll {"cwp", 9}, 758 1.1 skrll {"cansave", 10}, 759 1.1 skrll {"canrestore", 11}, 760 1.1 skrll {"cleanwin", 12}, 761 1.2 joerg {"otherwin", 13}, 762 1.1 skrll {"wstate", 14}, 763 1.3 christos {"fq", 15}, 764 1.1 skrll {"gl", 16}, 765 1.1 skrll {"pmcdper", 23}, 766 1.1 skrll {"ver", 31}, 767 1.1 skrll {NULL, -1}, /* End marker. */ 768 1.1 skrll }; 769 1.1 skrll 770 1.1 skrll struct priv_reg_entry hpriv_reg_table[] = 771 1.1 skrll { 772 1.1 skrll {"hpstate", 0}, 773 1.3 christos {"htstate", 1}, 774 1.3 christos {"hintp", 3}, 775 1.3 christos {"htba", 5}, 776 1.2 joerg {"hver", 6}, 777 1.2 joerg {"hmcdper", 23}, 778 1.1 skrll {"hmcddfr", 24}, 779 1.3 christos {"hva_mask_nz", 27}, 780 1.1 skrll {"hstick_offset", 28}, 781 1.1 skrll {"hstick_enable", 29}, 782 1.3 christos {"hstick_cmpr", 31}, 783 1.1 skrll {NULL, -1}, /* End marker. */ 784 1.1 skrll }; 785 1.1 skrll 786 1.1 skrll /* v9a or later specific ancillary state registers. */ 787 1.1 skrll 788 1.1 skrll struct priv_reg_entry v9a_asr_table[] = 789 1.1 skrll { 790 1.1 skrll {"tick_cmpr", 23}, 791 1.1 skrll {"sys_tick_cmpr", 25}, 792 1.1 skrll {"sys_tick", 24}, 793 1.1 skrll {"stick_cmpr", 25}, 794 1.1 skrll {"stick", 24}, 795 1.2 joerg {"softint_clear", 21}, 796 1.1 skrll {"softint_set", 20}, 797 1.1 skrll {"softint", 22}, 798 1.2 joerg {"set_softint", 20}, 799 1.1 skrll {"pause", 27}, 800 1.1 skrll {"pic", 17}, 801 1.2 joerg {"pcr", 16}, 802 1.1 skrll {"mwait", 28}, 803 1.3 christos {"gsr", 19}, 804 1.1 skrll {"dcr", 18}, 805 1.1 skrll {"cfr", 26}, 806 1.1 skrll {"clear_softint", 21}, 807 1.1 skrll {NULL, -1}, /* End marker. */ 808 1.1 skrll }; 809 1.9 christos 810 1.9 christos static int 811 1.1 skrll cmp_reg_entry (const void *parg, const void *qarg) 812 1.3 christos { 813 1.3 christos const struct priv_reg_entry *p = parg; 814 1.3 christos const struct priv_reg_entry *q = qarg; 815 1.3 christos 816 1.3 christos if (p->name == q->name) 817 1.3 christos return 0; 818 1.3 christos else if (p->name == NULL) 819 1.3 christos return 1; 820 1.3 christos else if (q->name == NULL) 821 1.3 christos return -1; 822 1.3 christos else 823 1.3 christos return strcmp (q->name, p->name); 824 1.3 christos } 825 1.3 christos 826 1.3 christos /* sparc %-pseudo-operations. */ 828 1.3 christos 829 1.3 christos 830 1.3 christos #define F_POP_V9 0x1 /* The pseudo-op is for v9 only. */ 831 1.3 christos #define F_POP_PCREL 0x2 /* The pseudo-op can be used in pc-relative 832 1.3 christos contexts. */ 833 1.3 christos #define F_POP_TLS_CALL 0x4 /* The pseudo-op marks a tls call. */ 834 1.3 christos #define F_POP_POSTFIX 0x8 /* The pseudo-op should appear after the 835 1.3 christos last operand of an 836 1.3 christos instruction. (Generally they can appear 837 1.3 christos anywhere an immediate operand is 838 1.3 christos expected. */ 839 1.4 christos struct pop_entry 840 1.3 christos { 841 1.3 christos /* The name as it appears in assembler. */ 842 1.3 christos const char *name; 843 1.3 christos /* The reloc this pseudo-op translates to. */ 844 1.3 christos bfd_reloc_code_real_type reloc; 845 1.3 christos /* Flags. See F_POP_* above. */ 846 1.3 christos int flags; 847 1.3 christos }; 848 1.3 christos 849 1.3 christos struct pop_entry pop_table[] = 850 1.3 christos { 851 1.3 christos { "hix", BFD_RELOC_SPARC_HIX22, F_POP_V9 }, 852 1.3 christos { "lox", BFD_RELOC_SPARC_LOX10, F_POP_V9 }, 853 1.3 christos { "hi", BFD_RELOC_HI22, F_POP_PCREL }, 854 1.3 christos { "lo", BFD_RELOC_LO10, F_POP_PCREL }, 855 1.3 christos { "pc22", BFD_RELOC_SPARC_PC22, F_POP_PCREL }, 856 1.3 christos { "pc10", BFD_RELOC_SPARC_PC10, F_POP_PCREL }, 857 1.3 christos { "hh", BFD_RELOC_SPARC_HH22, F_POP_V9|F_POP_PCREL }, 858 1.3 christos { "hm", BFD_RELOC_SPARC_HM10, F_POP_V9|F_POP_PCREL }, 859 1.3 christos { "lm", BFD_RELOC_SPARC_LM22, F_POP_V9|F_POP_PCREL }, 860 1.3 christos { "h34", BFD_RELOC_SPARC_H34, F_POP_V9 }, 861 1.3 christos { "l34", BFD_RELOC_SPARC_L44, F_POP_V9 }, 862 1.3 christos { "h44", BFD_RELOC_SPARC_H44, F_POP_V9 }, 863 1.3 christos { "m44", BFD_RELOC_SPARC_M44, F_POP_V9 }, 864 1.3 christos { "l44", BFD_RELOC_SPARC_L44, F_POP_V9 }, 865 1.3 christos { "uhi", BFD_RELOC_SPARC_HH22, F_POP_V9 }, 866 1.3 christos { "ulo", BFD_RELOC_SPARC_HM10, F_POP_V9 }, 867 1.3 christos { "tgd_hi22", BFD_RELOC_SPARC_TLS_GD_HI22, 0 }, 868 1.3 christos { "tgd_lo10", BFD_RELOC_SPARC_TLS_GD_LO10, 0 }, 869 1.3 christos { "tldm_hi22", BFD_RELOC_SPARC_TLS_LDM_HI22, 0 }, 870 1.3 christos { "tldm_lo10", BFD_RELOC_SPARC_TLS_LDM_LO10, 0 }, 871 1.3 christos { "tldo_hix22", BFD_RELOC_SPARC_TLS_LDO_HIX22, 0 }, 872 1.3 christos { "tldo_lox10", BFD_RELOC_SPARC_TLS_LDO_LOX10, 0 }, 873 1.3 christos { "tie_hi22", BFD_RELOC_SPARC_TLS_IE_HI22, 0 }, 874 1.3 christos { "tie_lo10", BFD_RELOC_SPARC_TLS_IE_LO10, 0 }, 875 1.3 christos { "tle_hix22", BFD_RELOC_SPARC_TLS_LE_HIX22, 0 }, 876 1.3 christos { "tle_lox10", BFD_RELOC_SPARC_TLS_LE_LOX10, 0 }, 877 1.3 christos { "gdop_hix22", BFD_RELOC_SPARC_GOTDATA_OP_HIX22, 0 }, 878 1.3 christos { "gdop_lox10", BFD_RELOC_SPARC_GOTDATA_OP_LOX10, 0 }, 879 1.3 christos { "tgd_add", BFD_RELOC_SPARC_TLS_GD_ADD, F_POP_POSTFIX }, 880 1.3 christos { "tgd_call", BFD_RELOC_SPARC_TLS_GD_CALL, F_POP_POSTFIX|F_POP_TLS_CALL }, 881 1.3 christos { "tldm_add", BFD_RELOC_SPARC_TLS_LDM_ADD, F_POP_POSTFIX }, 882 1.4 christos { "tldm_call", BFD_RELOC_SPARC_TLS_LDM_CALL, F_POP_POSTFIX|F_POP_TLS_CALL }, 883 1.3 christos { "tldo_add", BFD_RELOC_SPARC_TLS_LDO_ADD, F_POP_POSTFIX }, 884 1.3 christos { "tie_ldx", BFD_RELOC_SPARC_TLS_IE_LDX, F_POP_POSTFIX }, 885 1.3 christos { "tie_ld", BFD_RELOC_SPARC_TLS_IE_LD, F_POP_POSTFIX }, 886 1.3 christos { "tie_add", BFD_RELOC_SPARC_TLS_IE_ADD, F_POP_POSTFIX }, 887 1.3 christos { "gdop", BFD_RELOC_SPARC_GOTDATA_OP, F_POP_POSTFIX } 888 1.3 christos }; 889 1.3 christos 890 1.3 christos /* Table of %-names that can appear in a sparc assembly program. This 892 1.3 christos table is initialized in md_begin and contains entries for each 893 1.3 christos privileged/hyperprivileged/alternate register and %-pseudo-op. */ 894 1.3 christos 895 1.3 christos enum perc_entry_type 896 1.3 christos { 897 1.3 christos perc_entry_none = 0, 898 1.3 christos perc_entry_reg, 899 1.3 christos perc_entry_post_pop, 900 1.3 christos perc_entry_imm_pop 901 1.3 christos }; 902 1.3 christos 903 1.3 christos struct perc_entry 904 1.3 christos { 905 1.3 christos /* Entry type. */ 906 1.3 christos enum perc_entry_type type; 907 1.3 christos /* Name of the %-entity. */ 908 1.3 christos const char *name; 909 1.3 christos /* strlen (name). */ 910 1.3 christos int len; 911 1.3 christos /* Value. Either a pop or a reg depending on type.*/ 912 1.3 christos union 913 1.3 christos { 914 1.3 christos struct pop_entry *pop; 915 1.3 christos struct priv_reg_entry *reg; 916 1.3 christos }; 917 1.4 christos }; 918 1.3 christos 919 1.3 christos #define NUM_PERC_ENTRIES \ 920 1.3 christos (((sizeof (priv_reg_table) / sizeof (priv_reg_table[0])) - 1) \ 921 1.3 christos + ((sizeof (hpriv_reg_table) / sizeof (hpriv_reg_table[0])) - 1) \ 922 1.3 christos + ((sizeof (v9a_asr_table) / sizeof (v9a_asr_table[0])) - 1) \ 923 1.3 christos + ARRAY_SIZE (pop_table) \ 924 1.3 christos + 1) 925 1.9 christos 926 1.9 christos struct perc_entry perc_table[NUM_PERC_ENTRIES]; 927 1.3 christos 928 1.3 christos static int 929 1.3 christos cmp_perc_entry (const void *parg, const void *qarg) 930 1.3 christos { 931 1.3 christos const struct perc_entry *p = parg; 932 1.3 christos const struct perc_entry *q = qarg; 933 1.3 christos 934 1.3 christos if (p->name == q->name) 935 1.3 christos return 0; 936 1.1 skrll else if (p->name == NULL) 937 1.1 skrll return 1; 938 1.1 skrll else if (q->name == NULL) 939 1.1 skrll return -1; 940 1.1 skrll else 941 1.1 skrll return strcmp (q->name, p->name); 942 1.1 skrll } 943 1.1 skrll 944 1.1 skrll /* This function is called once, at assembler startup time. It should 946 1.2 joerg set up all the tables, etc. that the MD part of the assembler will 947 1.1 skrll need. */ 948 1.1 skrll 949 1.1 skrll void 950 1.1 skrll md_begin (void) 951 1.1 skrll { 952 1.1 skrll int lose = 0; 953 1.1 skrll unsigned int i = 0; 954 1.1 skrll 955 1.7 christos /* We don't get a chance to initialize anything before md_parse_option 956 1.1 skrll is called, and it may not be called, so handle default initialization 957 1.1 skrll now if not already done. */ 958 1.1 skrll if (! default_init_p) 959 1.1 skrll init_default_arch (); 960 1.7 christos 961 1.1 skrll sparc_cie_data_alignment = sparc_arch_size == 64 ? -8 : -4; 962 1.7 christos op_hash = str_htab_create (); 963 1.1 skrll 964 1.1 skrll while (i < (unsigned int) sparc_num_opcodes) 965 1.1 skrll { 966 1.1 skrll const char *name = sparc_opcodes[i].name; 967 1.1 skrll if (str_hash_insert (op_hash, name, &sparc_opcodes[i], 0) != NULL) 968 1.1 skrll { 969 1.1 skrll as_bad (_("duplicate %s"), name); 970 1.1 skrll lose = 1; 971 1.1 skrll } 972 1.1 skrll do 973 1.1 skrll { 974 1.1 skrll if (sparc_opcodes[i].match & sparc_opcodes[i].lose) 975 1.1 skrll { 976 1.1 skrll as_bad (_("Internal error: losing opcode: `%s' \"%s\"\n"), 977 1.1 skrll sparc_opcodes[i].name, sparc_opcodes[i].args); 978 1.1 skrll lose = 1; 979 1.1 skrll } 980 1.1 skrll ++i; 981 1.1 skrll } 982 1.3 christos while (i < (unsigned int) sparc_num_opcodes 983 1.9 christos && !strcmp (sparc_opcodes[i].name, name)); 984 1.9 christos } 985 1.9 christos 986 1.1 skrll for (i = 0; native_op_table[i].name; i++) 987 1.1 skrll { 988 1.1 skrll const struct sparc_opcode *insn; 989 1.1 skrll const char *name = ((sparc_arch_size == 32) 990 1.1 skrll ? native_op_table[i].name32 991 1.1 skrll : native_op_table[i].name64); 992 1.7 christos insn = str_hash_find (op_hash, name); 993 1.1 skrll if (insn == NULL) 994 1.7 christos { 995 1.7 christos as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"), 996 1.1 skrll name, native_op_table[i].name); 997 1.1 skrll lose = 1; 998 1.1 skrll } 999 1.1 skrll else if (str_hash_insert (op_hash, native_op_table[i].name, insn, 0)) 1000 1.1 skrll { 1001 1.1 skrll as_bad (_("duplicate %s"), native_op_table[i].name); 1002 1.1 skrll lose = 1; 1003 1.1 skrll } 1004 1.3 christos } 1005 1.3 christos 1006 1.3 christos if (lose) 1007 1.3 christos as_fatal (_("Broken assembler. No assembly attempted.")); 1008 1.3 christos 1009 1.1 skrll qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]), 1010 1.1 skrll sizeof (priv_reg_table[0]), cmp_reg_entry); 1011 1.1 skrll qsort (hpriv_reg_table, sizeof (hpriv_reg_table) / sizeof (hpriv_reg_table[0]), 1012 1.1 skrll sizeof (hpriv_reg_table[0]), cmp_reg_entry); 1013 1.1 skrll qsort (v9a_asr_table, sizeof (v9a_asr_table) / sizeof (v9a_asr_table[0]), 1014 1.1 skrll sizeof (v9a_asr_table[0]), cmp_reg_entry); 1015 1.1 skrll 1016 1.1 skrll /* If -bump, record the architecture level at which we start issuing 1017 1.1 skrll warnings. The behaviour is different depending upon whether an 1018 1.1 skrll architecture was explicitly specified. If it wasn't, we issue warnings 1019 1.1 skrll for all upwards bumps. If it was, we don't start issuing warnings until 1020 1.1 skrll we need to bump beyond the requested architecture or when we bump between 1021 1.1 skrll conflicting architectures. */ 1022 1.2 joerg 1023 1.2 joerg if (warn_on_bump 1024 1.2 joerg && architecture_requested) 1025 1.2 joerg { 1026 1.2 joerg /* `max_architecture' records the requested architecture. 1027 1.2 joerg Issue warnings if we go above it. */ 1028 1.2 joerg warn_after_architecture = max_architecture; 1029 1.2 joerg } 1030 1.2 joerg 1031 1.2 joerg /* Find the highest architecture level that doesn't conflict with 1032 1.1 skrll the requested one. */ 1033 1.2 joerg 1034 1.2 joerg if (warn_on_bump 1035 1.2 joerg || !architecture_requested) 1036 1.2 joerg { 1037 1.2 joerg enum sparc_opcode_arch_val current_max_architecture 1038 1.2 joerg = max_architecture; 1039 1.2 joerg 1040 1.3 christos for (max_architecture = SPARC_OPCODE_ARCH_MAX; 1041 1.3 christos max_architecture > warn_after_architecture; 1042 1.3 christos --max_architecture) 1043 1.3 christos if (! SPARC_OPCODE_CONFLICT_P (max_architecture, 1044 1.3 christos current_max_architecture)) 1045 1.3 christos break; 1046 1.3 christos } 1047 1.3 christos 1048 1.3 christos /* Prepare the tables of %-pseudo-ops. */ 1049 1.3 christos { 1050 1.3 christos struct priv_reg_entry *reg_tables[] 1051 1.3 christos = {priv_reg_table, hpriv_reg_table, v9a_asr_table, NULL}; 1052 1.3 christos struct priv_reg_entry **reg_table; 1053 1.3 christos int entry = 0; 1054 1.3 christos 1055 1.3 christos /* Add registers. */ 1056 1.3 christos for (reg_table = reg_tables; reg_table[0]; reg_table++) 1057 1.3 christos { 1058 1.3 christos struct priv_reg_entry *reg; 1059 1.3 christos for (reg = *reg_table; reg->name; reg++) 1060 1.3 christos { 1061 1.3 christos struct perc_entry *p = &perc_table[entry++]; 1062 1.3 christos p->type = perc_entry_reg; 1063 1.4 christos p->name = reg->name; 1064 1.4 christos p->len = strlen (reg->name); 1065 1.4 christos p->reg = reg; 1066 1.4 christos } 1067 1.4 christos } 1068 1.4 christos 1069 1.4 christos /* Add %-pseudo-ops. */ 1070 1.4 christos for (i = 0; i < ARRAY_SIZE (pop_table); i++) 1071 1.4 christos { 1072 1.3 christos struct perc_entry *p = &perc_table[entry++]; 1073 1.4 christos p->type = (pop_table[i].flags & F_POP_POSTFIX 1074 1.3 christos ? perc_entry_post_pop : perc_entry_imm_pop); 1075 1.3 christos p->name = pop_table[i].name; 1076 1.3 christos p->len = strlen (pop_table[i].name); 1077 1.3 christos p->pop = &pop_table[i]; 1078 1.3 christos } 1079 1.3 christos 1080 1.1 skrll /* Last entry is the sentinel. */ 1081 1.1 skrll perc_table[entry].type = perc_entry_none; 1082 1.1 skrll 1083 1.1 skrll qsort (perc_table, sizeof (perc_table) / sizeof (perc_table[0]), 1084 1.1 skrll sizeof (perc_table[0]), cmp_perc_entry); 1085 1.8 christos 1086 1.1 skrll } 1087 1.5 christos } 1088 1.5 christos 1089 1.2 joerg /* Called after all assembly has been done. */ 1090 1.2 joerg 1091 1.1 skrll void 1092 1.1 skrll sparc_md_finish (void) 1093 1.1 skrll { 1094 1.1 skrll unsigned long mach; 1095 1.1 skrll #ifndef TE_SOLARIS 1096 1.1 skrll int hwcaps, hwcaps2; 1097 1.3 christos #endif 1098 1.3 christos 1099 1.3 christos if (sparc_arch_size == 64) 1100 1.3 christos switch (current_architecture) 1101 1.3 christos { 1102 1.4 christos case SPARC_OPCODE_ARCH_V9A: mach = bfd_mach_sparc_v9a; break; 1103 1.1 skrll case SPARC_OPCODE_ARCH_V9B: mach = bfd_mach_sparc_v9b; break; 1104 1.1 skrll case SPARC_OPCODE_ARCH_V9C: mach = bfd_mach_sparc_v9c; break; 1105 1.1 skrll case SPARC_OPCODE_ARCH_V9D: mach = bfd_mach_sparc_v9d; break; 1106 1.1 skrll case SPARC_OPCODE_ARCH_V9E: mach = bfd_mach_sparc_v9e; break; 1107 1.1 skrll case SPARC_OPCODE_ARCH_V9V: mach = bfd_mach_sparc_v9v; break; 1108 1.1 skrll case SPARC_OPCODE_ARCH_V9M: mach = bfd_mach_sparc_v9m; break; 1109 1.1 skrll case SPARC_OPCODE_ARCH_M8: mach = bfd_mach_sparc_v9m8; break; 1110 1.1 skrll default: mach = bfd_mach_sparc_v9; break; 1111 1.1 skrll } 1112 1.3 christos else 1113 1.3 christos switch (current_architecture) 1114 1.3 christos { 1115 1.3 christos case SPARC_OPCODE_ARCH_SPARCLET: mach = bfd_mach_sparc_sparclet; break; 1116 1.3 christos case SPARC_OPCODE_ARCH_V9: mach = bfd_mach_sparc_v8plus; break; 1117 1.4 christos case SPARC_OPCODE_ARCH_V9A: mach = bfd_mach_sparc_v8plusa; break; 1118 1.1 skrll case SPARC_OPCODE_ARCH_V9B: mach = bfd_mach_sparc_v8plusb; break; 1119 1.1 skrll case SPARC_OPCODE_ARCH_V9C: mach = bfd_mach_sparc_v8plusc; break; 1120 1.1 skrll case SPARC_OPCODE_ARCH_V9D: mach = bfd_mach_sparc_v8plusd; break; 1121 1.5 christos case SPARC_OPCODE_ARCH_V9E: mach = bfd_mach_sparc_v8pluse; break; 1122 1.1 skrll case SPARC_OPCODE_ARCH_V9V: mach = bfd_mach_sparc_v8plusv; break; 1123 1.1 skrll case SPARC_OPCODE_ARCH_V9M: mach = bfd_mach_sparc_v8plusm; break; 1124 1.2 joerg case SPARC_OPCODE_ARCH_M8: mach = bfd_mach_sparc_v8plusm8; break; 1125 1.5 christos /* The sparclite is treated like a normal sparc. Perhaps it shouldn't 1126 1.2 joerg be but for now it is (since that's the way it's always been 1127 1.2 joerg treated). */ 1128 1.2 joerg default: mach = bfd_mach_sparc; break; 1129 1.8 christos } 1130 1.8 christos bfd_set_arch_mach (stdoutput, bfd_arch_sparc, mach); 1131 1.8 christos 1132 1.8 christos #ifndef TE_SOLARIS 1133 1.8 christos hwcaps = hwcap_seen & U0xffffffff; 1134 1.8 christos hwcaps2 = hwcap_seen >> 32; 1135 1.8 christos 1136 1.8 christos if ((hwcaps 1137 1.2 joerg && !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, 1138 1.1 skrll Tag_GNU_Sparc_HWCAPS, hwcaps)) 1139 1.1 skrll || (hwcaps2 1140 1.1 skrll && !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, 1141 1.1 skrll Tag_GNU_Sparc_HWCAPS2, hwcaps2))) 1142 1.1 skrll as_fatal (_("error adding attribute: %s"), 1143 1.1 skrll bfd_errmsg (bfd_get_error ())); 1144 1.1 skrll #endif 1145 1.1 skrll } 1146 1.1 skrll 1147 1.1 skrll /* Return non-zero if VAL is in the range -(MAX+1) to MAX. */ 1149 1.1 skrll 1150 1.1 skrll static inline int 1151 1.7 christos in_signed_range (bfd_signed_vma val, bfd_signed_vma max) 1152 1.1 skrll { 1153 1.1 skrll if (max <= 0) 1154 1.1 skrll abort (); 1155 1.1 skrll /* Sign-extend the value from the architecture word size, so that 1156 1.1 skrll 0xffffffff is always considered -1 on sparc32. */ 1157 1.1 skrll if (sparc_arch_size == 32) 1158 1.1 skrll { 1159 1.1 skrll bfd_vma sign = (bfd_vma) 1 << 31; 1160 1.1 skrll val = ((val & U0xffffffff) ^ sign) - sign; 1161 1.1 skrll } 1162 1.1 skrll if (val > max) 1163 1.1 skrll return 0; 1164 1.1 skrll if (val < ~max) 1165 1.1 skrll return 0; 1166 1.1 skrll return 1; 1167 1.1 skrll } 1168 1.1 skrll 1169 1.1 skrll /* Return non-zero if VAL is in the range 0 to MAX. */ 1170 1.1 skrll 1171 1.1 skrll static inline int 1172 1.1 skrll in_unsigned_range (bfd_vma val, bfd_vma max) 1173 1.1 skrll { 1174 1.1 skrll if (val > max) 1175 1.1 skrll return 0; 1176 1.1 skrll return 1; 1177 1.1 skrll } 1178 1.1 skrll 1179 1.1 skrll /* Return non-zero if VAL is in the range -(MAX/2+1) to MAX. 1180 1.1 skrll (e.g. -15 to +31). */ 1181 1.1 skrll 1182 1.1 skrll static inline int 1183 1.1 skrll in_bitfield_range (bfd_signed_vma val, bfd_signed_vma max) 1184 1.1 skrll { 1185 1.1 skrll if (max <= 0) 1186 1.1 skrll abort (); 1187 1.1 skrll if (val > max) 1188 1.1 skrll return 0; 1189 1.1 skrll if (val < ~(max >> 1)) 1190 1.1 skrll return 0; 1191 1.1 skrll return 1; 1192 1.1 skrll } 1193 1.1 skrll 1194 1.1 skrll static int 1195 1.1 skrll sparc_ffs (unsigned int mask) 1196 1.1 skrll { 1197 1.1 skrll int i; 1198 1.1 skrll 1199 1.1 skrll if (mask == 0) 1200 1.1 skrll return -1; 1201 1.1 skrll 1202 1.1 skrll for (i = 0; (mask & 1) == 0; ++i) 1203 1.1 skrll mask >>= 1; 1204 1.1 skrll return i; 1205 1.1 skrll } 1206 1.1 skrll 1207 1.1 skrll /* Implement big shift right. */ 1208 1.1 skrll static bfd_vma 1209 1.8 christos BSR (bfd_vma val, int amount) 1210 1.1 skrll { 1211 1.1 skrll if (sizeof (bfd_vma) <= 4 && amount >= 32) 1212 1.4 christos as_fatal (_("Support for 64-bit arithmetic not compiled in.")); 1213 1.1 skrll return val >> amount; 1214 1.1 skrll } 1215 1.1 skrll 1216 1.1 skrll /* For communication between sparc_ip and get_expression. */ 1218 1.1 skrll static char *expr_parse_end; 1219 1.1 skrll 1220 1.1 skrll /* Values for `special_case'. 1221 1.1 skrll Instructions that require weird handling because they're longer than 1222 1.1 skrll 4 bytes. */ 1223 1.1 skrll #define SPECIAL_CASE_NONE 0 1224 1.1 skrll #define SPECIAL_CASE_SET 1 1225 1.1 skrll #define SPECIAL_CASE_SETSW 2 1226 1.1 skrll #define SPECIAL_CASE_SETX 3 1227 1.1 skrll /* FIXME: sparc-opc.c doesn't have necessary "S" trigger to enable this. */ 1228 1.1 skrll #define SPECIAL_CASE_FDIV 4 1229 1.1 skrll 1230 1.1 skrll /* Bit masks of various insns. */ 1231 1.1 skrll #define NOP_INSN 0x01000000 1232 1.1 skrll #define OR_INSN 0x80100000 1233 1.1 skrll #define XOR_INSN 0x80180000 1234 1.1 skrll #define FMOVS_INSN 0x81A00020 1235 1.1 skrll #define SETHI_INSN 0x01000000 1236 1.1 skrll #define SLLX_INSN 0x81281000 1237 1.1 skrll #define SRA_INSN 0x81380000 1238 1.1 skrll 1239 1.1 skrll /* The last instruction to be assembled. */ 1240 1.1 skrll static const struct sparc_opcode *last_insn; 1241 1.1 skrll /* The assembled opcode of `last_insn'. */ 1242 1.1 skrll static unsigned long last_opcode; 1243 1.1 skrll 1244 1.1 skrll /* Handle the set and setuw synthetic instructions. */ 1246 1.1 skrll 1247 1.1 skrll static void 1248 1.1 skrll synthetize_setuw (const struct sparc_opcode *insn) 1249 1.1 skrll { 1250 1.1 skrll int need_hi22_p = 0; 1251 1.1 skrll int rd = (the_insn.opcode & RD (~0)) >> 25; 1252 1.1 skrll 1253 1.1 skrll if (the_insn.exp.X_op == O_constant) 1254 1.1 skrll { 1255 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture)) 1256 1.1 skrll { 1257 1.1 skrll if (sizeof (offsetT) > 4 1258 1.9 christos && (the_insn.exp.X_add_number < 0 1259 1.1 skrll || the_insn.exp.X_add_number > (offsetT) U0xffffffff)) 1260 1.1 skrll as_warn (_("set: number not in 0..4294967295 range")); 1261 1.1 skrll } 1262 1.1 skrll else 1263 1.1 skrll { 1264 1.1 skrll if (sizeof (offsetT) > 4 1265 1.1 skrll && (the_insn.exp.X_add_number < -(offsetT) U0x80000000 1266 1.1 skrll || the_insn.exp.X_add_number > (offsetT) U0xffffffff)) 1267 1.1 skrll as_warn (_("set: number not in -2147483648..4294967295 range")); 1268 1.1 skrll the_insn.exp.X_add_number = (int32_t) the_insn.exp.X_add_number; 1269 1.1 skrll } 1270 1.1 skrll } 1271 1.1 skrll 1272 1.1 skrll /* See if operand is absolute and small; skip sethi if so. */ 1273 1.1 skrll if (the_insn.exp.X_op != O_constant 1274 1.1 skrll || the_insn.exp.X_add_number >= (1 << 12) 1275 1.1 skrll || the_insn.exp.X_add_number < -(1 << 12)) 1276 1.1 skrll { 1277 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (rd) 1278 1.1 skrll | ((the_insn.exp.X_add_number >> 10) 1279 1.1 skrll & (the_insn.exp.X_op == O_constant 1280 1.1 skrll ? 0x3fffff : 0))); 1281 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant 1282 1.1 skrll ? BFD_RELOC_HI22 : BFD_RELOC_NONE); 1283 1.1 skrll output_insn (insn, &the_insn); 1284 1.1 skrll need_hi22_p = 1; 1285 1.1 skrll } 1286 1.1 skrll 1287 1.1 skrll /* See if operand has no low-order bits; skip OR if so. */ 1288 1.1 skrll if (the_insn.exp.X_op != O_constant 1289 1.1 skrll || (need_hi22_p && (the_insn.exp.X_add_number & 0x3FF) != 0) 1290 1.1 skrll || ! need_hi22_p) 1291 1.1 skrll { 1292 1.1 skrll the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (rd) : 0) 1293 1.1 skrll | RD (rd) | IMMED 1294 1.1 skrll | (the_insn.exp.X_add_number 1295 1.1 skrll & (the_insn.exp.X_op != O_constant 1296 1.1 skrll ? 0 : need_hi22_p ? 0x3ff : 0x1fff))); 1297 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant 1298 1.1 skrll ? BFD_RELOC_LO10 : BFD_RELOC_NONE); 1299 1.1 skrll output_insn (insn, &the_insn); 1300 1.1 skrll } 1301 1.1 skrll } 1302 1.1 skrll 1303 1.1 skrll /* Handle the setsw synthetic instruction. */ 1304 1.1 skrll 1305 1.1 skrll static void 1306 1.1 skrll synthetize_setsw (const struct sparc_opcode *insn) 1307 1.1 skrll { 1308 1.1 skrll int low32, rd, opc; 1309 1.1 skrll 1310 1.1 skrll rd = (the_insn.opcode & RD (~0)) >> 25; 1311 1.1 skrll 1312 1.1 skrll if (the_insn.exp.X_op != O_constant) 1313 1.1 skrll { 1314 1.1 skrll synthetize_setuw (insn); 1315 1.1 skrll 1316 1.1 skrll /* Need to sign extend it. */ 1317 1.1 skrll the_insn.opcode = (SRA_INSN | RS1 (rd) | RD (rd)); 1318 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; 1319 1.1 skrll output_insn (insn, &the_insn); 1320 1.1 skrll return; 1321 1.1 skrll } 1322 1.1 skrll 1323 1.1 skrll if (sizeof (offsetT) > 4 1324 1.1 skrll && (the_insn.exp.X_add_number < -(offsetT) U0x80000000 1325 1.1 skrll || the_insn.exp.X_add_number > (offsetT) U0xffffffff)) 1326 1.1 skrll as_warn (_("setsw: number not in -2147483648..4294967295 range")); 1327 1.1 skrll 1328 1.1 skrll low32 = the_insn.exp.X_add_number; 1329 1.1 skrll 1330 1.1 skrll if (low32 >= 0) 1331 1.1 skrll { 1332 1.1 skrll synthetize_setuw (insn); 1333 1.1 skrll return; 1334 1.1 skrll } 1335 1.1 skrll 1336 1.1 skrll opc = OR_INSN; 1337 1.1 skrll 1338 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; 1339 1.1 skrll /* See if operand is absolute and small; skip sethi if so. */ 1340 1.1 skrll if (low32 < -(1 << 12)) 1341 1.1 skrll { 1342 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (rd) 1343 1.1 skrll | (((~the_insn.exp.X_add_number) >> 10) & 0x3fffff)); 1344 1.2 joerg output_insn (insn, &the_insn); 1345 1.1 skrll low32 = 0x1c00 | (low32 & 0x3ff); 1346 1.1 skrll opc = RS1 (rd) | XOR_INSN; 1347 1.1 skrll } 1348 1.1 skrll 1349 1.1 skrll the_insn.opcode = (opc | RD (rd) | IMMED 1350 1.1 skrll | (low32 & 0x1fff)); 1351 1.1 skrll output_insn (insn, &the_insn); 1352 1.1 skrll } 1353 1.1 skrll 1354 1.1 skrll /* Handle the setx synthetic instruction. */ 1355 1.1 skrll 1356 1.1 skrll static void 1357 1.1 skrll synthetize_setx (const struct sparc_opcode *insn) 1358 1.1 skrll { 1359 1.1 skrll int upper32, lower32; 1360 1.1 skrll int tmpreg = (the_insn.opcode & RS1 (~0)) >> 14; 1361 1.1 skrll int dstreg = (the_insn.opcode & RD (~0)) >> 25; 1362 1.1 skrll int upper_dstreg; 1363 1.1 skrll int need_hh22_p = 0, need_hm10_p = 0, need_hi22_p = 0, need_lo10_p = 0; 1364 1.1 skrll int need_xor10_p = 0; 1365 1.1 skrll 1366 1.1 skrll #define SIGNEXT32(x) ((((x) & U0xffffffff) ^ U0x80000000) - U0x80000000) 1367 1.1 skrll lower32 = SIGNEXT32 (the_insn.exp.X_add_number); 1368 1.1 skrll upper32 = SIGNEXT32 (BSR (the_insn.exp.X_add_number, 32)); 1369 1.1 skrll #undef SIGNEXT32 1370 1.1 skrll 1371 1.1 skrll upper_dstreg = tmpreg; 1372 1.1 skrll /* The tmp reg should not be the dst reg. */ 1373 1.1 skrll if (tmpreg == dstreg) 1374 1.1 skrll as_warn (_("setx: temporary register same as destination register")); 1375 1.1 skrll 1376 1.1 skrll /* ??? Obviously there are other optimizations we can do 1377 1.1 skrll (e.g. sethi+shift for 0x1f0000000) and perhaps we shouldn't be 1378 1.1 skrll doing some of these. Later. If you do change things, try to 1379 1.1 skrll change all of this to be table driven as well. */ 1380 1.1 skrll /* What to output depends on the number if it's constant. 1381 1.1 skrll Compute that first, then output what we've decided upon. */ 1382 1.1 skrll if (the_insn.exp.X_op != O_constant) 1383 1.1 skrll { 1384 1.1 skrll if (sparc_arch_size == 32) 1385 1.1 skrll { 1386 1.1 skrll /* When arch size is 32, we want setx to be equivalent 1387 1.1 skrll to setuw for anything but constants. */ 1388 1.1 skrll the_insn.exp.X_add_number &= 0xffffffff; 1389 1.1 skrll synthetize_setuw (insn); 1390 1.1 skrll return; 1391 1.1 skrll } 1392 1.1 skrll need_hh22_p = need_hm10_p = need_hi22_p = need_lo10_p = 1; 1393 1.1 skrll lower32 = 0; 1394 1.1 skrll upper32 = 0; 1395 1.1 skrll } 1396 1.1 skrll else 1397 1.1 skrll { 1398 1.1 skrll /* Reset X_add_number, we've extracted it as upper32/lower32. 1399 1.1 skrll Otherwise fixup_segment will complain about not being able to 1400 1.1 skrll write an 8 byte number in a 4 byte field. */ 1401 1.1 skrll the_insn.exp.X_add_number = 0; 1402 1.1 skrll 1403 1.1 skrll /* Only need hh22 if `or' insn can't handle constant. */ 1404 1.1 skrll if (upper32 < -(1 << 12) || upper32 >= (1 << 12)) 1405 1.1 skrll need_hh22_p = 1; 1406 1.1 skrll 1407 1.1 skrll /* Does bottom part (after sethi) have bits? */ 1408 1.1 skrll if ((need_hh22_p && (upper32 & 0x3ff) != 0) 1409 1.1 skrll /* No hh22, but does upper32 still have bits we can't set 1410 1.1 skrll from lower32? */ 1411 1.1 skrll || (! need_hh22_p && upper32 != 0 && upper32 != -1)) 1412 1.1 skrll need_hm10_p = 1; 1413 1.1 skrll 1414 1.1 skrll /* If the lower half is all zero, we build the upper half directly 1415 1.1 skrll into the dst reg. */ 1416 1.1 skrll if (lower32 != 0 1417 1.1 skrll /* Need lower half if number is zero or 0xffffffff00000000. */ 1418 1.1 skrll || (! need_hh22_p && ! need_hm10_p)) 1419 1.1 skrll { 1420 1.1 skrll /* No need for sethi if `or' insn can handle constant. */ 1421 1.1 skrll if (lower32 < -(1 << 12) || lower32 >= (1 << 12) 1422 1.1 skrll /* Note that we can't use a negative constant in the `or' 1423 1.1 skrll insn unless the upper 32 bits are all ones. */ 1424 1.1 skrll || (lower32 < 0 && upper32 != -1) 1425 1.1 skrll || (lower32 >= 0 && upper32 == -1)) 1426 1.1 skrll need_hi22_p = 1; 1427 1.1 skrll 1428 1.1 skrll if (need_hi22_p && upper32 == -1) 1429 1.1 skrll need_xor10_p = 1; 1430 1.1 skrll 1431 1.1 skrll /* Does bottom part (after sethi) have bits? */ 1432 1.1 skrll else if ((need_hi22_p && (lower32 & 0x3ff) != 0) 1433 1.1 skrll /* No sethi. */ 1434 1.1 skrll || (! need_hi22_p && (lower32 & 0x1fff) != 0) 1435 1.1 skrll /* Need `or' if we didn't set anything else. */ 1436 1.1 skrll || (! need_hi22_p && ! need_hh22_p && ! need_hm10_p)) 1437 1.1 skrll need_lo10_p = 1; 1438 1.1 skrll } 1439 1.1 skrll else 1440 1.1 skrll /* Output directly to dst reg if lower 32 bits are all zero. */ 1441 1.1 skrll upper_dstreg = dstreg; 1442 1.1 skrll } 1443 1.1 skrll 1444 1.1 skrll if (!upper_dstreg && dstreg) 1445 1.1 skrll as_warn (_("setx: illegal temporary register g0")); 1446 1.1 skrll 1447 1.1 skrll if (need_hh22_p) 1448 1.1 skrll { 1449 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (upper_dstreg) 1450 1.1 skrll | ((upper32 >> 10) & 0x3fffff)); 1451 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant 1452 1.1 skrll ? BFD_RELOC_SPARC_HH22 : BFD_RELOC_NONE); 1453 1.1 skrll output_insn (insn, &the_insn); 1454 1.1 skrll } 1455 1.1 skrll 1456 1.1 skrll if (need_hi22_p) 1457 1.1 skrll { 1458 1.1 skrll the_insn.opcode = (SETHI_INSN | RD (dstreg) 1459 1.1 skrll | (((need_xor10_p ? ~lower32 : lower32) 1460 1.1 skrll >> 10) & 0x3fffff)); 1461 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant 1462 1.1 skrll ? BFD_RELOC_SPARC_LM22 : BFD_RELOC_NONE); 1463 1.1 skrll output_insn (insn, &the_insn); 1464 1.1 skrll } 1465 1.1 skrll 1466 1.1 skrll if (need_hm10_p) 1467 1.1 skrll { 1468 1.1 skrll the_insn.opcode = (OR_INSN 1469 1.1 skrll | (need_hh22_p ? RS1 (upper_dstreg) : 0) 1470 1.1 skrll | RD (upper_dstreg) 1471 1.1 skrll | IMMED 1472 1.1 skrll | (upper32 & (need_hh22_p ? 0x3ff : 0x1fff))); 1473 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant 1474 1.1 skrll ? BFD_RELOC_SPARC_HM10 : BFD_RELOC_NONE); 1475 1.1 skrll output_insn (insn, &the_insn); 1476 1.1 skrll } 1477 1.1 skrll 1478 1.1 skrll if (need_lo10_p) 1479 1.1 skrll { 1480 1.1 skrll /* FIXME: One nice optimization to do here is to OR the low part 1481 1.1 skrll with the highpart if hi22 isn't needed and the low part is 1482 1.1 skrll positive. */ 1483 1.1 skrll the_insn.opcode = (OR_INSN | (need_hi22_p ? RS1 (dstreg) : 0) 1484 1.1 skrll | RD (dstreg) 1485 1.1 skrll | IMMED 1486 1.1 skrll | (lower32 & (need_hi22_p ? 0x3ff : 0x1fff))); 1487 1.1 skrll the_insn.reloc = (the_insn.exp.X_op != O_constant 1488 1.1 skrll ? BFD_RELOC_LO10 : BFD_RELOC_NONE); 1489 1.1 skrll output_insn (insn, &the_insn); 1490 1.1 skrll } 1491 1.1 skrll 1492 1.1 skrll /* If we needed to build the upper part, shift it into place. */ 1493 1.1 skrll if (need_hh22_p || need_hm10_p) 1494 1.1 skrll { 1495 1.1 skrll the_insn.opcode = (SLLX_INSN | RS1 (upper_dstreg) | RD (upper_dstreg) 1496 1.1 skrll | IMMED | 32); 1497 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; 1498 1.1 skrll output_insn (insn, &the_insn); 1499 1.1 skrll } 1500 1.1 skrll 1501 1.1 skrll /* To get -1 in upper32, we do sethi %hi(~x), r; xor r, -0x400 | x, r. */ 1502 1.1 skrll if (need_xor10_p) 1503 1.1 skrll { 1504 1.1 skrll the_insn.opcode = (XOR_INSN | RS1 (dstreg) | RD (dstreg) | IMMED 1505 1.1 skrll | 0x1c00 | (lower32 & 0x3ff)); 1506 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; 1507 1.1 skrll output_insn (insn, &the_insn); 1508 1.1 skrll } 1509 1.1 skrll 1510 1.1 skrll /* If we needed to build both upper and lower parts, OR them together. */ 1511 1.1 skrll else if ((need_hh22_p || need_hm10_p) && (need_hi22_p || need_lo10_p)) 1512 1.1 skrll { 1513 1.1 skrll the_insn.opcode = (OR_INSN | RS1 (dstreg) | RS2 (upper_dstreg) 1514 1.1 skrll | RD (dstreg)); 1515 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; 1516 1.1 skrll output_insn (insn, &the_insn); 1517 1.1 skrll } 1518 1.1 skrll } 1519 1.1 skrll 1520 1.1 skrll /* Main entry point to assemble one instruction. */ 1522 1.1 skrll 1523 1.4 christos void 1524 1.4 christos md_assemble (char *str) 1525 1.1 skrll { 1526 1.4 christos const struct sparc_opcode *insn; 1527 1.4 christos int special_case; 1528 1.4 christos 1529 1.4 christos know (str); 1530 1.4 christos special_case = sparc_ip (str, &insn); 1531 1.4 christos if (insn == NULL) 1532 1.4 christos return; 1533 1.4 christos 1534 1.4 christos /* Certain instructions may not appear on delay slots. Check for 1535 1.4 christos these situations. */ 1536 1.4 christos if (last_insn != NULL 1537 1.4 christos && (last_insn->flags & F_DELAYED) != 0) 1538 1.4 christos { 1539 1.4 christos /* Before SPARC V9 the effect of having a delayed branch 1540 1.4 christos instruction in the delay slot of a conditional delayed branch 1541 1.4 christos was undefined. 1542 1.4 christos 1543 1.4 christos In SPARC V9 DCTI couples are well defined. 1544 1.4 christos 1545 1.4 christos However, starting with the UltraSPARC Architecture 2005, DCTI 1546 1.4 christos couples (of all kind) are deprecated and should not be used, 1547 1.4 christos as they may be slow or behave differently to what the 1548 1.4 christos programmer expects. */ 1549 1.4 christos if (dcti_couples_detect 1550 1.4 christos && (insn->flags & F_DELAYED) != 0 1551 1.4 christos && ((max_architecture < SPARC_OPCODE_ARCH_V9 1552 1.4 christos && (last_insn->flags & F_CONDBR) != 0) 1553 1.4 christos || max_architecture >= SPARC_OPCODE_ARCH_V9C)) 1554 1.4 christos as_warn (_("unpredictable DCTI couple")); 1555 1.1 skrll 1556 1.6 christos 1557 1.6 christos /* We warn about attempts to put a floating point branch in a 1558 1.6 christos delay slot, unless the delay slot has been annulled. */ 1559 1.6 christos if ((insn->flags & F_FBR) != 0 1560 1.6 christos /* ??? This test isn't completely accurate. We assume anything with 1561 1.1 skrll F_{UNBR,CONDBR,FBR} set is annullable. */ 1562 1.2 joerg && ((last_insn->flags & (F_UNBR | F_CONDBR | F_FBR)) == 0 1563 1.6 christos || (last_opcode & ANNUL) == 0)) 1564 1.1 skrll as_warn (_("FP branch in delay slot")); 1565 1.1 skrll } 1566 1.1 skrll 1567 1.1 skrll /* SPARC before v9 does not allow a floating point compare 1568 1.1 skrll directly before a floating point branch. Insert a nop 1569 1.1 skrll instruction if needed, with a warning. */ 1570 1.6 christos if (max_architecture < SPARC_OPCODE_ARCH_V9 1571 1.1 skrll && last_insn != NULL 1572 1.1 skrll && (insn->flags & F_FBR) != 0 1573 1.1 skrll && (last_insn->flags & F_FLOAT) != 0 1574 1.1 skrll && (last_insn->match & OP3 (0x35)) == OP3 (0x35)) 1575 1.1 skrll { 1576 1.1 skrll struct sparc_it nop_insn; 1577 1.1 skrll 1578 1.1 skrll nop_insn.opcode = NOP_INSN; 1579 1.1 skrll nop_insn.reloc = BFD_RELOC_NONE; 1580 1.1 skrll output_insn (insn, &nop_insn); 1581 1.1 skrll as_warn (_("FP branch preceded by FP compare; NOP inserted")); 1582 1.1 skrll } 1583 1.1 skrll 1584 1.1 skrll switch (special_case) 1585 1.1 skrll { 1586 1.1 skrll case SPECIAL_CASE_NONE: 1587 1.1 skrll /* Normal insn. */ 1588 1.1 skrll output_insn (insn, &the_insn); 1589 1.1 skrll break; 1590 1.1 skrll 1591 1.1 skrll case SPECIAL_CASE_SETSW: 1592 1.1 skrll synthetize_setsw (insn); 1593 1.1 skrll break; 1594 1.1 skrll 1595 1.1 skrll case SPECIAL_CASE_SET: 1596 1.1 skrll synthetize_setuw (insn); 1597 1.1 skrll break; 1598 1.1 skrll 1599 1.1 skrll case SPECIAL_CASE_SETX: 1600 1.1 skrll synthetize_setx (insn); 1601 1.1 skrll break; 1602 1.1 skrll 1603 1.2 joerg case SPECIAL_CASE_FDIV: 1604 1.1 skrll { 1605 1.1 skrll int rd = (the_insn.opcode >> 25) & 0x1f; 1606 1.1 skrll 1607 1.1 skrll output_insn (insn, &the_insn); 1608 1.1 skrll 1609 1.1 skrll /* According to information leaked from Sun, the "fdiv" instructions 1610 1.1 skrll on early SPARC machines would produce incorrect results sometimes. 1611 1.1 skrll The workaround is to add an fmovs of the destination register to 1612 1.1 skrll itself just after the instruction. This was true on machines 1613 1.1 skrll with Weitek 1165 float chips, such as the Sun-4/260 and /280. */ 1614 1.2 joerg gas_assert (the_insn.reloc == BFD_RELOC_NONE); 1615 1.7 christos the_insn.opcode = FMOVS_INSN | rd | RD (rd); 1616 1.2 joerg output_insn (insn, &the_insn); 1617 1.2 joerg return; 1618 1.2 joerg } 1619 1.2 joerg 1620 1.2 joerg default: 1621 1.2 joerg as_fatal (_("failed special case insn sanity check")); 1622 1.2 joerg } 1623 1.2 joerg } 1624 1.2 joerg 1625 1.2 joerg static const char * 1626 1.2 joerg get_hwcap_name (uint64_t mask) 1627 1.2 joerg { 1628 1.2 joerg if (mask & HWCAP_MUL32) 1629 1.2 joerg return "mul32"; 1630 1.2 joerg if (mask & HWCAP_DIV32) 1631 1.2 joerg return "div32"; 1632 1.2 joerg if (mask & HWCAP_FSMULD) 1633 1.2 joerg return "fsmuld"; 1634 1.2 joerg if (mask & HWCAP_V8PLUS) 1635 1.2 joerg return "v8plus"; 1636 1.2 joerg if (mask & HWCAP_POPC) 1637 1.2 joerg return "popc"; 1638 1.2 joerg if (mask & HWCAP_VIS) 1639 1.2 joerg return "vis"; 1640 1.2 joerg if (mask & HWCAP_VIS2) 1641 1.2 joerg return "vis2"; 1642 1.2 joerg if (mask & HWCAP_ASI_BLK_INIT) 1643 1.2 joerg return "ASIBlkInit"; 1644 1.2 joerg if (mask & HWCAP_FMAF) 1645 1.2 joerg return "fmaf"; 1646 1.2 joerg if (mask & HWCAP_VIS3) 1647 1.2 joerg return "vis3"; 1648 1.2 joerg if (mask & HWCAP_HPC) 1649 1.2 joerg return "hpc"; 1650 1.2 joerg if (mask & HWCAP_RANDOM) 1651 1.2 joerg return "random"; 1652 1.2 joerg if (mask & HWCAP_TRANS) 1653 1.2 joerg return "trans"; 1654 1.2 joerg if (mask & HWCAP_FJFMAU) 1655 1.2 joerg return "fjfmau"; 1656 1.2 joerg if (mask & HWCAP_IMA) 1657 1.2 joerg return "ima"; 1658 1.2 joerg if (mask & HWCAP_ASI_CACHE_SPARING) 1659 1.2 joerg return "cspare"; 1660 1.2 joerg if (mask & HWCAP_AES) 1661 1.2 joerg return "aes"; 1662 1.2 joerg if (mask & HWCAP_DES) 1663 1.2 joerg return "des"; 1664 1.2 joerg if (mask & HWCAP_KASUMI) 1665 1.2 joerg return "kasumi"; 1666 1.2 joerg if (mask & HWCAP_CAMELLIA) 1667 1.2 joerg return "camellia"; 1668 1.2 joerg if (mask & HWCAP_MD5) 1669 1.2 joerg return "md5"; 1670 1.2 joerg if (mask & HWCAP_SHA1) 1671 1.2 joerg return "sha1"; 1672 1.2 joerg if (mask & HWCAP_SHA256) 1673 1.2 joerg return "sha256"; 1674 1.2 joerg if (mask & HWCAP_SHA512) 1675 1.2 joerg return "sha512"; 1676 1.2 joerg if (mask & HWCAP_MPMUL) 1677 1.2 joerg return "mpmul"; 1678 1.2 joerg if (mask & HWCAP_MONT) 1679 1.2 joerg return "mont"; 1680 1.2 joerg if (mask & HWCAP_PAUSE) 1681 1.2 joerg return "pause"; 1682 1.2 joerg if (mask & HWCAP_CBCOND) 1683 1.2 joerg return "cbcond"; 1684 1.2 joerg if (mask & HWCAP_CRC32C) 1685 1.2 joerg return "crc32c"; 1686 1.2 joerg 1687 1.2 joerg mask = mask >> 32; 1688 1.2 joerg if (mask & HWCAP2_FJATHPLUS) 1689 1.2 joerg return "fjathplus"; 1690 1.2 joerg if (mask & HWCAP2_VIS3B) 1691 1.2 joerg return "vis3b"; 1692 1.2 joerg if (mask & HWCAP2_ADP) 1693 1.4 christos return "adp"; 1694 1.4 christos if (mask & HWCAP2_SPARC5) 1695 1.4 christos return "sparc5"; 1696 1.4 christos if (mask & HWCAP2_MWAIT) 1697 1.4 christos return "mwait"; 1698 1.4 christos if (mask & HWCAP2_XMPMUL) 1699 1.4 christos return "xmpmul"; 1700 1.4 christos if (mask & HWCAP2_XMONT) 1701 1.4 christos return "xmont"; 1702 1.4 christos if (mask & HWCAP2_NSEC) 1703 1.4 christos return "nsec"; 1704 1.4 christos if (mask & HWCAP2_SPARC6) 1705 1.4 christos return "sparc6"; 1706 1.4 christos if (mask & HWCAP2_ONADDSUB) 1707 1.4 christos return "onaddsub"; 1708 1.4 christos if (mask & HWCAP2_ONMUL) 1709 1.2 joerg return "onmul"; 1710 1.2 joerg if (mask & HWCAP2_ONDIV) 1711 1.2 joerg return "ondiv"; 1712 1.2 joerg if (mask & HWCAP2_DICTUNP) 1713 1.1 skrll return "dictunp"; 1714 1.1 skrll if (mask & HWCAP2_FPCMPSHL) 1715 1.1 skrll return "fpcmpshl"; 1716 1.1 skrll if (mask & HWCAP2_RLE) 1717 1.1 skrll return "rle"; 1718 1.3 christos if (mask & HWCAP2_SHA3) 1719 1.1 skrll return "sha3"; 1720 1.1 skrll 1721 1.1 skrll return "UNKNOWN"; 1722 1.1 skrll } 1723 1.1 skrll 1724 1.1 skrll /* Subroutine of md_assemble to do the actual parsing. */ 1725 1.1 skrll 1726 1.1 skrll static int 1727 1.1 skrll sparc_ip (char *str, const struct sparc_opcode **pinsn) 1728 1.1 skrll { 1729 1.1 skrll const char *error_message = ""; 1730 1.4 christos char *s; 1731 1.1 skrll const char *args; 1732 1.1 skrll char c; 1733 1.1 skrll const struct sparc_opcode *insn; 1734 1.1 skrll char *argsStart; 1735 1.1 skrll unsigned long opcode; 1736 1.1 skrll unsigned int mask = 0; 1737 1.2 joerg int match = 0; 1738 1.1 skrll int comma = 0; 1739 1.1 skrll int v9_arg_p; 1740 1.1 skrll int special_case = SPECIAL_CASE_NONE; 1741 1.1 skrll const sparc_asi *sasi = NULL; 1742 1.1 skrll 1743 1.1 skrll s = str; 1744 1.1 skrll if (ISLOWER (*s)) 1745 1.1 skrll { 1746 1.1 skrll do 1747 1.1 skrll ++s; 1748 1.1 skrll while (ISLOWER (*s) || ISDIGIT (*s) || *s == '_'); 1749 1.1 skrll } 1750 1.1 skrll 1751 1.9 christos switch (*s) 1752 1.9 christos { 1753 1.9 christos case '\0': 1754 1.9 christos break; 1755 1.9 christos 1756 1.1 skrll case ',': 1757 1.1 skrll comma = 1; 1758 1.1 skrll *s++ = '\0'; 1759 1.1 skrll break; 1760 1.9 christos 1761 1.1 skrll default: 1762 1.1 skrll if (is_whitespace (*s)) 1763 1.1 skrll { 1764 1.1 skrll *s++ = '\0'; 1765 1.1 skrll break; 1766 1.1 skrll } 1767 1.1 skrll as_bad (_("Unknown opcode: `%s'"), str); 1768 1.1 skrll *pinsn = NULL; 1769 1.1 skrll return special_case; 1770 1.1 skrll } 1771 1.1 skrll insn = str_hash_find (op_hash, str); 1772 1.1 skrll *pinsn = insn; 1773 1.1 skrll if (insn == NULL) 1774 1.1 skrll { 1775 1.1 skrll as_bad (_("Unknown opcode: `%s'"), str); 1776 1.1 skrll return special_case; 1777 1.1 skrll } 1778 1.1 skrll if (comma) 1779 1.1 skrll { 1780 1.1 skrll *--s = ','; 1781 1.1 skrll } 1782 1.1 skrll 1783 1.1 skrll argsStart = s; 1784 1.1 skrll for (;;) 1785 1.1 skrll { 1786 1.1 skrll opcode = insn->match; 1787 1.1 skrll memset (&the_insn, '\0', sizeof (the_insn)); 1788 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; 1789 1.1 skrll v9_arg_p = 0; 1790 1.1 skrll 1791 1.1 skrll /* Build the opcode, checking as we go to make sure that the 1792 1.1 skrll operands match. */ 1793 1.1 skrll for (args = insn->args;; ++args) 1794 1.1 skrll { 1795 1.2 joerg switch (*args) 1796 1.1 skrll { 1797 1.1 skrll case 'K': 1798 1.2 joerg { 1799 1.1 skrll int kmask = 0; 1800 1.1 skrll 1801 1.1 skrll /* Parse a series of masks. */ 1802 1.1 skrll if (*s == '#') 1803 1.2 joerg { 1804 1.9 christos while (*s == '#') 1805 1.1 skrll { 1806 1.1 skrll int jmask; 1807 1.1 skrll 1808 1.9 christos if (! parse_keyword_arg (sparc_encode_membar, &s, 1809 1.1 skrll &jmask)) 1810 1.1 skrll { 1811 1.1 skrll error_message = _(": invalid membar mask name"); 1812 1.1 skrll goto error; 1813 1.1 skrll } 1814 1.1 skrll kmask |= jmask; 1815 1.1 skrll while (is_whitespace (*s)) 1816 1.1 skrll ++s; 1817 1.1 skrll if (*s == '|' || *s == '+') 1818 1.1 skrll ++s; 1819 1.1 skrll while (is_whitespace (*s)) 1820 1.1 skrll ++s; 1821 1.1 skrll } 1822 1.1 skrll } 1823 1.1 skrll else 1824 1.1 skrll { 1825 1.1 skrll if (! parse_const_expr_arg (&s, &kmask)) 1826 1.1 skrll { 1827 1.1 skrll error_message = _(": invalid membar mask expression"); 1828 1.1 skrll goto error; 1829 1.1 skrll } 1830 1.1 skrll if (kmask < 0 || kmask > 127) 1831 1.1 skrll { 1832 1.1 skrll error_message = _(": invalid membar mask number"); 1833 1.1 skrll goto error; 1834 1.1 skrll } 1835 1.1 skrll } 1836 1.1 skrll 1837 1.1 skrll opcode |= MEMBAR (kmask); 1838 1.1 skrll continue; 1839 1.1 skrll } 1840 1.1 skrll 1841 1.1 skrll case '3': 1842 1.1 skrll { 1843 1.1 skrll int smask = 0; 1844 1.1 skrll 1845 1.1 skrll if (! parse_const_expr_arg (&s, &smask)) 1846 1.1 skrll { 1847 1.1 skrll error_message = _(": invalid siam mode expression"); 1848 1.1 skrll goto error; 1849 1.1 skrll } 1850 1.1 skrll if (smask < 0 || smask > 7) 1851 1.1 skrll { 1852 1.1 skrll error_message = _(": invalid siam mode number"); 1853 1.1 skrll goto error; 1854 1.1 skrll } 1855 1.1 skrll opcode |= smask; 1856 1.1 skrll continue; 1857 1.1 skrll } 1858 1.1 skrll 1859 1.1 skrll case '*': 1860 1.1 skrll { 1861 1.1 skrll int fcn = 0; 1862 1.1 skrll 1863 1.1 skrll /* Parse a prefetch function. */ 1864 1.1 skrll if (*s == '#') 1865 1.1 skrll { 1866 1.1 skrll if (! parse_keyword_arg (sparc_encode_prefetch, &s, &fcn)) 1867 1.1 skrll { 1868 1.1 skrll error_message = _(": invalid prefetch function name"); 1869 1.1 skrll goto error; 1870 1.1 skrll } 1871 1.1 skrll } 1872 1.1 skrll else 1873 1.1 skrll { 1874 1.1 skrll if (! parse_const_expr_arg (&s, &fcn)) 1875 1.1 skrll { 1876 1.1 skrll error_message = _(": invalid prefetch function expression"); 1877 1.1 skrll goto error; 1878 1.1 skrll } 1879 1.1 skrll if (fcn < 0 || fcn > 31) 1880 1.1 skrll { 1881 1.1 skrll error_message = _(": invalid prefetch function number"); 1882 1.1 skrll goto error; 1883 1.3 christos } 1884 1.1 skrll } 1885 1.1 skrll opcode |= RD (fcn); 1886 1.1 skrll continue; 1887 1.3 christos } 1888 1.3 christos 1889 1.3 christos case '!': 1890 1.3 christos case '?': 1891 1.3 christos /* Parse a sparc64 privileged register. */ 1892 1.3 christos if (*s == '%') 1893 1.3 christos { 1894 1.3 christos struct priv_reg_entry *p; 1895 1.3 christos unsigned int len = 9999999; /* Init to make gcc happy. */ 1896 1.1 skrll 1897 1.1 skrll s += 1; 1898 1.1 skrll for (p = priv_reg_table; p->name; p++) 1899 1.1 skrll if (p->name[0] == s[0]) 1900 1.3 christos { 1901 1.3 christos len = strlen (p->name); 1902 1.3 christos if (strncmp (p->name, s, len) == 0) 1903 1.3 christos break; 1904 1.3 christos } 1905 1.3 christos 1906 1.3 christos if (!p->name) 1907 1.1 skrll { 1908 1.1 skrll error_message = _(": unrecognizable privileged register"); 1909 1.1 skrll goto error; 1910 1.1 skrll } 1911 1.1 skrll 1912 1.1 skrll if (((opcode >> (*args == '?' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum) 1913 1.1 skrll { 1914 1.1 skrll error_message = _(": unrecognizable privileged register"); 1915 1.1 skrll goto error; 1916 1.1 skrll } 1917 1.1 skrll 1918 1.1 skrll s += len; 1919 1.1 skrll continue; 1920 1.1 skrll } 1921 1.3 christos else 1922 1.1 skrll { 1923 1.1 skrll error_message = _(": unrecognizable privileged register"); 1924 1.1 skrll goto error; 1925 1.3 christos } 1926 1.3 christos 1927 1.3 christos case '$': 1928 1.3 christos case '%': 1929 1.3 christos /* Parse a sparc64 hyperprivileged register. */ 1930 1.3 christos if (*s == '%') 1931 1.3 christos { 1932 1.3 christos struct priv_reg_entry *p; 1933 1.3 christos unsigned int len = 9999999; /* Init to make gcc happy. */ 1934 1.1 skrll 1935 1.1 skrll s += 1; 1936 1.1 skrll for (p = hpriv_reg_table; p->name; p++) 1937 1.1 skrll if (p->name[0] == s[0]) 1938 1.3 christos { 1939 1.3 christos len = strlen (p->name); 1940 1.3 christos if (strncmp (p->name, s, len) == 0) 1941 1.3 christos break; 1942 1.3 christos } 1943 1.3 christos 1944 1.3 christos if (!p->name) 1945 1.3 christos { 1946 1.1 skrll error_message = _(": unrecognizable hyperprivileged register"); 1947 1.1 skrll goto error; 1948 1.1 skrll } 1949 1.1 skrll 1950 1.1 skrll if (((opcode >> (*args == '$' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum) 1951 1.1 skrll { 1952 1.1 skrll error_message = _(": unrecognizable hyperprivileged register"); 1953 1.1 skrll goto error; 1954 1.1 skrll } 1955 1.1 skrll 1956 1.3 christos s += len; 1957 1.1 skrll continue; 1958 1.1 skrll } 1959 1.3 christos else 1960 1.1 skrll { 1961 1.1 skrll error_message = _(": unrecognizable hyperprivileged register"); 1962 1.1 skrll goto error; 1963 1.3 christos } 1964 1.3 christos 1965 1.3 christos case '_': 1966 1.3 christos case '/': 1967 1.3 christos /* Parse a v9a or later ancillary state register. */ 1968 1.3 christos if (*s == '%') 1969 1.3 christos { 1970 1.3 christos struct priv_reg_entry *p; 1971 1.3 christos unsigned int len = 9999999; /* Init to make gcc happy. */ 1972 1.1 skrll 1973 1.3 christos s += 1; 1974 1.1 skrll for (p = v9a_asr_table; p->name; p++) 1975 1.1 skrll if (p->name[0] == s[0]) 1976 1.3 christos { 1977 1.3 christos len = strlen (p->name); 1978 1.3 christos if (strncmp (p->name, s, len) == 0) 1979 1.3 christos break; 1980 1.3 christos } 1981 1.3 christos 1982 1.3 christos if (!p->name) 1983 1.1 skrll { 1984 1.1 skrll error_message = _(": unrecognizable ancillary state register"); 1985 1.1 skrll goto error; 1986 1.1 skrll } 1987 1.1 skrll 1988 1.3 christos if (((opcode >> (*args == '/' ? 14 : 25)) & 0x1f) != (unsigned) p->regnum) 1989 1.1 skrll { 1990 1.1 skrll error_message = _(": unrecognizable ancillary state register"); 1991 1.1 skrll goto error; 1992 1.1 skrll } 1993 1.1 skrll 1994 1.7 christos s += len; 1995 1.1 skrll continue; 1996 1.1 skrll } 1997 1.1 skrll else 1998 1.1 skrll { 1999 1.1 skrll error_message = _(": unrecognizable ancillary state register"); 2000 1.1 skrll goto error; 2001 1.1 skrll } 2002 1.1 skrll 2003 1.1 skrll case 'M': 2004 1.1 skrll case 'm': 2005 1.1 skrll if (startswith (s, "%asr")) 2006 1.1 skrll { 2007 1.1 skrll s += 4; 2008 1.3 christos 2009 1.3 christos if (ISDIGIT (*s)) 2010 1.3 christos { 2011 1.3 christos long num = 0; 2012 1.3 christos 2013 1.3 christos while (ISDIGIT (*s)) 2014 1.3 christos { 2015 1.3 christos num = num * 10 + *s - '0'; 2016 1.3 christos ++s; 2017 1.3 christos } 2018 1.3 christos 2019 1.3 christos /* We used to check here for the asr number to 2020 1.3 christos be between 16 and 31 in V9 and later, as 2021 1.3 christos mandated by the section C.1.1 "Register 2022 1.3 christos Names" in the SPARC spec. However, we 2023 1.3 christos decided to remove this restriction as a) it 2024 1.1 skrll introduces problems when new V9 asr registers 2025 1.1 skrll are introduced, b) the Solaris assembler 2026 1.1 skrll doesn't implement this restriction and c) the 2027 1.1 skrll restriction will go away in future revisions 2028 1.1 skrll of the Oracle SPARC Architecture. */ 2029 1.1 skrll 2030 1.1 skrll if (num < 0 || 31 < num) 2031 1.1 skrll { 2032 1.1 skrll error_message = _(": asr number must be between 0 and 31"); 2033 1.1 skrll goto error; 2034 1.1 skrll } 2035 1.1 skrll 2036 1.1 skrll opcode |= (*args == 'M' ? RS1 (num) : RD (num)); 2037 1.1 skrll continue; 2038 1.1 skrll } 2039 1.1 skrll else 2040 1.1 skrll { 2041 1.1 skrll error_message = _(": expecting %asrN"); 2042 1.1 skrll goto error; 2043 1.1 skrll } 2044 1.2 joerg } /* if %asr */ 2045 1.9 christos break; 2046 1.2 joerg 2047 1.2 joerg case 'I': 2048 1.2 joerg the_insn.reloc = BFD_RELOC_SPARC_11; 2049 1.2 joerg goto immediate; 2050 1.2 joerg 2051 1.2 joerg case 'j': 2052 1.2 joerg the_insn.reloc = BFD_RELOC_SPARC_10; 2053 1.2 joerg goto immediate; 2054 1.2 joerg 2055 1.2 joerg case ')': 2056 1.2 joerg if (is_whitespace (*s)) 2057 1.2 joerg s++; 2058 1.2 joerg if ((s[0] == '0' && s[1] == 'x' && ISXDIGIT (s[2])) 2059 1.2 joerg || ISDIGIT (*s)) 2060 1.2 joerg { 2061 1.2 joerg long num = 0; 2062 1.2 joerg 2063 1.2 joerg if (s[0] == '0' && s[1] == 'x') 2064 1.2 joerg { 2065 1.2 joerg s += 2; 2066 1.2 joerg while (ISXDIGIT (*s)) 2067 1.2 joerg { 2068 1.2 joerg num <<= 4; 2069 1.2 joerg num |= hex_value (*s); 2070 1.2 joerg ++s; 2071 1.2 joerg } 2072 1.2 joerg } 2073 1.2 joerg else 2074 1.2 joerg { 2075 1.2 joerg while (ISDIGIT (*s)) 2076 1.2 joerg { 2077 1.2 joerg num = num * 10 + *s - '0'; 2078 1.2 joerg ++s; 2079 1.2 joerg } 2080 1.2 joerg } 2081 1.2 joerg if (num < 0 || num > 31) 2082 1.2 joerg { 2083 1.2 joerg error_message = _(": crypto immediate must be between 0 and 31"); 2084 1.2 joerg goto error; 2085 1.1 skrll } 2086 1.1 skrll 2087 1.1 skrll opcode |= RS3 (num); 2088 1.1 skrll continue; 2089 1.1 skrll } 2090 1.1 skrll else 2091 1.1 skrll { 2092 1.1 skrll error_message = _(": expecting crypto immediate"); 2093 1.1 skrll goto error; 2094 1.1 skrll } 2095 1.1 skrll 2096 1.1 skrll case 'X': 2097 1.1 skrll /* V8 systems don't understand BFD_RELOC_SPARC_5. */ 2098 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture)) 2099 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_5; 2100 1.1 skrll else 2101 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC13; 2102 1.1 skrll /* These fields are unsigned, but for upward compatibility, 2103 1.1 skrll allow negative values as well. */ 2104 1.1 skrll goto immediate; 2105 1.1 skrll 2106 1.1 skrll case 'Y': 2107 1.1 skrll /* V8 systems don't understand BFD_RELOC_SPARC_6. */ 2108 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture)) 2109 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_6; 2110 1.2 joerg else 2111 1.2 joerg the_insn.reloc = BFD_RELOC_SPARC13; 2112 1.2 joerg /* These fields are unsigned, but for upward compatibility, 2113 1.2 joerg allow negative values as well. */ 2114 1.2 joerg goto immediate; 2115 1.1 skrll 2116 1.1 skrll case 'k': 2117 1.1 skrll the_insn.reloc = /* RELOC_WDISP2_14 */ BFD_RELOC_SPARC_WDISP16; 2118 1.1 skrll the_insn.pcrel = 1; 2119 1.1 skrll goto immediate; 2120 1.1 skrll 2121 1.1 skrll case '=': 2122 1.1 skrll the_insn.reloc = /* RELOC_WDISP2_8 */ BFD_RELOC_SPARC_WDISP10; 2123 1.1 skrll the_insn.pcrel = 1; 2124 1.1 skrll goto immediate; 2125 1.1 skrll 2126 1.1 skrll case 'G': 2127 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_WDISP19; 2128 1.1 skrll the_insn.pcrel = 1; 2129 1.1 skrll goto immediate; 2130 1.1 skrll 2131 1.1 skrll case 'N': 2132 1.1 skrll if (*s == 'p' && s[1] == 'n') 2133 1.1 skrll { 2134 1.1 skrll s += 2; 2135 1.1 skrll continue; 2136 1.1 skrll } 2137 1.9 christos break; 2138 1.1 skrll 2139 1.1 skrll case 'T': 2140 1.1 skrll if (*s == 'p' && s[1] == 't') 2141 1.7 christos { 2142 1.7 christos s += 2; 2143 1.1 skrll continue; 2144 1.1 skrll } 2145 1.1 skrll break; 2146 1.1 skrll 2147 1.1 skrll case 'z': 2148 1.1 skrll if (is_whitespace (*s)) 2149 1.1 skrll { 2150 1.9 christos ++s; 2151 1.1 skrll } 2152 1.1 skrll if ((startswith (s, "%icc")) 2153 1.1 skrll || (sparc_arch_size == 32 && startswith (s, "%ncc"))) 2154 1.7 christos { 2155 1.7 christos s += 4; 2156 1.1 skrll continue; 2157 1.1 skrll } 2158 1.1 skrll break; 2159 1.1 skrll 2160 1.1 skrll case 'Z': 2161 1.1 skrll if (is_whitespace (*s)) 2162 1.1 skrll { 2163 1.9 christos ++s; 2164 1.1 skrll } 2165 1.1 skrll if ((startswith (s, "%xcc")) 2166 1.1 skrll || (sparc_arch_size == 64 && startswith (s, "%ncc"))) 2167 1.7 christos { 2168 1.1 skrll s += 4; 2169 1.1 skrll continue; 2170 1.1 skrll } 2171 1.1 skrll break; 2172 1.1 skrll 2173 1.1 skrll case '6': 2174 1.1 skrll if (is_whitespace (*s)) 2175 1.9 christos { 2176 1.1 skrll ++s; 2177 1.1 skrll } 2178 1.1 skrll if (startswith (s, "%fcc0")) 2179 1.7 christos { 2180 1.1 skrll s += 5; 2181 1.1 skrll continue; 2182 1.1 skrll } 2183 1.1 skrll break; 2184 1.1 skrll 2185 1.1 skrll case '7': 2186 1.1 skrll if (is_whitespace (*s)) 2187 1.9 christos { 2188 1.1 skrll ++s; 2189 1.1 skrll } 2190 1.1 skrll if (startswith (s, "%fcc1")) 2191 1.7 christos { 2192 1.1 skrll s += 5; 2193 1.1 skrll continue; 2194 1.1 skrll } 2195 1.1 skrll break; 2196 1.1 skrll 2197 1.1 skrll case '8': 2198 1.1 skrll if (is_whitespace (*s)) 2199 1.9 christos { 2200 1.1 skrll ++s; 2201 1.1 skrll } 2202 1.1 skrll if (startswith (s, "%fcc2")) 2203 1.7 christos { 2204 1.1 skrll s += 5; 2205 1.1 skrll continue; 2206 1.1 skrll } 2207 1.1 skrll break; 2208 1.1 skrll 2209 1.1 skrll case '9': 2210 1.1 skrll if (is_whitespace (*s)) 2211 1.7 christos { 2212 1.1 skrll ++s; 2213 1.1 skrll } 2214 1.1 skrll if (startswith (s, "%fcc3")) 2215 1.1 skrll { 2216 1.1 skrll s += 5; 2217 1.1 skrll continue; 2218 1.1 skrll } 2219 1.7 christos break; 2220 1.1 skrll 2221 1.1 skrll case 'P': 2222 1.1 skrll if (startswith (s, "%pc")) 2223 1.1 skrll { 2224 1.1 skrll s += 3; 2225 1.1 skrll continue; 2226 1.1 skrll } 2227 1.1 skrll break; 2228 1.1 skrll 2229 1.1 skrll case 'W': 2230 1.1 skrll if (startswith (s, "%tick")) 2231 1.3 christos { 2232 1.1 skrll s += 5; 2233 1.3 christos continue; 2234 1.3 christos } 2235 1.3 christos break; 2236 1.3 christos 2237 1.3 christos case '\0': /* End of args. */ 2238 1.3 christos if (s[0] == ',' && s[1] == '%') 2239 1.1 skrll { 2240 1.3 christos char *s1; 2241 1.1 skrll int npar = 0; 2242 1.3 christos const struct perc_entry *p; 2243 1.1 skrll 2244 1.1 skrll for (p = perc_table; p->type != perc_entry_none; p++) 2245 1.1 skrll if ((p->type == perc_entry_post_pop || p->type == perc_entry_reg) 2246 1.3 christos && strncmp (s + 2, p->name, p->len) == 0) 2247 1.3 christos break; 2248 1.1 skrll if (p->type == perc_entry_none || p->type == perc_entry_reg) 2249 1.1 skrll break; 2250 1.3 christos 2251 1.1 skrll if (s[p->len + 2] != '(') 2252 1.1 skrll { 2253 1.1 skrll as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name); 2254 1.3 christos return special_case; 2255 1.1 skrll } 2256 1.1 skrll 2257 1.1 skrll if (! (p->pop->flags & F_POP_TLS_CALL) 2258 1.1 skrll && the_insn.reloc != BFD_RELOC_NONE) 2259 1.1 skrll { 2260 1.1 skrll as_bad (_("Illegal operands: %%%s cannot be used together with other relocs in the insn ()"), 2261 1.3 christos p->name); 2262 1.1 skrll return special_case; 2263 1.1 skrll } 2264 1.1 skrll 2265 1.3 christos if ((p->pop->flags & F_POP_TLS_CALL) 2266 1.1 skrll && (the_insn.reloc != BFD_RELOC_32_PCREL_S2 2267 1.3 christos || the_insn.exp.X_add_number != 0 2268 1.1 skrll || the_insn.exp.X_add_symbol 2269 1.1 skrll != symbol_find_or_make ("__tls_get_addr"))) 2270 1.1 skrll { 2271 1.1 skrll as_bad (_("Illegal operands: %%%s can be only used with call __tls_get_addr"), 2272 1.1 skrll p->name); 2273 1.1 skrll return special_case; 2274 1.1 skrll } 2275 1.1 skrll 2276 1.1 skrll the_insn.reloc = p->pop->reloc; 2277 1.1 skrll memset (&the_insn.exp, 0, sizeof (the_insn.exp)); 2278 1.1 skrll s += p->len + 3; 2279 1.1 skrll 2280 1.1 skrll for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++) 2281 1.3 christos if (*s1 == '(') 2282 1.1 skrll npar++; 2283 1.1 skrll else if (*s1 == ')') 2284 1.1 skrll { 2285 1.1 skrll if (!npar) 2286 1.1 skrll break; 2287 1.1 skrll npar--; 2288 1.1 skrll } 2289 1.1 skrll 2290 1.1 skrll if (*s1 != ')') 2291 1.1 skrll { 2292 1.1 skrll as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name); 2293 1.1 skrll return special_case; 2294 1.1 skrll } 2295 1.1 skrll 2296 1.1 skrll *s1 = '\0'; 2297 1.1 skrll (void) get_expression (s); 2298 1.1 skrll *s1 = ')'; 2299 1.1 skrll s = s1 + 1; 2300 1.1 skrll } 2301 1.1 skrll if (*s == '\0') 2302 1.1 skrll match = 1; 2303 1.1 skrll break; 2304 1.1 skrll 2305 1.1 skrll case '+': 2306 1.1 skrll if (*s == '+') 2307 1.1 skrll { 2308 1.1 skrll ++s; 2309 1.9 christos continue; 2310 1.9 christos } 2311 1.9 christos if (*s == '-') 2312 1.9 christos { 2313 1.1 skrll continue; 2314 1.9 christos } 2315 1.1 skrll break; 2316 1.1 skrll 2317 1.1 skrll case '[': /* These must match exactly. */ 2318 1.1 skrll case ']': 2319 1.1 skrll case ',': 2320 1.1 skrll if (*s++ == *args) 2321 1.1 skrll continue; 2322 1.1 skrll break; 2323 1.1 skrll 2324 1.1 skrll case ' ': 2325 1.1 skrll if (is_whitespace (*s++)) 2326 1.1 skrll continue; 2327 1.1 skrll break; 2328 1.1 skrll 2329 1.1 skrll case '#': /* Must be at least one digit. */ 2330 1.7 christos if (ISDIGIT (*s++)) 2331 1.1 skrll { 2332 1.1 skrll while (ISDIGIT (*s)) 2333 1.1 skrll { 2334 1.1 skrll ++s; 2335 1.1 skrll } 2336 1.1 skrll continue; 2337 1.1 skrll } 2338 1.1 skrll break; 2339 1.1 skrll 2340 1.1 skrll case 'C': /* Coprocessor state register. */ 2341 1.1 skrll if (startswith (s, "%csr")) 2342 1.1 skrll { 2343 1.1 skrll s += 4; 2344 1.1 skrll continue; 2345 1.1 skrll } 2346 1.1 skrll break; 2347 1.1 skrll 2348 1.1 skrll case 'b': /* Next operand is a coprocessor register. */ 2349 1.1 skrll case 'c': 2350 1.1 skrll case 'D': 2351 1.1 skrll if (*s++ == '%' && *s++ == 'c' && ISDIGIT (*s)) 2352 1.1 skrll { 2353 1.1 skrll mask = *s++; 2354 1.1 skrll if (ISDIGIT (*s)) 2355 1.1 skrll { 2356 1.1 skrll mask = 10 * (mask - '0') + (*s++ - '0'); 2357 1.1 skrll if (mask >= 32) 2358 1.1 skrll { 2359 1.1 skrll break; 2360 1.1 skrll } 2361 1.1 skrll } 2362 1.1 skrll else 2363 1.1 skrll { 2364 1.1 skrll mask -= '0'; 2365 1.1 skrll } 2366 1.1 skrll switch (*args) 2367 1.1 skrll { 2368 1.1 skrll 2369 1.1 skrll case 'b': 2370 1.1 skrll opcode |= mask << 14; 2371 1.1 skrll continue; 2372 1.1 skrll 2373 1.1 skrll case 'c': 2374 1.1 skrll opcode |= mask; 2375 1.1 skrll continue; 2376 1.1 skrll 2377 1.1 skrll case 'D': 2378 1.1 skrll opcode |= mask << 25; 2379 1.1 skrll continue; 2380 1.1 skrll } 2381 1.1 skrll } 2382 1.1 skrll break; 2383 1.1 skrll 2384 1.1 skrll case 'r': /* next operand must be a register */ 2385 1.1 skrll case 'O': 2386 1.1 skrll case '1': 2387 1.1 skrll case '2': 2388 1.1 skrll case 'd': 2389 1.1 skrll if (*s++ == '%') 2390 1.1 skrll { 2391 1.1 skrll switch (c = *s++) 2392 1.1 skrll { 2393 1.1 skrll 2394 1.1 skrll case 'f': /* frame pointer */ 2395 1.1 skrll if (*s++ == 'p') 2396 1.1 skrll { 2397 1.1 skrll mask = 0x1e; 2398 1.1 skrll break; 2399 1.1 skrll } 2400 1.1 skrll goto error; 2401 1.1 skrll 2402 1.1 skrll case 'g': /* global register */ 2403 1.1 skrll c = *s++; 2404 1.1 skrll if (isoctal (c)) 2405 1.1 skrll { 2406 1.1 skrll mask = c - '0'; 2407 1.1 skrll break; 2408 1.1 skrll } 2409 1.1 skrll goto error; 2410 1.1 skrll 2411 1.1 skrll case 'i': /* in register */ 2412 1.1 skrll c = *s++; 2413 1.1 skrll if (isoctal (c)) 2414 1.1 skrll { 2415 1.1 skrll mask = c - '0' + 24; 2416 1.1 skrll break; 2417 1.1 skrll } 2418 1.1 skrll goto error; 2419 1.1 skrll 2420 1.1 skrll case 'l': /* local register */ 2421 1.1 skrll c = *s++; 2422 1.1 skrll if (isoctal (c)) 2423 1.1 skrll { 2424 1.1 skrll mask = (c - '0' + 16); 2425 1.1 skrll break; 2426 1.1 skrll } 2427 1.1 skrll goto error; 2428 1.1 skrll 2429 1.1 skrll case 'o': /* out register */ 2430 1.1 skrll c = *s++; 2431 1.1 skrll if (isoctal (c)) 2432 1.1 skrll { 2433 1.1 skrll mask = (c - '0' + 8); 2434 1.1 skrll break; 2435 1.1 skrll } 2436 1.1 skrll goto error; 2437 1.1 skrll 2438 1.1 skrll case 's': /* stack pointer */ 2439 1.1 skrll if (*s++ == 'p') 2440 1.1 skrll { 2441 1.1 skrll mask = 0xe; 2442 1.1 skrll break; 2443 1.1 skrll } 2444 1.1 skrll goto error; 2445 1.1 skrll 2446 1.1 skrll case 'r': /* any register */ 2447 1.1 skrll if (!ISDIGIT ((c = *s++))) 2448 1.1 skrll { 2449 1.1 skrll goto error; 2450 1.1 skrll } 2451 1.1 skrll /* FALLTHROUGH */ 2452 1.1 skrll case '0': 2453 1.1 skrll case '1': 2454 1.1 skrll case '2': 2455 1.1 skrll case '3': 2456 1.1 skrll case '4': 2457 1.1 skrll case '5': 2458 1.1 skrll case '6': 2459 1.1 skrll case '7': 2460 1.1 skrll case '8': 2461 1.1 skrll case '9': 2462 1.1 skrll if (ISDIGIT (*s)) 2463 1.1 skrll { 2464 1.1 skrll if ((c = 10 * (c - '0') + (*s++ - '0')) >= 32) 2465 1.1 skrll { 2466 1.1 skrll goto error; 2467 1.1 skrll } 2468 1.1 skrll } 2469 1.1 skrll else 2470 1.1 skrll { 2471 1.1 skrll c -= '0'; 2472 1.1 skrll } 2473 1.1 skrll mask = c; 2474 1.1 skrll break; 2475 1.1 skrll 2476 1.1 skrll default: 2477 1.1 skrll goto error; 2478 1.1 skrll } 2479 1.1 skrll 2480 1.1 skrll if ((mask & ~1) == 2 && sparc_arch_size == 64 2481 1.1 skrll && no_undeclared_regs && ! globals[mask]) 2482 1.1 skrll as_bad (_("detected global register use not covered by .register pseudo-op")); 2483 1.1 skrll 2484 1.1 skrll /* Got the register, now figure out where 2485 1.1 skrll it goes in the opcode. */ 2486 1.1 skrll switch (*args) 2487 1.1 skrll { 2488 1.1 skrll case '1': 2489 1.1 skrll opcode |= mask << 14; 2490 1.1 skrll continue; 2491 1.1 skrll 2492 1.1 skrll case '2': 2493 1.1 skrll opcode |= mask; 2494 1.1 skrll continue; 2495 1.1 skrll 2496 1.1 skrll case 'd': 2497 1.1 skrll opcode |= mask << 25; 2498 1.1 skrll continue; 2499 1.1 skrll 2500 1.1 skrll case 'r': 2501 1.1 skrll opcode |= (mask << 25) | (mask << 14); 2502 1.1 skrll continue; 2503 1.4 christos 2504 1.1 skrll case 'O': 2505 1.1 skrll opcode |= (mask << 25) | (mask << 0); 2506 1.1 skrll continue; 2507 1.1 skrll } 2508 1.4 christos } 2509 1.4 christos break; 2510 1.1 skrll 2511 1.2 joerg case 'e': /* next operand is a floating point register */ 2512 1.2 joerg case 'v': 2513 1.2 joerg case 'V': 2514 1.1 skrll case ';': 2515 1.1 skrll 2516 1.1 skrll case 'f': 2517 1.2 joerg case 'B': 2518 1.4 christos case 'R': 2519 1.1 skrll case ':': 2520 1.1 skrll case '\'': 2521 1.1 skrll 2522 1.1 skrll case '4': 2523 1.3 christos case '5': 2524 1.3 christos 2525 1.3 christos case 'g': 2526 1.1 skrll case 'H': 2527 1.1 skrll case 'J': 2528 1.1 skrll case '}': 2529 1.1 skrll case '^': 2530 1.1 skrll { 2531 1.1 skrll char format; 2532 1.1 skrll 2533 1.1 skrll if (*s++ == '%' 2534 1.1 skrll && ((format = *s) == 'f' 2535 1.2 joerg || format == 'd' 2536 1.3 christos || format == 'q') 2537 1.4 christos && ISDIGIT (*++s)) 2538 1.3 christos { 2539 1.1 skrll for (mask = 0; ISDIGIT (*s); ++s) 2540 1.1 skrll { 2541 1.3 christos mask = 10 * mask + (*s - '0'); 2542 1.1 skrll } /* read the number */ 2543 1.3 christos 2544 1.1 skrll if ((*args == 'v' 2545 1.1 skrll || *args == 'B' 2546 1.1 skrll || *args == '5' 2547 1.3 christos || *args == 'H' 2548 1.3 christos || *args == '\'' 2549 1.1 skrll || format == 'd') 2550 1.1 skrll && (mask & 1)) 2551 1.3 christos { 2552 1.1 skrll /* register must be even numbered */ 2553 1.3 christos break; 2554 1.1 skrll } 2555 1.4 christos 2556 1.4 christos if ((*args == 'V' 2557 1.4 christos || *args == 'R' 2558 1.4 christos || *args == 'J' 2559 1.4 christos || format == 'q') 2560 1.4 christos && (mask & 3)) 2561 1.4 christos { 2562 1.4 christos /* register must be multiple of 4 */ 2563 1.4 christos break; 2564 1.4 christos } 2565 1.4 christos 2566 1.4 christos if ((*args == ':' 2567 1.4 christos || *args == ';' 2568 1.4 christos || *args == '^') 2569 1.4 christos && (mask & 7)) 2570 1.1 skrll { 2571 1.1 skrll /* register must be multiple of 8 */ 2572 1.1 skrll break; 2573 1.1 skrll } 2574 1.1 skrll 2575 1.1 skrll if (*args == '\'' && mask < 48) 2576 1.1 skrll { 2577 1.1 skrll /* register must be higher or equal than %f48 */ 2578 1.1 skrll break; 2579 1.1 skrll } 2580 1.1 skrll 2581 1.1 skrll if (mask >= 64) 2582 1.1 skrll { 2583 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture)) 2584 1.1 skrll error_message = _(": There are only 64 f registers; [0-63]"); 2585 1.1 skrll else 2586 1.1 skrll error_message = _(": There are only 32 f registers; [0-31]"); 2587 1.1 skrll goto error; 2588 1.1 skrll } /* on error */ 2589 1.1 skrll else if (mask >= 32) 2590 1.1 skrll { 2591 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture)) 2592 1.1 skrll { 2593 1.1 skrll if (*args == 'e' || *args == 'f' || *args == 'g') 2594 1.1 skrll { 2595 1.1 skrll error_message 2596 1.1 skrll = _(": There are only 32 single precision f registers; [0-31]"); 2597 1.1 skrll goto error; 2598 1.1 skrll } 2599 1.1 skrll v9_arg_p = 1; 2600 1.1 skrll mask -= 31; /* wrap high bit */ 2601 1.1 skrll } 2602 1.1 skrll else 2603 1.1 skrll { 2604 1.1 skrll error_message = _(": There are only 32 f registers; [0-31]"); 2605 1.1 skrll goto error; 2606 1.1 skrll } 2607 1.1 skrll } 2608 1.4 christos } 2609 1.1 skrll else 2610 1.1 skrll { 2611 1.1 skrll break; 2612 1.1 skrll } /* if not an 'f' register. */ 2613 1.1 skrll 2614 1.1 skrll switch (*args) 2615 1.4 christos { 2616 1.1 skrll case 'v': 2617 1.1 skrll case 'V': 2618 1.1 skrll case 'e': 2619 1.4 christos case ';': 2620 1.4 christos opcode |= RS1 (mask); 2621 1.4 christos continue; 2622 1.4 christos 2623 1.2 joerg case 'f': 2624 1.2 joerg case 'B': 2625 1.2 joerg case 'R': 2626 1.2 joerg case ':': 2627 1.2 joerg opcode |= RS2 (mask); 2628 1.1 skrll continue; 2629 1.1 skrll 2630 1.1 skrll case '\'': 2631 1.4 christos opcode |= RS2 (mask & 0xe); 2632 1.1 skrll continue; 2633 1.1 skrll 2634 1.9 christos case '4': 2635 1.9 christos case '5': 2636 1.9 christos opcode |= RS3 (mask); 2637 1.9 christos continue; 2638 1.9 christos 2639 1.9 christos case 'g': 2640 1.9 christos case 'H': 2641 1.9 christos case 'J': 2642 1.9 christos case '^': 2643 1.1 skrll opcode |= RD (mask); 2644 1.1 skrll continue; 2645 1.1 skrll 2646 1.1 skrll case '}': 2647 1.1 skrll if (RD (mask) != (opcode & RD (0x1f))) 2648 1.1 skrll { 2649 1.1 skrll error_message = _(": Instruction requires frs2 and " 2650 1.7 christos "frsd must be the same register"); 2651 1.1 skrll goto error; 2652 1.1 skrll } 2653 1.1 skrll continue; 2654 1.1 skrll } /* Pack it in. */ 2655 1.1 skrll 2656 1.1 skrll know (0); 2657 1.2 joerg break; 2658 1.7 christos } /* float arg */ 2659 1.2 joerg 2660 1.2 joerg case 'F': 2661 1.2 joerg if (startswith (s, "%fsr")) 2662 1.2 joerg { 2663 1.2 joerg s += 4; 2664 1.2 joerg continue; 2665 1.1 skrll } 2666 1.1 skrll break; 2667 1.1 skrll 2668 1.1 skrll case '(': 2669 1.1 skrll if (startswith (s, "%efsr")) 2670 1.1 skrll { 2671 1.1 skrll s += 5; 2672 1.1 skrll continue; 2673 1.1 skrll } 2674 1.1 skrll break; 2675 1.1 skrll 2676 1.1 skrll case '0': /* 64 bit immediate (set, setsw, setx insn) */ 2677 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; /* reloc handled elsewhere */ 2678 1.1 skrll goto immediate; 2679 1.1 skrll 2680 1.1 skrll case 'l': /* 22 bit PC relative immediate */ 2681 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_WDISP22; 2682 1.1 skrll the_insn.pcrel = 1; 2683 1.1 skrll goto immediate; 2684 1.1 skrll 2685 1.1 skrll case 'L': /* 30 bit immediate */ 2686 1.1 skrll the_insn.reloc = BFD_RELOC_32_PCREL_S2; 2687 1.1 skrll the_insn.pcrel = 1; 2688 1.1 skrll goto immediate; 2689 1.1 skrll 2690 1.9 christos case 'h': 2691 1.1 skrll case 'n': /* 22 bit immediate */ 2692 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC22; 2693 1.1 skrll goto immediate; 2694 1.1 skrll 2695 1.3 christos case 'i': /* 13 bit immediate */ 2696 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC13; 2697 1.1 skrll 2698 1.1 skrll /* fallthrough */ 2699 1.1 skrll 2700 1.1 skrll immediate: 2701 1.1 skrll if (is_whitespace (*s)) 2702 1.3 christos s++; 2703 1.3 christos 2704 1.3 christos { 2705 1.3 christos char *s1; 2706 1.3 christos const char *op_arg = NULL; 2707 1.3 christos static expressionS op_exp; 2708 1.3 christos bfd_reloc_code_real_type old_reloc = the_insn.reloc; 2709 1.3 christos 2710 1.1 skrll /* Check for %hi, etc. */ 2711 1.3 christos if (*s == '%') 2712 1.1 skrll { 2713 1.3 christos const struct perc_entry *p; 2714 1.1 skrll 2715 1.1 skrll for (p = perc_table; p->type != perc_entry_none; p++) 2716 1.1 skrll if ((p->type == perc_entry_imm_pop || p->type == perc_entry_reg) 2717 1.3 christos && strncmp (s + 1, p->name, p->len) == 0) 2718 1.3 christos break; 2719 1.3 christos if (p->type == perc_entry_none || p->type == perc_entry_reg) 2720 1.3 christos break; 2721 1.1 skrll 2722 1.1 skrll if (s[p->len + 1] != '(') 2723 1.1 skrll { 2724 1.1 skrll as_bad (_("Illegal operands: %%%s requires arguments in ()"), p->name); 2725 1.1 skrll return special_case; 2726 1.1 skrll } 2727 1.1 skrll 2728 1.1 skrll op_arg = p->name; 2729 1.1 skrll the_insn.reloc = p->pop->reloc; 2730 1.1 skrll s += p->len + 2; 2731 1.1 skrll v9_arg_p = p->pop->flags & F_POP_V9; 2732 1.1 skrll } 2733 1.1 skrll 2734 1.1 skrll /* Note that if the get_expression() fails, we will still 2735 1.1 skrll have created U entries in the symbol table for the 2736 1.1 skrll 'symbols' in the input string. Try not to create U 2737 1.1 skrll symbols for registers, etc. */ 2738 1.1 skrll 2739 1.1 skrll /* This stuff checks to see if the expression ends in 2740 1.1 skrll +%reg. If it does, it removes the register from 2741 1.1 skrll the expression, and re-sets 's' to point to the 2742 1.1 skrll right place. */ 2743 1.1 skrll 2744 1.1 skrll if (op_arg) 2745 1.1 skrll { 2746 1.1 skrll int npar = 0; 2747 1.1 skrll 2748 1.1 skrll for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++) 2749 1.1 skrll if (*s1 == '(') 2750 1.1 skrll npar++; 2751 1.1 skrll else if (*s1 == ')') 2752 1.1 skrll { 2753 1.1 skrll if (!npar) 2754 1.1 skrll break; 2755 1.1 skrll npar--; 2756 1.8 christos } 2757 1.3 christos 2758 1.3 christos if (*s1 != ')') 2759 1.3 christos { 2760 1.3 christos as_bad (_("Illegal operands: %%%s requires arguments in ()"), op_arg); 2761 1.1 skrll return special_case; 2762 1.1 skrll } 2763 1.1 skrll 2764 1.1 skrll *s1 = '\0'; 2765 1.1 skrll (void) get_expression (s); 2766 1.1 skrll *s1 = ')'; 2767 1.1 skrll if (expr_parse_end != s1) 2768 1.1 skrll { 2769 1.1 skrll as_bad (_("Expression inside %%%s could not be parsed"), op_arg); 2770 1.1 skrll return special_case; 2771 1.1 skrll } 2772 1.1 skrll s = s1 + 1; 2773 1.1 skrll if (*s == ',' || *s == ']' || !*s) 2774 1.1 skrll continue; 2775 1.1 skrll if (*s != '+' && *s != '-') 2776 1.1 skrll { 2777 1.1 skrll as_bad (_("Illegal operands: Can't do arithmetics other than + and - involving %%%s()"), op_arg); 2778 1.1 skrll return special_case; 2779 1.1 skrll } 2780 1.1 skrll *s1 = '0'; 2781 1.1 skrll s = s1; 2782 1.2 joerg op_exp = the_insn.exp; 2783 1.1 skrll memset (&the_insn.exp, 0, sizeof (the_insn.exp)); 2784 1.2 joerg } 2785 1.2 joerg 2786 1.1 skrll for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++) 2787 1.1 skrll ; 2788 1.1 skrll 2789 1.1 skrll if (s1 != s && ISDIGIT (s1[-1])) 2790 1.1 skrll { 2791 1.1 skrll if (s1[-2] == '%' && s1[-3] == '+') 2792 1.1 skrll s1 -= 3; 2793 1.1 skrll else if (strchr ("golir0123456789", s1[-2]) && s1[-3] == '%' && s1[-4] == '+') 2794 1.1 skrll s1 -= 4; 2795 1.1 skrll else if (s1[-3] == 'r' && s1[-4] == '%' && s1[-5] == '+') 2796 1.1 skrll s1 -= 5; 2797 1.1 skrll else 2798 1.1 skrll s1 = NULL; 2799 1.1 skrll if (s1) 2800 1.1 skrll { 2801 1.1 skrll *s1 = '\0'; 2802 1.1 skrll if (op_arg && s1 == s + 1) 2803 1.1 skrll the_insn.exp.X_op = O_absent; 2804 1.1 skrll else 2805 1.1 skrll (void) get_expression (s); 2806 1.1 skrll *s1 = '+'; 2807 1.1 skrll if (op_arg) 2808 1.1 skrll *s = ')'; 2809 1.8 christos s = s1; 2810 1.1 skrll } 2811 1.1 skrll } 2812 1.1 skrll else 2813 1.1 skrll s1 = NULL; 2814 1.1 skrll 2815 1.1 skrll if (!s1) 2816 1.1 skrll { 2817 1.1 skrll (void) get_expression (s); 2818 1.1 skrll if (op_arg) 2819 1.1 skrll *s = ')'; 2820 1.1 skrll s = expr_parse_end; 2821 1.1 skrll } 2822 1.1 skrll 2823 1.1 skrll if (op_arg) 2824 1.1 skrll { 2825 1.1 skrll the_insn.exp2 = the_insn.exp; 2826 1.1 skrll the_insn.exp = op_exp; 2827 1.1 skrll if (the_insn.exp2.X_op == O_absent) 2828 1.1 skrll the_insn.exp2.X_op = O_illegal; 2829 1.1 skrll else if (the_insn.exp.X_op == O_absent) 2830 1.1 skrll { 2831 1.1 skrll the_insn.exp = the_insn.exp2; 2832 1.1 skrll the_insn.exp2.X_op = O_illegal; 2833 1.1 skrll } 2834 1.1 skrll else if (the_insn.exp.X_op == O_constant) 2835 1.1 skrll { 2836 1.1 skrll valueT val = the_insn.exp.X_add_number; 2837 1.1 skrll switch (the_insn.reloc) 2838 1.1 skrll { 2839 1.1 skrll default: 2840 1.1 skrll break; 2841 1.1 skrll 2842 1.1 skrll case BFD_RELOC_SPARC_HH22: 2843 1.1 skrll val = BSR (val, 32); 2844 1.1 skrll /* Fall through. */ 2845 1.1 skrll 2846 1.1 skrll case BFD_RELOC_SPARC_LM22: 2847 1.1 skrll case BFD_RELOC_HI22: 2848 1.2 joerg val = (val >> 10) & 0x3fffff; 2849 1.2 joerg break; 2850 1.2 joerg 2851 1.2 joerg case BFD_RELOC_SPARC_HM10: 2852 1.2 joerg val = BSR (val, 32); 2853 1.1 skrll /* Fall through. */ 2854 1.1 skrll 2855 1.1 skrll case BFD_RELOC_LO10: 2856 1.1 skrll val &= 0x3ff; 2857 1.1 skrll break; 2858 1.1 skrll 2859 1.1 skrll case BFD_RELOC_SPARC_H34: 2860 1.1 skrll val >>= 12; 2861 1.1 skrll val &= 0x3fffff; 2862 1.1 skrll break; 2863 1.1 skrll 2864 1.1 skrll case BFD_RELOC_SPARC_H44: 2865 1.1 skrll val >>= 22; 2866 1.1 skrll val &= 0x3fffff; 2867 1.1 skrll break; 2868 1.1 skrll 2869 1.1 skrll case BFD_RELOC_SPARC_M44: 2870 1.1 skrll val >>= 12; 2871 1.1 skrll val &= 0x3ff; 2872 1.1 skrll break; 2873 1.1 skrll 2874 1.1 skrll case BFD_RELOC_SPARC_L44: 2875 1.1 skrll val &= 0xfff; 2876 1.1 skrll break; 2877 1.1 skrll 2878 1.1 skrll case BFD_RELOC_SPARC_HIX22: 2879 1.1 skrll val = ~val; 2880 1.1 skrll val = (val >> 10) & 0x3fffff; 2881 1.1 skrll break; 2882 1.1 skrll 2883 1.1 skrll case BFD_RELOC_SPARC_LOX10: 2884 1.1 skrll val = (val & 0x3ff) | 0x1c00; 2885 1.1 skrll break; 2886 1.1 skrll } 2887 1.1 skrll the_insn.exp = the_insn.exp2; 2888 1.1 skrll the_insn.exp.X_add_number += val; 2889 1.1 skrll the_insn.exp2.X_op = O_illegal; 2890 1.1 skrll the_insn.reloc = old_reloc; 2891 1.1 skrll } 2892 1.1 skrll else if (the_insn.exp2.X_op != O_constant) 2893 1.1 skrll { 2894 1.1 skrll as_bad (_("Illegal operands: Can't add non-constant expression to %%%s()"), op_arg); 2895 1.1 skrll return special_case; 2896 1.1 skrll } 2897 1.1 skrll else 2898 1.1 skrll { 2899 1.1 skrll if (old_reloc != BFD_RELOC_SPARC13 2900 1.1 skrll || the_insn.reloc != BFD_RELOC_LO10 2901 1.1 skrll || sparc_arch_size != 64 2902 1.1 skrll || sparc_pic_code) 2903 1.1 skrll { 2904 1.1 skrll as_bad (_("Illegal operands: Can't do arithmetics involving %%%s() of a relocatable symbol"), op_arg); 2905 1.1 skrll return special_case; 2906 1.1 skrll } 2907 1.1 skrll the_insn.reloc = BFD_RELOC_SPARC_OLO10; 2908 1.1 skrll } 2909 1.1 skrll } 2910 1.1 skrll } 2911 1.1 skrll /* Check for constants that don't require emitting a reloc. */ 2912 1.1 skrll if (the_insn.exp.X_op == O_constant 2913 1.1 skrll && the_insn.exp.X_add_symbol == 0 2914 1.1 skrll && the_insn.exp.X_op_symbol == 0) 2915 1.1 skrll { 2916 1.1 skrll /* For pc-relative call instructions, we reject 2917 1.1 skrll constants to get better code. */ 2918 1.1 skrll if (the_insn.pcrel 2919 1.1 skrll && the_insn.reloc == BFD_RELOC_32_PCREL_S2 2920 1.1 skrll && in_signed_range (the_insn.exp.X_add_number, 0x3fff)) 2921 1.1 skrll { 2922 1.1 skrll error_message = _(": PC-relative operand can't be a constant"); 2923 1.1 skrll goto error; 2924 1.1 skrll } 2925 1.1 skrll 2926 1.1 skrll if (the_insn.reloc >= BFD_RELOC_SPARC_TLS_GD_HI22 2927 1.1 skrll && the_insn.reloc <= BFD_RELOC_SPARC_TLS_TPOFF64) 2928 1.1 skrll { 2929 1.1 skrll error_message = _(": TLS operand can't be a constant"); 2930 1.2 joerg goto error; 2931 1.2 joerg } 2932 1.2 joerg 2933 1.2 joerg /* Constants that won't fit are checked in md_apply_fix 2934 1.2 joerg and bfd_install_relocation. 2935 1.2 joerg ??? It would be preferable to install the constants 2936 1.2 joerg into the insn here and save having to create a fixS 2937 1.2 joerg for each one. There already exists code to handle 2938 1.4 christos all the various cases (e.g. in md_apply_fix and 2939 1.4 christos bfd_install_relocation) so duplicating all that code 2940 1.2 joerg here isn't right. */ 2941 1.2 joerg 2942 1.2 joerg /* This is a special case to handle cbcond instructions 2943 1.4 christos properly, which can need two relocations. The first 2944 1.2 joerg one is for the 5-bit immediate field and the latter 2945 1.2 joerg is going to be for the WDISP10 branch part. We 2946 1.2 joerg handle the R_SPARC_5 immediate directly here so that 2947 1.2 joerg we don't need to add support for multiple relocations 2948 1.2 joerg in one instruction just yet. */ 2949 1.2 joerg if (the_insn.reloc == BFD_RELOC_SPARC_5 2950 1.2 joerg && ((insn->match & OP(0x3)) == 0)) 2951 1.1 skrll { 2952 1.1 skrll valueT val = the_insn.exp.X_add_number; 2953 1.1 skrll 2954 1.1 skrll the_insn.reloc = BFD_RELOC_NONE; 2955 1.1 skrll if (! in_bitfield_range (val, 0x1f)) 2956 1.1 skrll { 2957 1.1 skrll error_message = _(": Immediate value in cbcond is out of range."); 2958 1.1 skrll goto error; 2959 1.1 skrll } 2960 1.1 skrll opcode |= val & 0x1f; 2961 1.1 skrll } 2962 1.1 skrll } 2963 1.1 skrll 2964 1.1 skrll continue; 2965 1.1 skrll 2966 1.1 skrll case 'a': 2967 1.1 skrll if (*s++ == 'a') 2968 1.1 skrll { 2969 1.1 skrll opcode |= ANNUL; 2970 1.4 christos continue; 2971 1.1 skrll } 2972 1.1 skrll break; 2973 1.1 skrll 2974 1.1 skrll case 'A': 2975 1.4 christos { 2976 1.1 skrll int asi = 0; 2977 1.1 skrll 2978 1.1 skrll /* Parse an asi. */ 2979 1.1 skrll if (*s == '#') 2980 1.1 skrll { 2981 1.1 skrll if (! parse_sparc_asi (&s, &sasi)) 2982 1.1 skrll { 2983 1.1 skrll error_message = _(": invalid ASI name"); 2984 1.1 skrll goto error; 2985 1.1 skrll } 2986 1.1 skrll asi = sasi->value; 2987 1.1 skrll } 2988 1.1 skrll else 2989 1.1 skrll { 2990 1.1 skrll if (! parse_const_expr_arg (&s, &asi)) 2991 1.1 skrll { 2992 1.1 skrll error_message = _(": invalid ASI expression"); 2993 1.1 skrll goto error; 2994 1.1 skrll } 2995 1.7 christos if (asi < 0 || asi > 255) 2996 1.1 skrll { 2997 1.1 skrll error_message = _(": invalid ASI number"); 2998 1.1 skrll goto error; 2999 1.1 skrll } 3000 1.1 skrll } 3001 1.1 skrll opcode |= ASI (asi); 3002 1.1 skrll continue; 3003 1.7 christos } /* Alternate space. */ 3004 1.1 skrll 3005 1.1 skrll case 'p': 3006 1.1 skrll if (startswith (s, "%psr")) 3007 1.1 skrll { 3008 1.1 skrll s += 4; 3009 1.1 skrll continue; 3010 1.1 skrll } 3011 1.7 christos break; 3012 1.1 skrll 3013 1.1 skrll case 'q': /* Floating point queue. */ 3014 1.1 skrll if (startswith (s, "%fq")) 3015 1.1 skrll { 3016 1.1 skrll s += 3; 3017 1.1 skrll continue; 3018 1.1 skrll } 3019 1.1 skrll break; 3020 1.1 skrll 3021 1.1 skrll case 'Q': /* Coprocessor queue. */ 3022 1.1 skrll if (startswith (s, "%cq")) 3023 1.1 skrll { 3024 1.1 skrll s += 3; 3025 1.1 skrll continue; 3026 1.1 skrll } 3027 1.1 skrll break; 3028 1.1 skrll 3029 1.1 skrll case 'S': 3030 1.1 skrll if (strcmp (str, "set") == 0 3031 1.1 skrll || strcmp (str, "setuw") == 0) 3032 1.1 skrll { 3033 1.1 skrll special_case = SPECIAL_CASE_SET; 3034 1.1 skrll continue; 3035 1.7 christos } 3036 1.1 skrll else if (strcmp (str, "setsw") == 0) 3037 1.1 skrll { 3038 1.1 skrll special_case = SPECIAL_CASE_SETSW; 3039 1.1 skrll continue; 3040 1.1 skrll } 3041 1.1 skrll else if (strcmp (str, "setx") == 0) 3042 1.1 skrll { 3043 1.7 christos special_case = SPECIAL_CASE_SETX; 3044 1.1 skrll continue; 3045 1.1 skrll } 3046 1.1 skrll else if (startswith (str, "fdiv")) 3047 1.1 skrll { 3048 1.1 skrll special_case = SPECIAL_CASE_FDIV; 3049 1.7 christos continue; 3050 1.1 skrll } 3051 1.1 skrll break; 3052 1.1 skrll 3053 1.1 skrll case 'o': 3054 1.2 joerg if (!startswith (s, "%asi")) 3055 1.7 christos break; 3056 1.2 joerg s += 4; 3057 1.2 joerg continue; 3058 1.2 joerg 3059 1.2 joerg case 's': 3060 1.4 christos if (!startswith (s, "%fprs")) 3061 1.7 christos break; 3062 1.4 christos s += 5; 3063 1.4 christos continue; 3064 1.4 christos 3065 1.4 christos case '{': 3066 1.1 skrll if (!startswith (s, "%mcdper")) 3067 1.7 christos break; 3068 1.1 skrll s += 7; 3069 1.1 skrll continue; 3070 1.1 skrll 3071 1.1 skrll case '&': 3072 1.1 skrll if (!startswith (s, "%entropy")) 3073 1.7 christos break; 3074 1.1 skrll s += 8; 3075 1.1 skrll continue; 3076 1.1 skrll 3077 1.1 skrll case 'E': 3078 1.1 skrll if (!startswith (s, "%ccr")) 3079 1.7 christos break; 3080 1.1 skrll s += 4; 3081 1.1 skrll continue; 3082 1.1 skrll 3083 1.1 skrll case 't': 3084 1.4 christos if (!startswith (s, "%tbr")) 3085 1.4 christos break; 3086 1.4 christos s += 4; 3087 1.4 christos continue; 3088 1.4 christos 3089 1.4 christos case 'w': 3090 1.4 christos if (!startswith (s, "%wim")) 3091 1.4 christos break; 3092 1.4 christos s += 4; 3093 1.4 christos continue; 3094 1.4 christos 3095 1.4 christos case '|': 3096 1.4 christos { 3097 1.4 christos int imm2 = 0; 3098 1.4 christos 3099 1.4 christos /* Parse a 2-bit immediate. */ 3100 1.4 christos if (! parse_const_expr_arg (&s, &imm2)) 3101 1.4 christos { 3102 1.4 christos error_message = _(": non-immdiate imm2 operand"); 3103 1.4 christos goto error; 3104 1.1 skrll } 3105 1.1 skrll if ((imm2 & ~0x3) != 0) 3106 1.1 skrll { 3107 1.1 skrll error_message = _(": imm2 immediate operand out of range (0-3)"); 3108 1.1 skrll goto error; 3109 1.1 skrll } 3110 1.1 skrll 3111 1.1 skrll opcode |= ((imm2 & 0x2) << 3) | (imm2 & 0x1); 3112 1.1 skrll continue; 3113 1.1 skrll } 3114 1.1 skrll 3115 1.1 skrll case 'x': 3116 1.1 skrll { 3117 1.1 skrll char *push = input_line_pointer; 3118 1.1 skrll expressionS e; 3119 1.1 skrll 3120 1.1 skrll input_line_pointer = s; 3121 1.1 skrll expression (&e); 3122 1.1 skrll if (e.X_op == O_constant) 3123 1.1 skrll { 3124 1.1 skrll int n = e.X_add_number; 3125 1.1 skrll if (n != e.X_add_number || (n & ~0x1ff) != 0) 3126 1.1 skrll as_bad (_("OPF immediate operand out of range (0-0x1ff)")); 3127 1.7 christos else 3128 1.1 skrll opcode |= e.X_add_number << 5; 3129 1.1 skrll } 3130 1.1 skrll else 3131 1.1 skrll as_bad (_("non-immediate OPF operand, ignored")); 3132 1.1 skrll s = input_line_pointer; 3133 1.1 skrll input_line_pointer = push; 3134 1.1 skrll continue; 3135 1.1 skrll } 3136 1.1 skrll 3137 1.1 skrll case 'y': 3138 1.1 skrll if (!startswith (s, "%y")) 3139 1.1 skrll break; 3140 1.1 skrll s += 2; 3141 1.1 skrll continue; 3142 1.1 skrll 3143 1.1 skrll case 'u': 3144 1.1 skrll case 'U': 3145 1.1 skrll { 3146 1.1 skrll /* Parse a sparclet cpreg. */ 3147 1.1 skrll int cpreg; 3148 1.1 skrll if (! parse_keyword_arg (sparc_encode_sparclet_cpreg, &s, &cpreg)) 3149 1.1 skrll { 3150 1.1 skrll error_message = _(": invalid cpreg name"); 3151 1.1 skrll goto error; 3152 1.1 skrll } 3153 1.1 skrll opcode |= (*args == 'U' ? RS1 (cpreg) : RD (cpreg)); 3154 1.1 skrll continue; 3155 1.1 skrll } 3156 1.1 skrll 3157 1.1 skrll default: 3158 1.1 skrll as_fatal (_("failed sanity check.")); 3159 1.1 skrll } /* switch on arg code. */ 3160 1.1 skrll 3161 1.1 skrll /* Break out of for() loop. */ 3162 1.1 skrll break; 3163 1.1 skrll } /* For each arg that we expect. */ 3164 1.1 skrll 3165 1.1 skrll error: 3166 1.1 skrll if (match == 0) 3167 1.1 skrll { 3168 1.1 skrll /* Args don't match. */ 3169 1.1 skrll if (&insn[1] - sparc_opcodes < sparc_num_opcodes 3170 1.1 skrll && (insn->name == insn[1].name 3171 1.1 skrll || !strcmp (insn->name, insn[1].name))) 3172 1.1 skrll { 3173 1.1 skrll ++insn; 3174 1.1 skrll s = argsStart; 3175 1.4 christos continue; 3176 1.4 christos } 3177 1.1 skrll else 3178 1.4 christos { 3179 1.4 christos as_bad (_("Illegal operands%s"), error_message); 3180 1.4 christos return special_case; 3181 1.4 christos } 3182 1.4 christos } 3183 1.4 christos else 3184 1.4 christos { 3185 1.4 christos /* We have a match. Now see if the architecture is OK. */ 3186 1.7 christos /* String to use in case of architecture warning. */ 3187 1.1 skrll const char *msg_str = str; 3188 1.5 christos int needed_arch_mask = insn->architecture; 3189 1.2 joerg 3190 1.2 joerg /* Include the ASI architecture needed as well */ 3191 1.2 joerg if (sasi && needed_arch_mask > sasi->architecture) 3192 1.1 skrll { 3193 1.1 skrll needed_arch_mask = sasi->architecture; 3194 1.1 skrll msg_str = sasi->name; 3195 1.1 skrll } 3196 1.1 skrll 3197 1.1 skrll uint64_t hwcaps = ((uint64_t) insn->hwcaps2 << 32) | insn->hwcaps; 3198 1.1 skrll 3199 1.1 skrll #ifndef TE_SOLARIS 3200 1.1 skrll if (hwcaps) 3201 1.1 skrll hwcap_seen |= hwcaps; 3202 1.1 skrll #endif 3203 1.1 skrll if (v9_arg_p) 3204 1.1 skrll { 3205 1.1 skrll needed_arch_mask &= 3206 1.1 skrll ~(SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9) - 1); 3207 1.1 skrll if (! needed_arch_mask) 3208 1.1 skrll needed_arch_mask = 3209 1.1 skrll SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9); 3210 1.1 skrll } 3211 1.1 skrll 3212 1.1 skrll if (needed_arch_mask 3213 1.2 joerg & SPARC_OPCODE_SUPPORTED (current_architecture)) 3214 1.1 skrll /* OK. */ 3215 1.1 skrll ; 3216 1.1 skrll /* Can we bump up the architecture? */ 3217 1.1 skrll else if (needed_arch_mask 3218 1.1 skrll & SPARC_OPCODE_SUPPORTED (max_architecture)) 3219 1.1 skrll { 3220 1.4 christos enum sparc_opcode_arch_val needed_architecture = 3221 1.1 skrll sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture) 3222 1.1 skrll & needed_arch_mask); 3223 1.1 skrll 3224 1.4 christos gas_assert (needed_architecture <= SPARC_OPCODE_ARCH_MAX); 3225 1.7 christos if (warn_on_bump 3226 1.7 christos && needed_architecture > warn_after_architecture) 3227 1.7 christos { 3228 1.7 christos as_warn (_("architecture bumped from \"%s\" to \"%s\" on \"%s\""), 3229 1.1 skrll sparc_opcode_archs[current_architecture].name, 3230 1.1 skrll sparc_opcode_archs[needed_architecture].name, 3231 1.1 skrll msg_str); 3232 1.1 skrll warn_after_architecture = needed_architecture; 3233 1.1 skrll } 3234 1.1 skrll current_architecture = needed_architecture; 3235 1.1 skrll hwcap_allowed 3236 1.1 skrll = (hwcap_allowed 3237 1.1 skrll | hwcaps 3238 1.1 skrll | ((uint64_t) sparc_opcode_archs[current_architecture].hwcaps2 << 32) 3239 1.1 skrll | sparc_opcode_archs[current_architecture].hwcaps); 3240 1.1 skrll } 3241 1.1 skrll /* Conflict. */ 3242 1.1 skrll /* ??? This seems to be a bit fragile. What if the next entry in 3243 1.1 skrll the opcode table is the one we want and it is supported? 3244 1.1 skrll It is possible to arrange the table today so that this can't 3245 1.1 skrll happen but what about tomorrow? */ 3246 1.1 skrll else 3247 1.1 skrll { 3248 1.1 skrll int arch, printed_one_p = 0; 3249 1.1 skrll char *p; 3250 1.1 skrll char required_archs[SPARC_OPCODE_ARCH_MAX * 16]; 3251 1.1 skrll 3252 1.1 skrll /* Create a list of the architectures that support the insn. */ 3253 1.1 skrll needed_arch_mask &= ~SPARC_OPCODE_SUPPORTED (max_architecture); 3254 1.1 skrll p = required_archs; 3255 1.1 skrll arch = sparc_ffs (needed_arch_mask); 3256 1.1 skrll while ((1 << arch) <= needed_arch_mask) 3257 1.1 skrll { 3258 1.4 christos if ((1 << arch) & needed_arch_mask) 3259 1.4 christos { 3260 1.1 skrll if (printed_one_p) 3261 1.1 skrll *p++ = '|'; 3262 1.1 skrll strcpy (p, sparc_opcode_archs[arch].name); 3263 1.1 skrll p += strlen (p); 3264 1.2 joerg printed_one_p = 1; 3265 1.2 joerg } 3266 1.2 joerg ++arch; 3267 1.2 joerg } 3268 1.2 joerg 3269 1.2 joerg as_bad (_("Architecture mismatch on \"%s %s\"."), str, argsStart); 3270 1.2 joerg as_tsktsk (_("(Requires %s; requested architecture is %s.)"), 3271 1.2 joerg required_archs, 3272 1.2 joerg sparc_opcode_archs[max_architecture].name); 3273 1.2 joerg return special_case; 3274 1.2 joerg } 3275 1.1 skrll 3276 1.1 skrll /* Make sure the hwcaps used by the instruction are 3277 1.1 skrll currently enabled. */ 3278 1.1 skrll if (hwcaps & ~hwcap_allowed) 3279 1.1 skrll { 3280 1.1 skrll const char *hwcap_name = get_hwcap_name(hwcaps & ~hwcap_allowed); 3281 1.1 skrll 3282 1.1 skrll as_bad (_("Hardware capability \"%s\" not enabled for \"%s\"."), 3283 1.1 skrll hwcap_name, str); 3284 1.4 christos return special_case; 3285 1.4 christos } 3286 1.4 christos } /* If no match. */ 3287 1.4 christos 3288 1.4 christos break; 3289 1.4 christos } /* Forever looking for a match. */ 3290 1.4 christos 3291 1.4 christos the_insn.opcode = opcode; 3292 1.4 christos return special_case; 3293 1.4 christos } 3294 1.4 christos 3295 1.4 christos static char * 3296 1.4 christos skip_over_keyword (char *q) 3297 1.4 christos { 3298 1.4 christos for (q = q + (*q == '#' || *q == '%'); 3299 1.4 christos ISALNUM (*q) || *q == '_'; 3300 1.4 christos ++q) 3301 1.4 christos continue; 3302 1.4 christos return q; 3303 1.4 christos } 3304 1.4 christos 3305 1.4 christos static int 3306 1.4 christos parse_sparc_asi (char **input_pointer_p, const sparc_asi **value_p) 3307 1.4 christos { 3308 1.4 christos const sparc_asi *value; 3309 1.4 christos char c, *p, *q; 3310 1.4 christos 3311 1.4 christos p = *input_pointer_p; 3312 1.4 christos q = skip_over_keyword(p); 3313 1.1 skrll c = *q; 3314 1.1 skrll *q = 0; 3315 1.1 skrll value = sparc_encode_asi (p); 3316 1.1 skrll *q = c; 3317 1.1 skrll if (value == NULL) 3318 1.1 skrll return 0; 3319 1.1 skrll *value_p = value; 3320 1.1 skrll *input_pointer_p = q; 3321 1.1 skrll return 1; 3322 1.1 skrll } 3323 1.1 skrll 3324 1.1 skrll /* Parse an argument that can be expressed as a keyword. 3325 1.1 skrll (eg: #StoreStore or %ccfr). 3326 1.1 skrll The result is a boolean indicating success. 3327 1.4 christos If successful, INPUT_POINTER is updated. */ 3328 1.1 skrll 3329 1.1 skrll static int 3330 1.1 skrll parse_keyword_arg (int (*lookup_fn) (const char *), 3331 1.1 skrll char **input_pointerP, 3332 1.1 skrll int *valueP) 3333 1.1 skrll { 3334 1.1 skrll int value; 3335 1.1 skrll char c, *p, *q; 3336 1.1 skrll 3337 1.1 skrll p = *input_pointerP; 3338 1.1 skrll q = skip_over_keyword(p); 3339 1.1 skrll c = *q; 3340 1.1 skrll *q = 0; 3341 1.1 skrll value = (*lookup_fn) (p); 3342 1.1 skrll *q = c; 3343 1.1 skrll if (value == -1) 3344 1.1 skrll return 0; 3345 1.1 skrll *valueP = value; 3346 1.1 skrll *input_pointerP = q; 3347 1.1 skrll return 1; 3348 1.1 skrll } 3349 1.1 skrll 3350 1.1 skrll /* Parse an argument that is a constant expression. 3351 1.1 skrll The result is a boolean indicating success. */ 3352 1.1 skrll 3353 1.1 skrll static int 3354 1.1 skrll parse_const_expr_arg (char **input_pointerP, int *valueP) 3355 1.1 skrll { 3356 1.1 skrll char *save = input_line_pointer; 3357 1.1 skrll expressionS exp; 3358 1.1 skrll 3359 1.1 skrll input_line_pointer = *input_pointerP; 3360 1.1 skrll /* The next expression may be something other than a constant 3361 1.1 skrll (say if we're not processing the right variant of the insn). 3362 1.1 skrll Don't call expression unless we're sure it will succeed as it will 3363 1.1 skrll signal an error (which we want to defer until later). */ 3364 1.1 skrll /* FIXME: It might be better to define md_operand and have it recognize 3365 1.1 skrll things like %asi, etc. but continuing that route through to the end 3366 1.1 skrll is a lot of work. */ 3367 1.1 skrll if (*input_line_pointer == '%') 3368 1.1 skrll { 3369 1.1 skrll input_line_pointer = save; 3370 1.1 skrll return 0; 3371 1.1 skrll } 3372 1.1 skrll expression (&exp); 3373 1.1 skrll *input_pointerP = input_line_pointer; 3374 1.1 skrll input_line_pointer = save; 3375 1.1 skrll if (exp.X_op != O_constant) 3376 1.1 skrll return 0; 3377 1.1 skrll *valueP = exp.X_add_number; 3378 1.1 skrll return 1; 3379 1.1 skrll } 3380 1.1 skrll 3381 1.1 skrll /* Subroutine of sparc_ip to parse an expression. */ 3382 1.1 skrll 3383 1.1 skrll static int 3384 1.1 skrll get_expression (char *str) 3385 1.1 skrll { 3386 1.1 skrll char *save_in; 3387 1.1 skrll segT seg; 3388 1.8 christos 3389 1.1 skrll save_in = input_line_pointer; 3390 1.1 skrll input_line_pointer = str; 3391 1.1 skrll seg = expression (&the_insn.exp); 3392 1.8 christos if (seg != absolute_section 3393 1.1 skrll && seg != text_section 3394 1.1 skrll && seg != data_section 3395 1.1 skrll && seg != bss_section 3396 1.1 skrll && seg != undefined_section) 3397 1.1 skrll { 3398 1.1 skrll the_insn.error = _("bad segment"); 3399 1.1 skrll expr_parse_end = input_line_pointer; 3400 1.2 joerg input_line_pointer = save_in; 3401 1.1 skrll return 1; 3402 1.1 skrll } 3403 1.1 skrll expr_parse_end = input_line_pointer; 3404 1.1 skrll input_line_pointer = save_in; 3405 1.1 skrll return 0; 3406 1.9 christos } 3407 1.1 skrll 3408 1.9 christos /* Subroutine of md_assemble to output one insn. */ 3409 1.1 skrll 3410 1.1 skrll static void 3411 1.2 joerg output_insn (const struct sparc_opcode *insn, struct sparc_it *theinsn) 3412 1.1 skrll { 3413 1.1 skrll char *toP = frag_more (4); 3414 1.1 skrll 3415 1.1 skrll /* Put out the opcode. */ 3416 1.2 joerg if (INSN_BIG_ENDIAN) 3417 1.2 joerg number_to_chars_bigendian (toP, theinsn->opcode, 4); 3418 1.2 joerg else 3419 1.1 skrll number_to_chars_littleendian (toP, theinsn->opcode, 4); 3420 1.1 skrll 3421 1.1 skrll /* Put out the symbol-dependent stuff. */ 3422 1.1 skrll if (theinsn->reloc != BFD_RELOC_NONE) 3423 1.1 skrll { 3424 1.2 joerg fixS *fixP = fix_new_exp (frag_now, /* Which frag. */ 3425 1.2 joerg (toP - frag_now->fr_literal), /* Where. */ 3426 1.1 skrll 4, /* Size. */ 3427 1.1 skrll &theinsn->exp, 3428 1.1 skrll theinsn->pcrel, 3429 1.2 joerg theinsn->reloc); 3430 1.1 skrll /* Turn off overflow checking in fixup_segment. We'll do our 3431 1.1 skrll own overflow checking in md_apply_fix. This is necessary because 3432 1.1 skrll the insn size is 4 and fixup_segment will signal an overflow for 3433 1.1 skrll large 8 byte quantities. */ 3434 1.3 christos fixP->fx_no_overflow = 1; 3435 1.1 skrll if (theinsn->reloc == BFD_RELOC_SPARC_OLO10) 3436 1.1 skrll fixP->tc_fix_data = theinsn->exp2.X_add_number; 3437 1.1 skrll } 3438 1.1 skrll 3439 1.1 skrll last_insn = insn; 3440 1.1 skrll last_opcode = theinsn->opcode; 3441 1.1 skrll 3442 1.1 skrll dwarf2_emit_insn (4); 3443 1.1 skrll } 3444 1.1 skrll 3445 1.1 skrll const char * 3447 1.1 skrll md_atof (int type, char *litP, int *sizeP) 3448 1.1 skrll { 3449 1.1 skrll return ieee_md_atof (type, litP, sizeP, target_big_endian); 3450 1.1 skrll } 3451 1.1 skrll 3452 1.1 skrll /* Write a value out to the object file, using the appropriate 3453 1.1 skrll endianness. */ 3454 1.1 skrll 3455 1.1 skrll void 3456 1.1 skrll md_number_to_chars (char *buf, valueT val, int n) 3457 1.1 skrll { 3458 1.1 skrll if (target_big_endian) 3459 1.1 skrll number_to_chars_bigendian (buf, val, n); 3460 1.1 skrll else if (target_little_endian_data 3461 1.1 skrll && ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC)) 3462 1.1 skrll /* Output debug words, which are not in allocated sections, as big 3463 1.1 skrll endian. */ 3464 1.9 christos number_to_chars_bigendian (buf, val, n); 3465 1.1 skrll else if (target_little_endian_data || ! target_big_endian) 3466 1.1 skrll number_to_chars_littleendian (buf, val, n); 3467 1.2 joerg } 3468 1.1 skrll 3469 1.1 skrll /* Apply a fixS to the frags, now that we know the value it ought to 3471 1.1 skrll hold. */ 3472 1.1 skrll 3473 1.1 skrll void 3474 1.1 skrll md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED) 3475 1.1 skrll { 3476 1.1 skrll char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; 3477 1.1 skrll offsetT val = *valP; 3478 1.1 skrll long insn; 3479 1.1 skrll 3480 1.1 skrll gas_assert (fixP->fx_r_type < BFD_RELOC_UNUSED); 3481 1.1 skrll 3482 1.1 skrll fixP->fx_addnumber = val; /* Remember value for emit_reloc. */ 3483 1.1 skrll 3484 1.1 skrll /* SPARC ELF relocations don't use an addend in the data field. */ 3485 1.1 skrll if (fixP->fx_addsy != NULL) 3486 1.1 skrll { 3487 1.1 skrll switch (fixP->fx_r_type) 3488 1.1 skrll { 3489 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_HI22: 3490 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_LO10: 3491 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_ADD: 3492 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_CALL: 3493 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_HI22: 3494 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_LO10: 3495 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_ADD: 3496 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_CALL: 3497 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_HIX22: 3498 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_LOX10: 3499 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_ADD: 3500 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_HI22: 3501 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LO10: 3502 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LD: 3503 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LDX: 3504 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_ADD: 3505 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_HIX22: 3506 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_LOX10: 3507 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPMOD32: 3508 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPMOD64: 3509 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF32: 3510 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF64: 3511 1.1 skrll case BFD_RELOC_SPARC_TLS_TPOFF32: 3512 1.1 skrll case BFD_RELOC_SPARC_TLS_TPOFF64: 3513 1.1 skrll S_SET_THREAD_LOCAL (fixP->fx_addsy); 3514 1.1 skrll 3515 1.1 skrll default: 3516 1.1 skrll break; 3517 1.2 joerg } 3518 1.2 joerg 3519 1.2 joerg return; 3520 1.2 joerg } 3521 1.2 joerg 3522 1.2 joerg /* This is a hack. There should be a better way to 3523 1.1 skrll handle this. Probably in terms of howto fields, once 3524 1.1 skrll we can look at these fixups in terms of howtos. */ 3525 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_32_PCREL_S2 && fixP->fx_addsy) 3526 1.1 skrll val += fixP->fx_where + fixP->fx_frag->fr_address; 3527 1.1 skrll 3528 1.1 skrll /* If this is a data relocation, just output VAL. */ 3529 1.1 skrll 3530 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_8) 3531 1.1 skrll { 3532 1.1 skrll md_number_to_chars (buf, val, 1); 3533 1.1 skrll } 3534 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_16 3535 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_UA16) 3536 1.1 skrll { 3537 1.1 skrll md_number_to_chars (buf, val, 2); 3538 1.1 skrll } 3539 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_32 3540 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_UA32 3541 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_REV32) 3542 1.1 skrll { 3543 1.1 skrll md_number_to_chars (buf, val, 4); 3544 1.1 skrll } 3545 1.1 skrll else if (fixP->fx_r_type == BFD_RELOC_64 3546 1.1 skrll || fixP->fx_r_type == BFD_RELOC_SPARC_UA64) 3547 1.1 skrll { 3548 1.9 christos md_number_to_chars (buf, val, 8); 3549 1.1 skrll } 3550 1.9 christos else if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 3551 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 3552 1.1 skrll { 3553 1.1 skrll fixP->fx_done = 0; 3554 1.1 skrll return; 3555 1.1 skrll } 3556 1.1 skrll else 3557 1.1 skrll { 3558 1.1 skrll /* It's a relocation against an instruction. */ 3559 1.1 skrll 3560 1.1 skrll if (INSN_BIG_ENDIAN) 3561 1.1 skrll insn = bfd_getb32 (buf); 3562 1.1 skrll else 3563 1.1 skrll insn = bfd_getl32 (buf); 3564 1.1 skrll 3565 1.4 christos switch (fixP->fx_r_type) 3566 1.4 christos { 3567 1.4 christos case BFD_RELOC_32_PCREL_S2: 3568 1.4 christos val = val >> 2; 3569 1.4 christos /* FIXME: This increment-by-one deserves a comment of why it's 3570 1.4 christos being done! */ 3571 1.4 christos if (! sparc_pic_code 3572 1.1 skrll || fixP->fx_addsy == NULL 3573 1.1 skrll || symbol_section_p (fixP->fx_addsy)) 3574 1.1 skrll ++val; 3575 1.1 skrll 3576 1.1 skrll insn |= val & 0x3fffffff; 3577 1.1 skrll 3578 1.1 skrll /* See if we have a delay slot. In that case we attempt to 3579 1.1 skrll optimize several cases transforming CALL instructions 3580 1.1 skrll into branches. But we can only do that if the relocation 3581 1.1 skrll can be completely resolved here, i.e. if no undefined 3582 1.1 skrll symbol is associated with it. */ 3583 1.1 skrll if (sparc_relax && fixP->fx_addsy == NULL 3584 1.1 skrll && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix) 3585 1.1 skrll { 3586 1.1 skrll #define G0 0 3587 1.1 skrll #define O7 15 3588 1.1 skrll #define XCC (2 << 20) 3589 1.1 skrll #define COND(x) (((x)&0xf)<<25) 3590 1.1 skrll #define CONDA COND(0x8) 3591 1.1 skrll #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC) 3592 1.9 christos #define INSN_BA (F2(0,2) | CONDA) 3593 1.1 skrll #define INSN_OR F3(2, 0x2, 0) 3594 1.9 christos #define INSN_NOP F2(0,4) 3595 1.1 skrll 3596 1.1 skrll long delay; 3597 1.1 skrll 3598 1.1 skrll /* If the instruction is a call with either: 3599 1.1 skrll restore 3600 1.1 skrll arithmetic instruction with rd == %o7 3601 1.1 skrll where rs1 != %o7 and rs2 if it is register != %o7 3602 1.1 skrll then we can optimize if the call destination is near 3603 1.1 skrll by changing the call into a branch always. */ 3604 1.1 skrll if (INSN_BIG_ENDIAN) 3605 1.1 skrll delay = bfd_getb32 (buf + 4); 3606 1.1 skrll else 3607 1.1 skrll delay = bfd_getl32 (buf + 4); 3608 1.1 skrll if ((insn & OP (~0)) != OP (1) || (delay & OP (~0)) != OP (2)) 3609 1.1 skrll break; 3610 1.1 skrll if ((delay & OP3 (~0)) != OP3 (0x3d) /* Restore. */ 3611 1.1 skrll && ((delay & OP3 (0x28)) != 0 /* Arithmetic. */ 3612 1.1 skrll || ((delay & RD (~0)) != RD (O7)))) 3613 1.1 skrll break; 3614 1.1 skrll if ((delay & RS1 (~0)) == RS1 (O7) 3615 1.1 skrll || ((delay & F3I (~0)) == 0 3616 1.1 skrll && (delay & RS2 (~0)) == RS2 (O7))) 3617 1.1 skrll break; 3618 1.1 skrll /* Ensure the branch will fit into simm22. */ 3619 1.1 skrll if ((val & 0x3fe00000) 3620 1.1 skrll && (val & 0x3fe00000) != 0x3fe00000) 3621 1.1 skrll break; 3622 1.1 skrll /* Check if the arch is v9 and branch will fit 3623 1.1 skrll into simm19. */ 3624 1.1 skrll if (((val & 0x3c0000) == 0 3625 1.1 skrll || (val & 0x3c0000) == 0x3c0000) 3626 1.1 skrll && (sparc_arch_size == 64 3627 1.1 skrll || current_architecture >= SPARC_OPCODE_ARCH_V9)) 3628 1.9 christos /* ba,pt %xcc */ 3629 1.1 skrll insn = INSN_BPA | (val & 0x7ffff); 3630 1.9 christos else 3631 1.1 skrll /* ba */ 3632 1.1 skrll insn = INSN_BA | (val & 0x3fffff); 3633 1.1 skrll if (fixP->fx_where >= 4 3634 1.1 skrll && ((delay & (0xffffffff ^ RS1 (~0))) 3635 1.1 skrll == (INSN_OR | RD (O7) | RS2 (G0)))) 3636 1.1 skrll { 3637 1.1 skrll long setter; 3638 1.1 skrll int reg; 3639 1.1 skrll 3640 1.1 skrll if (INSN_BIG_ENDIAN) 3641 1.1 skrll setter = bfd_getb32 (buf - 4); 3642 1.1 skrll else 3643 1.1 skrll setter = bfd_getl32 (buf - 4); 3644 1.1 skrll if ((setter & (0xffffffff ^ RD (~0))) 3645 1.1 skrll != (INSN_OR | RS1 (O7) | RS2 (G0))) 3646 1.1 skrll break; 3647 1.9 christos /* The sequence was 3648 1.1 skrll or %o7, %g0, %rN 3649 1.9 christos call foo 3650 1.1 skrll or %rN, %g0, %o7 3651 1.1 skrll 3652 1.1 skrll If call foo was replaced with ba, replace 3653 1.1 skrll or %rN, %g0, %o7 with nop. */ 3654 1.1 skrll reg = (delay & RS1 (~0)) >> 14; 3655 1.1 skrll if (reg != ((setter & RD (~0)) >> 25) 3656 1.1 skrll || reg == G0 || reg == O7) 3657 1.1 skrll break; 3658 1.1 skrll 3659 1.1 skrll if (INSN_BIG_ENDIAN) 3660 1.1 skrll bfd_putb32 (INSN_NOP, buf + 4); 3661 1.1 skrll else 3662 1.1 skrll bfd_putl32 (INSN_NOP, buf + 4); 3663 1.1 skrll } 3664 1.1 skrll } 3665 1.1 skrll break; 3666 1.1 skrll 3667 1.1 skrll case BFD_RELOC_SPARC_11: 3668 1.1 skrll if (! in_signed_range (val, 0x7ff)) 3669 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3670 1.1 skrll _("relocation overflow")); 3671 1.1 skrll insn |= val & 0x7ff; 3672 1.1 skrll break; 3673 1.1 skrll 3674 1.1 skrll case BFD_RELOC_SPARC_10: 3675 1.1 skrll if (! in_signed_range (val, 0x3ff)) 3676 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3677 1.1 skrll _("relocation overflow")); 3678 1.1 skrll insn |= val & 0x3ff; 3679 1.1 skrll break; 3680 1.1 skrll 3681 1.1 skrll case BFD_RELOC_SPARC_7: 3682 1.1 skrll if (! in_bitfield_range (val, 0x7f)) 3683 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3684 1.1 skrll _("relocation overflow")); 3685 1.1 skrll insn |= val & 0x7f; 3686 1.1 skrll break; 3687 1.1 skrll 3688 1.1 skrll case BFD_RELOC_SPARC_6: 3689 1.2 joerg if (! in_bitfield_range (val, 0x3f)) 3690 1.2 joerg as_bad_where (fixP->fx_file, fixP->fx_line, 3691 1.2 joerg _("relocation overflow")); 3692 1.2 joerg insn |= val & 0x3f; 3693 1.2 joerg break; 3694 1.2 joerg 3695 1.2 joerg case BFD_RELOC_SPARC_5: 3696 1.2 joerg if (! in_bitfield_range (val, 0x1f)) 3697 1.2 joerg as_bad_where (fixP->fx_file, fixP->fx_line, 3698 1.2 joerg _("relocation overflow")); 3699 1.2 joerg insn |= val & 0x1f; 3700 1.2 joerg break; 3701 1.1 skrll 3702 1.1 skrll case BFD_RELOC_SPARC_WDISP10: 3703 1.1 skrll if ((val & 3) 3704 1.1 skrll || val >= 0x007fc 3705 1.1 skrll || val <= -(offsetT) 0x808) 3706 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3707 1.1 skrll _("relocation overflow")); 3708 1.1 skrll /* FIXME: The +1 deserves a comment. */ 3709 1.1 skrll val = (val >> 2) + 1; 3710 1.1 skrll insn |= ((val & 0x300) << 11) 3711 1.1 skrll | ((val & 0xff) << 5); 3712 1.1 skrll break; 3713 1.1 skrll 3714 1.1 skrll case BFD_RELOC_SPARC_WDISP16: 3715 1.1 skrll if ((val & 3) 3716 1.1 skrll || val >= 0x1fffc 3717 1.1 skrll || val <= -(offsetT) 0x20008) 3718 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3719 1.1 skrll _("relocation overflow")); 3720 1.1 skrll /* FIXME: The +1 deserves a comment. */ 3721 1.1 skrll val = (val >> 2) + 1; 3722 1.1 skrll insn |= ((val & 0xc000) << 6) | (val & 0x3fff); 3723 1.1 skrll break; 3724 1.1 skrll 3725 1.1 skrll case BFD_RELOC_SPARC_WDISP19: 3726 1.1 skrll if ((val & 3) 3727 1.1 skrll || val >= 0xffffc 3728 1.1 skrll || val <= -(offsetT) 0x100008) 3729 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3730 1.1 skrll _("relocation overflow")); 3731 1.1 skrll /* FIXME: The +1 deserves a comment. */ 3732 1.1 skrll val = (val >> 2) + 1; 3733 1.1 skrll insn |= val & 0x7ffff; 3734 1.1 skrll break; 3735 1.1 skrll 3736 1.1 skrll case BFD_RELOC_SPARC_HH22: 3737 1.1 skrll val = BSR (val, 32); 3738 1.1 skrll /* Fall through. */ 3739 1.1 skrll 3740 1.1 skrll case BFD_RELOC_SPARC_LM22: 3741 1.1 skrll case BFD_RELOC_HI22: 3742 1.1 skrll if (!fixP->fx_addsy) 3743 1.1 skrll insn |= (val >> 10) & 0x3fffff; 3744 1.1 skrll else 3745 1.1 skrll /* FIXME: Need comment explaining why we do this. */ 3746 1.1 skrll insn &= ~0xffff; 3747 1.1 skrll break; 3748 1.1 skrll 3749 1.1 skrll case BFD_RELOC_SPARC22: 3750 1.1 skrll if (val & ~0x003fffff) 3751 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3752 1.1 skrll _("relocation overflow")); 3753 1.1 skrll insn |= (val & 0x3fffff); 3754 1.1 skrll break; 3755 1.1 skrll 3756 1.1 skrll case BFD_RELOC_SPARC_HM10: 3757 1.1 skrll val = BSR (val, 32); 3758 1.1 skrll /* Fall through. */ 3759 1.1 skrll 3760 1.1 skrll case BFD_RELOC_LO10: 3761 1.1 skrll if (!fixP->fx_addsy) 3762 1.1 skrll insn |= val & 0x3ff; 3763 1.1 skrll else 3764 1.1 skrll /* FIXME: Need comment explaining why we do this. */ 3765 1.1 skrll insn &= ~0xff; 3766 1.1 skrll break; 3767 1.1 skrll 3768 1.1 skrll case BFD_RELOC_SPARC_OLO10: 3769 1.1 skrll val &= 0x3ff; 3770 1.1 skrll val += fixP->tc_fix_data; 3771 1.1 skrll /* Fall through. */ 3772 1.1 skrll 3773 1.1 skrll case BFD_RELOC_SPARC13: 3774 1.2 joerg if (! in_signed_range (val, 0x1fff)) 3775 1.2 joerg as_bad_where (fixP->fx_file, fixP->fx_line, 3776 1.2 joerg _("relocation overflow")); 3777 1.2 joerg insn |= val & 0x1fff; 3778 1.2 joerg break; 3779 1.2 joerg 3780 1.2 joerg case BFD_RELOC_SPARC_WDISP22: 3781 1.2 joerg val = (val >> 2) + 1; 3782 1.2 joerg /* Fall through. */ 3783 1.1 skrll case BFD_RELOC_SPARC_BASE22: 3784 1.1 skrll insn |= val & 0x3fffff; 3785 1.1 skrll break; 3786 1.1 skrll 3787 1.1 skrll case BFD_RELOC_SPARC_H34: 3788 1.1 skrll if (!fixP->fx_addsy) 3789 1.1 skrll { 3790 1.1 skrll bfd_vma tval = val; 3791 1.1 skrll tval >>= 12; 3792 1.1 skrll insn |= tval & 0x3fffff; 3793 1.1 skrll } 3794 1.1 skrll break; 3795 1.1 skrll 3796 1.1 skrll case BFD_RELOC_SPARC_H44: 3797 1.1 skrll if (!fixP->fx_addsy) 3798 1.1 skrll { 3799 1.1 skrll bfd_vma tval = val; 3800 1.1 skrll tval >>= 22; 3801 1.1 skrll insn |= tval & 0x3fffff; 3802 1.1 skrll } 3803 1.1 skrll break; 3804 1.1 skrll 3805 1.1 skrll case BFD_RELOC_SPARC_M44: 3806 1.1 skrll if (!fixP->fx_addsy) 3807 1.1 skrll insn |= (val >> 12) & 0x3ff; 3808 1.1 skrll break; 3809 1.1 skrll 3810 1.1 skrll case BFD_RELOC_SPARC_L44: 3811 1.1 skrll if (!fixP->fx_addsy) 3812 1.1 skrll insn |= val & 0xfff; 3813 1.1 skrll break; 3814 1.1 skrll 3815 1.1 skrll case BFD_RELOC_SPARC_HIX22: 3816 1.1 skrll if (!fixP->fx_addsy) 3817 1.1 skrll { 3818 1.1 skrll val ^= ~(offsetT) 0; 3819 1.1 skrll insn |= (val >> 10) & 0x3fffff; 3820 1.1 skrll } 3821 1.1 skrll break; 3822 1.1 skrll 3823 1.1 skrll case BFD_RELOC_SPARC_LOX10: 3824 1.9 christos if (!fixP->fx_addsy) 3825 1.1 skrll insn |= 0x1c00 | (val & 0x3ff); 3826 1.9 christos break; 3827 1.1 skrll 3828 1.1 skrll case BFD_RELOC_NONE: 3829 1.1 skrll default: 3830 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, 3831 1.1 skrll _("bad or unhandled relocation type: 0x%02x"), 3832 1.1 skrll fixP->fx_r_type); 3833 1.1 skrll break; 3834 1.1 skrll } 3835 1.1 skrll 3836 1.1 skrll if (INSN_BIG_ENDIAN) 3837 1.1 skrll bfd_putb32 (insn, buf); 3838 1.1 skrll else 3839 1.1 skrll bfd_putl32 (insn, buf); 3840 1.1 skrll } 3841 1.1 skrll 3842 1.1 skrll /* Are we finished with this relocation now? */ 3843 1.1 skrll if (fixP->fx_addsy == 0 && !fixP->fx_pcrel) 3844 1.9 christos fixP->fx_done = 1; 3845 1.9 christos } 3846 1.9 christos 3847 1.1 skrll /* Translate internal representation of relocation info to BFD target 3848 1.1 skrll format. */ 3849 1.1 skrll 3850 1.1 skrll arelent ** 3851 1.1 skrll tc_gen_reloc (asection *section, fixS *fixp) 3852 1.1 skrll { 3853 1.4 christos static arelent *relocs[3]; 3854 1.1 skrll arelent *reloc; 3855 1.1 skrll bfd_reloc_code_real_type code; 3856 1.4 christos 3857 1.4 christos reloc = notes_alloc (sizeof (arelent)); 3858 1.4 christos reloc->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 3859 1.4 christos relocs[0] = reloc; 3860 1.4 christos relocs[1] = NULL; 3861 1.4 christos *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 3862 1.4 christos reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 3863 1.4 christos 3864 1.4 christos switch (fixp->fx_r_type) 3865 1.4 christos { 3866 1.4 christos case BFD_RELOC_8: 3867 1.4 christos case BFD_RELOC_16: 3868 1.4 christos case BFD_RELOC_32: 3869 1.4 christos case BFD_RELOC_64: 3870 1.4 christos if (fixp->fx_pcrel) 3871 1.4 christos { 3872 1.4 christos switch (fixp->fx_size) 3873 1.4 christos { 3874 1.4 christos default: 3875 1.4 christos as_bad_where (fixp->fx_file, fixp->fx_line, 3876 1.4 christos _("can not do %d byte pc-relative relocation"), 3877 1.4 christos fixp->fx_size); 3878 1.4 christos code = fixp->fx_r_type; 3879 1.4 christos fixp->fx_pcrel = 0; 3880 1.1 skrll break; 3881 1.1 skrll case 1: code = BFD_RELOC_8_PCREL; break; 3882 1.1 skrll case 2: code = BFD_RELOC_16_PCREL; break; 3883 1.1 skrll case 4: code = BFD_RELOC_32_PCREL; break; 3884 1.1 skrll #ifdef BFD64 3885 1.1 skrll case 8: code = BFD_RELOC_64_PCREL; break; 3886 1.1 skrll #endif 3887 1.1 skrll } 3888 1.2 joerg if (fixp->fx_pcrel) 3889 1.1 skrll fixp->fx_addnumber = fixp->fx_offset; 3890 1.1 skrll break; 3891 1.1 skrll } 3892 1.1 skrll /* Fall through. */ 3893 1.1 skrll case BFD_RELOC_HI22: 3894 1.1 skrll case BFD_RELOC_LO10: 3895 1.1 skrll case BFD_RELOC_32_PCREL_S2: 3896 1.1 skrll case BFD_RELOC_SPARC13: 3897 1.1 skrll case BFD_RELOC_SPARC22: 3898 1.1 skrll case BFD_RELOC_SPARC_PC22: 3899 1.1 skrll case BFD_RELOC_SPARC_PC10: 3900 1.1 skrll case BFD_RELOC_SPARC_BASE13: 3901 1.1 skrll case BFD_RELOC_SPARC_WDISP10: 3902 1.1 skrll case BFD_RELOC_SPARC_WDISP16: 3903 1.2 joerg case BFD_RELOC_SPARC_WDISP19: 3904 1.1 skrll case BFD_RELOC_SPARC_WDISP22: 3905 1.1 skrll case BFD_RELOC_SPARC_5: 3906 1.1 skrll case BFD_RELOC_SPARC_6: 3907 1.1 skrll case BFD_RELOC_SPARC_7: 3908 1.1 skrll case BFD_RELOC_SPARC_10: 3909 1.1 skrll case BFD_RELOC_SPARC_11: 3910 1.1 skrll case BFD_RELOC_SPARC_HH22: 3911 1.1 skrll case BFD_RELOC_SPARC_HM10: 3912 1.1 skrll case BFD_RELOC_SPARC_LM22: 3913 1.1 skrll case BFD_RELOC_SPARC_PC_HH22: 3914 1.1 skrll case BFD_RELOC_SPARC_PC_HM10: 3915 1.1 skrll case BFD_RELOC_SPARC_PC_LM22: 3916 1.1 skrll case BFD_RELOC_SPARC_H34: 3917 1.1 skrll case BFD_RELOC_SPARC_H44: 3918 1.10 christos case BFD_RELOC_SPARC_M44: 3919 1.10 christos case BFD_RELOC_SPARC_L44: 3920 1.1 skrll case BFD_RELOC_SPARC_HIX22: 3921 1.1 skrll case BFD_RELOC_SPARC_LOX10: 3922 1.1 skrll case BFD_RELOC_SPARC_REV32: 3923 1.1 skrll case BFD_RELOC_SPARC_OLO10: 3924 1.1 skrll case BFD_RELOC_SPARC_UA16: 3925 1.1 skrll case BFD_RELOC_SPARC_UA32: 3926 1.1 skrll case BFD_RELOC_SPARC_UA64: 3927 1.1 skrll case BFD_RELOC_8_PCREL: 3928 1.1 skrll case BFD_RELOC_16_PCREL: 3929 1.1 skrll case BFD_RELOC_32_PCREL: 3930 1.1 skrll case BFD_RELOC_64_PCREL: 3931 1.1 skrll case BFD_RELOC_32_PLT_PCREL: 3932 1.1 skrll case BFD_RELOC_64_PLT_PCREL: 3933 1.1 skrll case BFD_RELOC_VTABLE_ENTRY: 3934 1.1 skrll case BFD_RELOC_VTABLE_INHERIT: 3935 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_HI22: 3936 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_LO10: 3937 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_ADD: 3938 1.1 skrll case BFD_RELOC_SPARC_TLS_GD_CALL: 3939 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_HI22: 3940 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_LO10: 3941 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_ADD: 3942 1.1 skrll case BFD_RELOC_SPARC_TLS_LDM_CALL: 3943 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_HIX22: 3944 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_LOX10: 3945 1.1 skrll case BFD_RELOC_SPARC_TLS_LDO_ADD: 3946 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_HI22: 3947 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LO10: 3948 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LD: 3949 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_LDX: 3950 1.1 skrll case BFD_RELOC_SPARC_TLS_IE_ADD: 3951 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_HIX22: 3952 1.1 skrll case BFD_RELOC_SPARC_TLS_LE_LOX10: 3953 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF32: 3954 1.1 skrll case BFD_RELOC_SPARC_TLS_DTPOFF64: 3955 1.1 skrll case BFD_RELOC_SPARC_GOTDATA_OP_HIX22: 3956 1.1 skrll case BFD_RELOC_SPARC_GOTDATA_OP_LOX10: 3957 1.1 skrll case BFD_RELOC_SPARC_GOTDATA_OP: 3958 1.1 skrll code = fixp->fx_r_type; 3959 1.1 skrll break; 3960 1.1 skrll default: 3961 1.5 christos abort (); 3962 1.1 skrll return NULL; 3963 1.1 skrll } 3964 1.1 skrll 3965 1.1 skrll /* If we are generating PIC code, we need to generate a different 3966 1.1 skrll set of relocs. */ 3967 1.1 skrll 3968 1.1 skrll #define GOT_NAME "_GLOBAL_OFFSET_TABLE_" 3969 1.1 skrll #ifdef TE_VXWORKS 3970 1.1 skrll #define GOTT_BASE "__GOTT_BASE__" 3971 1.1 skrll #define GOTT_INDEX "__GOTT_INDEX__" 3972 1.1 skrll #endif 3973 1.1 skrll 3974 1.1 skrll /* This code must be parallel to tc_fix_adjustable. */ 3975 1.1 skrll 3976 1.1 skrll if (sparc_pic_code) 3977 1.1 skrll { 3978 1.1 skrll switch (code) 3979 1.1 skrll { 3980 1.1 skrll case BFD_RELOC_32_PCREL_S2: 3981 1.1 skrll if (generic_force_reloc (fixp)) 3982 1.1 skrll code = BFD_RELOC_SPARC_WPLT30; 3983 1.1 skrll break; 3984 1.1 skrll case BFD_RELOC_HI22: 3985 1.1 skrll code = BFD_RELOC_SPARC_GOT22; 3986 1.1 skrll if (fixp->fx_addsy != NULL) 3987 1.1 skrll { 3988 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0) 3989 1.1 skrll code = BFD_RELOC_SPARC_PC22; 3990 1.1 skrll #ifdef TE_VXWORKS 3991 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0 3992 1.1 skrll || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0) 3993 1.1 skrll code = BFD_RELOC_HI22; /* Unchanged. */ 3994 1.1 skrll #endif 3995 1.1 skrll } 3996 1.1 skrll break; 3997 1.1 skrll case BFD_RELOC_LO10: 3998 1.1 skrll code = BFD_RELOC_SPARC_GOT10; 3999 1.1 skrll if (fixp->fx_addsy != NULL) 4000 1.1 skrll { 4001 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0) 4002 1.1 skrll code = BFD_RELOC_SPARC_PC10; 4003 1.1 skrll #ifdef TE_VXWORKS 4004 1.1 skrll if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0 4005 1.1 skrll || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0) 4006 1.6 christos code = BFD_RELOC_LO10; /* Unchanged. */ 4007 1.1 skrll #endif 4008 1.1 skrll } 4009 1.1 skrll break; 4010 1.1 skrll case BFD_RELOC_SPARC13: 4011 1.1 skrll code = BFD_RELOC_SPARC_GOT13; 4012 1.1 skrll break; 4013 1.1 skrll default: 4014 1.1 skrll break; 4015 1.1 skrll } 4016 1.1 skrll } 4017 1.1 skrll 4018 1.1 skrll /* Nothing is aligned in DWARF debugging sections. */ 4019 1.1 skrll if (bfd_section_flags (section) & SEC_DEBUGGING) 4020 1.1 skrll switch (code) 4021 1.1 skrll { 4022 1.1 skrll case BFD_RELOC_16: code = BFD_RELOC_SPARC_UA16; break; 4023 1.1 skrll case BFD_RELOC_32: code = BFD_RELOC_SPARC_UA32; break; 4024 1.1 skrll case BFD_RELOC_64: code = BFD_RELOC_SPARC_UA64; break; 4025 1.1 skrll default: break; 4026 1.1 skrll } 4027 1.1 skrll 4028 1.1 skrll if (code == BFD_RELOC_SPARC_OLO10) 4029 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO10); 4030 1.1 skrll else 4031 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, code); 4032 1.1 skrll if (reloc->howto == 0) 4033 1.2 joerg { 4034 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line, 4035 1.1 skrll _("internal error: can't export reloc type %d (`%s')"), 4036 1.1 skrll fixp->fx_r_type, bfd_get_reloc_code_name (code)); 4037 1.1 skrll relocs[0] = NULL; 4038 1.1 skrll return relocs; 4039 1.1 skrll } 4040 1.1 skrll 4041 1.1 skrll /* @@ Why fx_addnumber sometimes and fx_offset other times? */ 4042 1.1 skrll if (code != BFD_RELOC_32_PCREL_S2 4043 1.1 skrll && code != BFD_RELOC_SPARC_WDISP22 4044 1.1 skrll && code != BFD_RELOC_SPARC_WDISP16 4045 1.1 skrll && code != BFD_RELOC_SPARC_WDISP19 4046 1.1 skrll && code != BFD_RELOC_SPARC_WDISP10 4047 1.1 skrll && code != BFD_RELOC_SPARC_WPLT30 4048 1.1 skrll && code != BFD_RELOC_SPARC_TLS_GD_CALL 4049 1.9 christos && code != BFD_RELOC_SPARC_TLS_LDM_CALL) 4050 1.9 christos reloc->addend = fixp->fx_addnumber; 4051 1.9 christos else if (symbol_section_p (fixp->fx_addsy)) 4052 1.1 skrll reloc->addend = (section->vma 4053 1.1 skrll + fixp->fx_addnumber 4054 1.1 skrll + md_pcrel_from (fixp)); 4055 1.1 skrll else 4056 1.1 skrll reloc->addend = fixp->fx_offset; 4057 1.1 skrll 4058 1.1 skrll /* We expand R_SPARC_OLO10 to R_SPARC_LO10 and R_SPARC_13 4059 1.1 skrll on the same location. */ 4060 1.1 skrll if (code == BFD_RELOC_SPARC_OLO10) 4061 1.1 skrll { 4062 1.1 skrll reloc = notes_alloc (sizeof (arelent)); 4063 1.1 skrll reloc->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); 4064 1.1 skrll relocs[1] = reloc; 4065 1.1 skrll relocs[2] = NULL; 4066 1.1 skrll *reloc->sym_ptr_ptr 4067 1.1 skrll = symbol_get_bfdsym (section_symbol (absolute_section)); 4068 1.1 skrll reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 4069 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_SPARC13); 4070 1.1 skrll reloc->addend = fixp->tc_fix_data; 4071 1.1 skrll } 4072 1.1 skrll 4073 1.1 skrll return relocs; 4074 1.1 skrll } 4075 1.1 skrll 4076 1.1 skrll /* We have no need to default values of symbols. */ 4078 1.1 skrll 4079 1.1 skrll symbolS * 4080 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 4081 1.1 skrll { 4082 1.1 skrll return 0; 4083 1.1 skrll } 4084 1.1 skrll 4085 1.1 skrll /* Round up a section size to the appropriate boundary. */ 4086 1.1 skrll 4087 1.1 skrll valueT 4088 1.1 skrll md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size) 4089 1.1 skrll { 4090 1.1 skrll return size; 4091 1.1 skrll } 4092 1.1 skrll 4093 1.1 skrll /* Exactly what point is a PC-relative offset relative TO? 4094 1.1 skrll On the sparc, they're relative to the address of the offset, plus 4095 1.1 skrll its size. This gets us to the following instruction. 4096 1.1 skrll (??? Is this right? FIXME-SOON) */ 4097 1.1 skrll long 4098 1.1 skrll md_pcrel_from (fixS *fixP) 4099 1.1 skrll { 4100 1.1 skrll long ret; 4101 1.1 skrll 4102 1.1 skrll ret = fixP->fx_where + fixP->fx_frag->fr_address; 4103 1.1 skrll if (! sparc_pic_code 4104 1.1 skrll || fixP->fx_addsy == NULL 4105 1.1 skrll || symbol_section_p (fixP->fx_addsy)) 4106 1.1 skrll ret += fixP->fx_size; 4107 1.1 skrll return ret; 4108 1.1 skrll } 4109 1.1 skrll 4110 1.1 skrll /* Return log2 (VALUE), or -1 if VALUE is not an exact positive power 4112 1.1 skrll of two. */ 4113 1.1 skrll 4114 1.1 skrll static int 4115 1.1 skrll mylog2 (int value) 4116 1.1 skrll { 4117 1.1 skrll int shift; 4118 1.1 skrll 4119 1.1 skrll if (value <= 0) 4120 1.1 skrll return -1; 4121 1.1 skrll 4122 1.1 skrll for (shift = 0; (value & 1) == 0; value >>= 1) 4123 1.1 skrll ++shift; 4124 1.1 skrll 4125 1.1 skrll return (value == 1) ? shift : -1; 4126 1.2 joerg } 4127 1.1 skrll 4128 1.9 christos /* Sort of like s_lcomm. */ 4129 1.9 christos 4130 1.1 skrll static void 4131 1.1 skrll s_reserve (int ignore ATTRIBUTE_UNUSED) 4132 1.1 skrll { 4133 1.1 skrll char *name; 4134 1.1 skrll char *p; 4135 1.1 skrll char c; 4136 1.1 skrll int align; 4137 1.1 skrll int size; 4138 1.1 skrll int temp; 4139 1.1 skrll symbolS *symbolP; 4140 1.1 skrll 4141 1.1 skrll c = get_symbol_name (&name); 4142 1.1 skrll p = input_line_pointer; 4143 1.1 skrll restore_line_pointer (c); 4144 1.1 skrll SKIP_WHITESPACE (); 4145 1.1 skrll 4146 1.1 skrll if (*input_line_pointer != ',') 4147 1.1 skrll { 4148 1.1 skrll as_bad (_("Expected comma after name")); 4149 1.1 skrll ignore_rest_of_line (); 4150 1.1 skrll return; 4151 1.7 christos } 4152 1.7 christos 4153 1.1 skrll ++input_line_pointer; 4154 1.1 skrll 4155 1.1 skrll if ((size = get_absolute_expression ()) < 0) 4156 1.1 skrll { 4157 1.1 skrll as_bad (_("BSS length (%d.) <0! Ignored."), size); 4158 1.1 skrll ignore_rest_of_line (); 4159 1.1 skrll return; 4160 1.1 skrll } /* Bad length. */ 4161 1.1 skrll 4162 1.1 skrll *p = 0; 4163 1.1 skrll symbolP = symbol_find_or_make (name); 4164 1.1 skrll *p = c; 4165 1.1 skrll 4166 1.1 skrll if (!startswith (input_line_pointer, ",\"bss\"") 4167 1.1 skrll && !startswith (input_line_pointer, ",\".bss\"")) 4168 1.1 skrll { 4169 1.1 skrll as_bad (_("bad .reserve segment -- expected BSS segment")); 4170 1.1 skrll return; 4171 1.1 skrll } 4172 1.1 skrll 4173 1.1 skrll if (input_line_pointer[2] == '.') 4174 1.1 skrll input_line_pointer += 7; 4175 1.1 skrll else 4176 1.1 skrll input_line_pointer += 6; 4177 1.1 skrll SKIP_WHITESPACE (); 4178 1.1 skrll 4179 1.1 skrll if (*input_line_pointer == ',') 4180 1.1 skrll { 4181 1.1 skrll ++input_line_pointer; 4182 1.1 skrll 4183 1.1 skrll SKIP_WHITESPACE (); 4184 1.1 skrll if (*input_line_pointer == '\n') 4185 1.1 skrll { 4186 1.1 skrll as_bad (_("missing alignment")); 4187 1.1 skrll ignore_rest_of_line (); 4188 1.1 skrll return; 4189 1.1 skrll } 4190 1.1 skrll 4191 1.1 skrll align = (int) get_absolute_expression (); 4192 1.1 skrll 4193 1.1 skrll if (align < 0) 4194 1.1 skrll { 4195 1.1 skrll as_bad (_("negative alignment")); 4196 1.1 skrll ignore_rest_of_line (); 4197 1.1 skrll return; 4198 1.1 skrll } 4199 1.1 skrll 4200 1.1 skrll if (align != 0) 4201 1.1 skrll { 4202 1.1 skrll temp = mylog2 (align); 4203 1.5 christos if (temp < 0) 4204 1.1 skrll { 4205 1.1 skrll as_bad (_("alignment not a power of 2")); 4206 1.1 skrll ignore_rest_of_line (); 4207 1.1 skrll return; 4208 1.1 skrll } 4209 1.1 skrll 4210 1.1 skrll align = temp; 4211 1.1 skrll } 4212 1.1 skrll 4213 1.1 skrll record_alignment (bss_section, align); 4214 1.1 skrll } 4215 1.1 skrll else 4216 1.1 skrll align = 0; 4217 1.1 skrll 4218 1.1 skrll if (!S_IS_DEFINED (symbolP)) 4219 1.1 skrll { 4220 1.1 skrll if (! need_pass_2) 4221 1.1 skrll { 4222 1.1 skrll char *pfrag; 4223 1.9 christos segT current_seg = now_seg; 4224 1.1 skrll subsegT current_subseg = now_subseg; 4225 1.1 skrll 4226 1.1 skrll /* Switch to bss. */ 4227 1.1 skrll subseg_set (bss_section, 1); 4228 1.1 skrll 4229 1.1 skrll if (align) 4230 1.1 skrll /* Do alignment. */ 4231 1.1 skrll frag_align (align, 0, 0); 4232 1.1 skrll 4233 1.1 skrll /* Detach from old frag. */ 4234 1.1 skrll if (S_GET_SEGMENT (symbolP) == bss_section) 4235 1.2 joerg symbol_get_frag (symbolP)->fr_symbol = NULL; 4236 1.1 skrll 4237 1.2 joerg symbol_set_frag (symbolP, frag_now); 4238 1.1 skrll pfrag = frag_var (rs_org, 1, 1, 0, symbolP, size, NULL); 4239 1.1 skrll *pfrag = 0; 4240 1.1 skrll 4241 1.1 skrll S_SET_SEGMENT (symbolP, bss_section); 4242 1.1 skrll 4243 1.1 skrll subseg_set (current_seg, current_subseg); 4244 1.1 skrll 4245 1.1 skrll S_SET_SIZE (symbolP, size); 4246 1.1 skrll } 4247 1.1 skrll } 4248 1.1 skrll else 4249 1.1 skrll { 4250 1.1 skrll as_warn (_("Ignoring attempt to re-define symbol %s"), 4251 1.2 joerg S_GET_NAME (symbolP)); 4252 1.1 skrll } 4253 1.1 skrll 4254 1.9 christos demand_empty_rest_of_line (); 4255 1.9 christos } 4256 1.1 skrll 4257 1.1 skrll static void 4258 1.1 skrll s_common (int ignore ATTRIBUTE_UNUSED) 4259 1.1 skrll { 4260 1.1 skrll char *name; 4261 1.1 skrll char c; 4262 1.1 skrll char *p; 4263 1.1 skrll offsetT temp, size; 4264 1.1 skrll symbolS *symbolP; 4265 1.1 skrll 4266 1.1 skrll c = get_symbol_name (&name); 4267 1.1 skrll /* Just after name is now '\0'. */ 4268 1.1 skrll p = input_line_pointer; 4269 1.1 skrll restore_line_pointer (c); 4270 1.1 skrll SKIP_WHITESPACE (); 4271 1.1 skrll if (*input_line_pointer != ',') 4272 1.1 skrll { 4273 1.1 skrll as_bad (_("Expected comma after symbol-name")); 4274 1.1 skrll ignore_rest_of_line (); 4275 1.1 skrll return; 4276 1.1 skrll } 4277 1.1 skrll 4278 1.1 skrll /* Skip ','. */ 4279 1.1 skrll input_line_pointer++; 4280 1.1 skrll 4281 1.1 skrll if ((temp = get_absolute_expression ()) < 0) 4282 1.1 skrll { 4283 1.1 skrll as_bad (_(".COMMon length (%lu) out of range ignored"), 4284 1.1 skrll (unsigned long) temp); 4285 1.1 skrll ignore_rest_of_line (); 4286 1.1 skrll return; 4287 1.1 skrll } 4288 1.1 skrll size = temp; 4289 1.1 skrll *p = 0; 4290 1.1 skrll symbolP = symbol_find_or_make (name); 4291 1.1 skrll *p = c; 4292 1.1 skrll if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP)) 4293 1.1 skrll { 4294 1.1 skrll as_bad (_("Ignoring attempt to re-define symbol")); 4295 1.1 skrll ignore_rest_of_line (); 4296 1.1 skrll return; 4297 1.1 skrll } 4298 1.1 skrll if (S_GET_VALUE (symbolP) != 0) 4299 1.1 skrll { 4300 1.1 skrll if (S_GET_VALUE (symbolP) != (valueT) size) 4301 1.1 skrll { 4302 1.1 skrll as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."), 4303 1.1 skrll S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), (long) size); 4304 1.1 skrll } 4305 1.1 skrll } 4306 1.1 skrll know (symbol_get_frag (symbolP) == &zero_address_frag); 4307 1.1 skrll if (*input_line_pointer != ',') 4308 1.1 skrll { 4309 1.1 skrll as_bad (_("Expected comma after common length")); 4310 1.1 skrll ignore_rest_of_line (); 4311 1.1 skrll return; 4312 1.1 skrll } 4313 1.1 skrll input_line_pointer++; 4314 1.1 skrll SKIP_WHITESPACE (); 4315 1.1 skrll if (*input_line_pointer != '"') 4316 1.1 skrll { 4317 1.1 skrll temp = get_absolute_expression (); 4318 1.1 skrll 4319 1.1 skrll if (temp < 0) 4320 1.1 skrll { 4321 1.1 skrll as_bad (_("negative alignment")); 4322 1.1 skrll ignore_rest_of_line (); 4323 1.1 skrll return; 4324 1.1 skrll } 4325 1.1 skrll 4326 1.1 skrll if (symbol_get_obj (symbolP)->local) 4327 1.1 skrll { 4328 1.1 skrll segT old_sec; 4329 1.1 skrll int old_subsec; 4330 1.1 skrll int align; 4331 1.1 skrll 4332 1.1 skrll old_sec = now_seg; 4333 1.1 skrll old_subsec = now_subseg; 4334 1.1 skrll 4335 1.1 skrll if (temp == 0) 4336 1.1 skrll align = 0; 4337 1.1 skrll else 4338 1.1 skrll align = mylog2 (temp); 4339 1.9 christos 4340 1.1 skrll if (align < 0) 4341 1.1 skrll { 4342 1.1 skrll as_bad (_("alignment not a power of 2")); 4343 1.1 skrll ignore_rest_of_line (); 4344 1.1 skrll return; 4345 1.1 skrll } 4346 1.1 skrll 4347 1.1 skrll record_alignment (bss_section, align); 4348 1.1 skrll subseg_set (bss_section, 0); 4349 1.9 christos if (align) 4350 1.1 skrll frag_align (align, 0, 0); 4351 1.1 skrll if (S_GET_SEGMENT (symbolP) == bss_section) 4352 1.1 skrll symbol_get_frag (symbolP)->fr_symbol = 0; 4353 1.1 skrll symbol_set_frag (symbolP, frag_now); 4354 1.1 skrll p = frag_var (rs_org, 1, 1, 0, symbolP, size, NULL); 4355 1.1 skrll *p = 0; 4356 1.1 skrll S_SET_SEGMENT (symbolP, bss_section); 4357 1.1 skrll S_CLEAR_EXTERNAL (symbolP); 4358 1.1 skrll S_SET_SIZE (symbolP, size); 4359 1.1 skrll subseg_set (old_sec, old_subsec); 4360 1.1 skrll } 4361 1.1 skrll else 4362 1.1 skrll { 4363 1.7 christos allocate_common: 4364 1.7 christos S_SET_VALUE (symbolP, size); 4365 1.1 skrll S_SET_ALIGN (symbolP, temp); 4366 1.1 skrll S_SET_SIZE (symbolP, size); 4367 1.1 skrll S_SET_EXTERNAL (symbolP); 4368 1.1 skrll S_SET_SEGMENT (symbolP, bfd_com_section_ptr); 4369 1.1 skrll } 4370 1.1 skrll } 4371 1.1 skrll else 4372 1.1 skrll { 4373 1.1 skrll input_line_pointer++; 4374 1.1 skrll /* @@ Some use the dot, some don't. Can we get some consistency?? */ 4375 1.1 skrll if (*input_line_pointer == '.') 4376 1.1 skrll input_line_pointer++; 4377 1.1 skrll /* @@ Some say data, some say bss. */ 4378 1.1 skrll if (!startswith (input_line_pointer, "bss\"") 4379 1.1 skrll && !startswith (input_line_pointer, "data\"")) 4380 1.1 skrll { 4381 1.1 skrll while (*--input_line_pointer != '"') 4382 1.1 skrll ; 4383 1.1 skrll input_line_pointer--; 4384 1.1 skrll goto bad_common_segment; 4385 1.1 skrll } 4386 1.1 skrll while (*input_line_pointer++ != '"') 4387 1.1 skrll ; 4388 1.1 skrll goto allocate_common; 4389 1.1 skrll } 4390 1.1 skrll 4391 1.1 skrll symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; 4392 1.1 skrll 4393 1.1 skrll demand_empty_rest_of_line (); 4394 1.1 skrll return; 4395 1.1 skrll 4396 1.1 skrll { 4397 1.1 skrll bad_common_segment: 4398 1.1 skrll p = input_line_pointer; 4399 1.1 skrll while (*p && *p != '\n') 4400 1.1 skrll p++; 4401 1.1 skrll c = *p; 4402 1.1 skrll *p = '\0'; 4403 1.1 skrll as_bad (_("bad .common segment %s"), input_line_pointer + 1); 4404 1.1 skrll *p = c; 4405 1.1 skrll input_line_pointer = p; 4406 1.1 skrll ignore_rest_of_line (); 4407 1.1 skrll return; 4408 1.1 skrll } 4409 1.1 skrll } 4410 1.1 skrll 4411 1.7 christos /* Handle the .empty pseudo-op. This suppresses the warnings about 4412 1.1 skrll invalid delay slot usage. */ 4413 1.1 skrll 4414 1.1 skrll static void 4415 1.1 skrll s_empty (int ignore ATTRIBUTE_UNUSED) 4416 1.1 skrll { 4417 1.7 christos /* The easy way to implement is to just forget about the last 4418 1.1 skrll instruction. */ 4419 1.1 skrll last_insn = NULL; 4420 1.1 skrll } 4421 1.1 skrll 4422 1.1 skrll static void 4423 1.7 christos s_seg (int ignore ATTRIBUTE_UNUSED) 4424 1.1 skrll { 4425 1.1 skrll 4426 1.1 skrll if (startswith (input_line_pointer, "\"text\"")) 4427 1.1 skrll { 4428 1.1 skrll input_line_pointer += 6; 4429 1.7 christos s_text (0); 4430 1.1 skrll return; 4431 1.1 skrll } 4432 1.1 skrll if (startswith (input_line_pointer, "\"data\"")) 4433 1.1 skrll { 4434 1.1 skrll input_line_pointer += 6; 4435 1.1 skrll s_data (0); 4436 1.1 skrll return; 4437 1.1 skrll } 4438 1.1 skrll if (startswith (input_line_pointer, "\"data1\"")) 4439 1.1 skrll { 4440 1.1 skrll input_line_pointer += 7; 4441 1.1 skrll s_data1 (); 4442 1.1 skrll return; 4443 1.1 skrll } 4444 1.1 skrll if (startswith (input_line_pointer, "\"bss\"")) 4445 1.1 skrll { 4446 1.1 skrll input_line_pointer += 5; 4447 1.1 skrll /* We only support 2 segments -- text and data -- for now, so 4448 1.1 skrll things in the "bss segment" will have to go into data for now. 4449 1.1 skrll You can still allocate SEG_BSS stuff with .lcomm or .reserve. */ 4450 1.1 skrll subseg_set (data_section, 255); /* FIXME-SOMEDAY. */ 4451 1.1 skrll return; 4452 1.9 christos } 4453 1.1 skrll as_bad (_("Unknown segment type")); 4454 1.1 skrll demand_empty_rest_of_line (); 4455 1.1 skrll } 4456 1.1 skrll 4457 1.1 skrll static void 4458 1.1 skrll s_data1 (void) 4459 1.1 skrll { 4460 1.1 skrll subseg_set (data_section, 1); 4461 1.1 skrll demand_empty_rest_of_line (); 4462 1.1 skrll } 4463 1.1 skrll 4464 1.1 skrll static void 4465 1.1 skrll s_proc (int ignore ATTRIBUTE_UNUSED) 4466 1.1 skrll { 4467 1.1 skrll while (!is_end_of_stmt (*input_line_pointer)) 4468 1.1 skrll { 4469 1.1 skrll ++input_line_pointer; 4470 1.1 skrll } 4471 1.1 skrll ++input_line_pointer; 4472 1.1 skrll } 4473 1.1 skrll 4474 1.1 skrll /* This static variable is set by s_uacons to tell sparc_cons_align 4475 1.1 skrll that the expression does not need to be aligned. */ 4476 1.1 skrll 4477 1.1 skrll static int sparc_no_align_cons = 0; 4478 1.1 skrll 4479 1.1 skrll /* This handles the unaligned space allocation pseudo-ops, such as 4480 1.1 skrll .uaword. .uaword is just like .word, but the value does not need 4481 1.1 skrll to be aligned. */ 4482 1.1 skrll 4483 1.1 skrll static void 4484 1.1 skrll s_uacons (int bytes) 4485 1.1 skrll { 4486 1.1 skrll /* Tell sparc_cons_align not to align this value. */ 4487 1.1 skrll sparc_no_align_cons = 1; 4488 1.1 skrll cons (bytes); 4489 1.1 skrll sparc_no_align_cons = 0; 4490 1.1 skrll } 4491 1.1 skrll 4492 1.1 skrll /* This handles the native word allocation pseudo-op .nword. 4493 1.1 skrll For sparc_arch_size 32 it is equivalent to .word, for 4494 1.1 skrll sparc_arch_size 64 it is equivalent to .xword. */ 4495 1.1 skrll 4496 1.1 skrll static void 4497 1.1 skrll s_ncons (int bytes ATTRIBUTE_UNUSED) 4498 1.1 skrll { 4499 1.1 skrll cons (sparc_arch_size == 32 ? 4 : 8); 4500 1.2 joerg } 4501 1.1 skrll 4502 1.1 skrll /* Handle the SPARC ELF .register pseudo-op. This sets the binding of a 4503 1.1 skrll global register. 4504 1.1 skrll The syntax is: 4505 1.1 skrll 4506 1.1 skrll .register %g[2367],{#scratch|symbolname|#ignore} 4507 1.1 skrll */ 4508 1.1 skrll 4509 1.1 skrll static void 4510 1.1 skrll s_register (int ignore ATTRIBUTE_UNUSED) 4511 1.1 skrll { 4512 1.1 skrll char c; 4513 1.1 skrll int reg; 4514 1.2 joerg int flags; 4515 1.1 skrll char *regname; 4516 1.1 skrll 4517 1.1 skrll if (input_line_pointer[0] != '%' 4518 1.1 skrll || input_line_pointer[1] != 'g' 4519 1.1 skrll || ((input_line_pointer[2] & ~1) != '2' 4520 1.3 christos && (input_line_pointer[2] & ~1) != '6') 4521 1.1 skrll || input_line_pointer[3] != ',') 4522 1.1 skrll as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}")); 4523 1.1 skrll reg = input_line_pointer[2] - '0'; 4524 1.2 joerg input_line_pointer += 4; 4525 1.1 skrll 4526 1.2 joerg if (*input_line_pointer == '#') 4527 1.1 skrll { 4528 1.1 skrll ++input_line_pointer; 4529 1.1 skrll c = get_symbol_name (®name); 4530 1.1 skrll if (strcmp (regname, "scratch") && strcmp (regname, "ignore")) 4531 1.1 skrll as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}")); 4532 1.1 skrll if (regname[0] == 'i') 4533 1.1 skrll regname = NULL; 4534 1.1 skrll else 4535 1.1 skrll regname = (char *) ""; 4536 1.1 skrll } 4537 1.1 skrll else 4538 1.1 skrll { 4539 1.1 skrll c = get_symbol_name (®name); 4540 1.1 skrll } 4541 1.1 skrll 4542 1.1 skrll if (sparc_arch_size == 64) 4543 1.1 skrll { 4544 1.1 skrll if (globals[reg]) 4545 1.1 skrll { 4546 1.1 skrll if ((regname && globals[reg] != (symbolS *) 1 4547 1.1 skrll && strcmp (S_GET_NAME (globals[reg]), regname)) 4548 1.1 skrll || ((regname != NULL) ^ (globals[reg] != (symbolS *) 1))) 4549 1.1 skrll as_bad (_("redefinition of global register")); 4550 1.1 skrll } 4551 1.1 skrll else 4552 1.1 skrll { 4553 1.1 skrll if (regname == NULL) 4554 1.1 skrll globals[reg] = (symbolS *) 1; 4555 1.9 christos else 4556 1.1 skrll { 4557 1.1 skrll if (*regname) 4558 1.1 skrll { 4559 1.1 skrll if (symbol_find (regname)) 4560 1.1 skrll as_bad (_("Register symbol %s already defined."), 4561 1.1 skrll regname); 4562 1.1 skrll } 4563 1.1 skrll globals[reg] = symbol_make (regname); 4564 1.1 skrll flags = symbol_get_bfdsym (globals[reg])->flags; 4565 1.1 skrll if (! *regname) 4566 1.1 skrll flags = flags & ~(BSF_GLOBAL|BSF_LOCAL|BSF_WEAK); 4567 1.1 skrll if (! (flags & (BSF_GLOBAL|BSF_LOCAL|BSF_WEAK))) 4568 1.1 skrll flags |= BSF_GLOBAL; 4569 1.1 skrll symbol_get_bfdsym (globals[reg])->flags = flags; 4570 1.1 skrll S_SET_VALUE (globals[reg], reg); 4571 1.1 skrll S_SET_ALIGN (globals[reg], reg); 4572 1.1 skrll S_SET_SIZE (globals[reg], 0); 4573 1.2 joerg /* Although we actually want undefined_section here, 4574 1.1 skrll we have to use absolute_section, because otherwise 4575 1.1 skrll generic as code will make it a COM section. 4576 1.1 skrll We fix this up in sparc_adjust_symtab. */ 4577 1.1 skrll S_SET_SEGMENT (globals[reg], absolute_section); 4578 1.1 skrll S_SET_OTHER (globals[reg], 0); 4579 1.1 skrll elf_symbol (symbol_get_bfdsym (globals[reg])) 4580 1.1 skrll ->internal_elf_sym.st_info = 4581 1.1 skrll ELF_ST_INFO(STB_GLOBAL, STT_REGISTER); 4582 1.1 skrll elf_symbol (symbol_get_bfdsym (globals[reg])) 4583 1.1 skrll ->internal_elf_sym.st_shndx = SHN_UNDEF; 4584 1.1 skrll } 4585 1.1 skrll } 4586 1.1 skrll } 4587 1.1 skrll 4588 1.1 skrll (void) restore_line_pointer (c); 4589 1.1 skrll 4590 1.1 skrll demand_empty_rest_of_line (); 4591 1.1 skrll } 4592 1.1 skrll 4593 1.1 skrll /* Adjust the symbol table. We set undefined sections for STT_REGISTER 4594 1.1 skrll symbols which need it. */ 4595 1.1 skrll 4596 1.1 skrll void 4597 1.1 skrll sparc_adjust_symtab (void) 4598 1.1 skrll { 4599 1.1 skrll symbolS *sym; 4600 1.1 skrll 4601 1.1 skrll for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym)) 4602 1.1 skrll { 4603 1.1 skrll if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym)) 4604 1.1 skrll ->internal_elf_sym.st_info) != STT_REGISTER) 4605 1.1 skrll continue; 4606 1.1 skrll 4607 1.1 skrll if (ELF_ST_TYPE (elf_symbol (symbol_get_bfdsym (sym)) 4608 1.1 skrll ->internal_elf_sym.st_shndx != SHN_UNDEF)) 4609 1.1 skrll continue; 4610 1.1 skrll 4611 1.1 skrll S_SET_SEGMENT (sym, undefined_section); 4612 1.1 skrll } 4613 1.1 skrll } 4614 1.1 skrll 4615 1.1 skrll /* If the --enforce-aligned-data option is used, we require .word, 4616 1.1 skrll et. al., to be aligned correctly. We do it by setting up an 4617 1.1 skrll rs_align_code frag, and checking in HANDLE_ALIGN to make sure that 4618 1.1 skrll no unexpected alignment was introduced. 4619 1.1 skrll 4620 1.1 skrll The SunOS and Solaris native assemblers enforce aligned data by 4621 1.1 skrll default. We don't want to do that, because gcc can deliberately 4622 1.1 skrll generate misaligned data if the packed attribute is used. Instead, 4623 1.1 skrll we permit misaligned data by default, and permit the user to set an 4624 1.1 skrll option to check for it. */ 4625 1.1 skrll 4626 1.1 skrll void 4627 1.1 skrll sparc_cons_align (int nbytes) 4628 1.2 joerg { 4629 1.1 skrll int nalign; 4630 1.1 skrll 4631 1.1 skrll /* Only do this if we are enforcing aligned data. */ 4632 1.1 skrll if (! enforce_aligned_data) 4633 1.1 skrll return; 4634 1.1 skrll 4635 1.1 skrll /* Don't align if this is an unaligned pseudo-op. */ 4636 1.1 skrll if (sparc_no_align_cons) 4637 1.9 christos return; 4638 1.1 skrll 4639 1.1 skrll nalign = mylog2 (nbytes); 4640 1.1 skrll if (nalign == 0) 4641 1.1 skrll return; 4642 1.1 skrll 4643 1.1 skrll gas_assert (nalign > 0); 4644 1.1 skrll 4645 1.1 skrll if (now_seg == absolute_section) 4646 1.1 skrll { 4647 1.1 skrll if ((abs_section_offset & ((1 << nalign) - 1)) != 0) 4648 1.1 skrll as_bad (_("misaligned data")); 4649 1.1 skrll return; 4650 1.1 skrll } 4651 1.1 skrll 4652 1.1 skrll frag_var (rs_align_test, 1, 1, 0, NULL, nalign, NULL); 4653 1.1 skrll 4654 1.1 skrll record_alignment (now_seg, nalign); 4655 1.1 skrll } 4656 1.1 skrll 4657 1.1 skrll /* This is called from HANDLE_ALIGN in tc-sparc.h. */ 4658 1.1 skrll 4659 1.1 skrll void 4660 1.1 skrll sparc_handle_align (fragS *fragp) 4661 1.1 skrll { 4662 1.1 skrll int count, fix; 4663 1.1 skrll char *p; 4664 1.1 skrll 4665 1.1 skrll count = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix; 4666 1.1 skrll 4667 1.1 skrll switch (fragp->fr_type) 4668 1.1 skrll { 4669 1.1 skrll case rs_align_test: 4670 1.1 skrll if (count != 0) 4671 1.1 skrll as_bad_where (fragp->fr_file, fragp->fr_line, _("misaligned data")); 4672 1.1 skrll break; 4673 1.1 skrll 4674 1.1 skrll case rs_align_code: 4675 1.1 skrll p = fragp->fr_literal + fragp->fr_fix; 4676 1.1 skrll fix = 0; 4677 1.1 skrll 4678 1.1 skrll if (count & 3) 4679 1.1 skrll { 4680 1.1 skrll fix = count & 3; 4681 1.1 skrll memset (p, 0, fix); 4682 1.1 skrll p += fix; 4683 1.1 skrll count -= fix; 4684 1.1 skrll } 4685 1.1 skrll 4686 1.1 skrll if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8) 4687 1.1 skrll { 4688 1.1 skrll unsigned wval = (0x30680000 | count >> 2); /* ba,a,pt %xcc, 1f */ 4689 1.1 skrll if (INSN_BIG_ENDIAN) 4690 1.1 skrll number_to_chars_bigendian (p, wval, 4); 4691 1.1 skrll else 4692 1.1 skrll number_to_chars_littleendian (p, wval, 4); 4693 1.1 skrll p += 4; 4694 1.1 skrll count -= 4; 4695 1.1 skrll fix += 4; 4696 1.1 skrll } 4697 1.1 skrll 4698 1.1 skrll if (INSN_BIG_ENDIAN) 4699 1.1 skrll number_to_chars_bigendian (p, 0x01000000, 4); 4700 1.1 skrll else 4701 1.1 skrll number_to_chars_littleendian (p, 0x01000000, 4); 4702 1.1 skrll 4703 1.1 skrll fragp->fr_fix += fix; 4704 1.1 skrll fragp->fr_var = 4; 4705 1.1 skrll break; 4706 1.1 skrll 4707 1.1 skrll default: 4708 1.1 skrll break; 4709 1.1 skrll } 4710 1.1 skrll } 4711 1.1 skrll 4712 1.1 skrll /* Some special processing for a Sparc ELF file. */ 4713 1.1 skrll 4714 1.1 skrll void 4715 1.1 skrll sparc_elf_final_processing (void) 4716 1.1 skrll { 4717 1.1 skrll /* Set the Sparc ELF flag bits. FIXME: There should probably be some 4718 1.1 skrll sort of BFD interface for this. */ 4719 1.1 skrll if (sparc_arch_size == 64) 4720 1.1 skrll { 4721 1.1 skrll switch (sparc_memory_model) 4722 1.1 skrll { 4723 1.1 skrll case MM_RMO: 4724 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_RMO; 4725 1.1 skrll break; 4726 1.2 joerg case MM_PSO: 4727 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARCV9_PSO; 4728 1.1 skrll break; 4729 1.1 skrll default: 4730 1.2 joerg break; 4731 1.1 skrll } 4732 1.1 skrll } 4733 1.1 skrll else if (current_architecture >= SPARC_OPCODE_ARCH_V9) 4734 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARC_32PLUS; 4735 1.1 skrll if (current_architecture == SPARC_OPCODE_ARCH_V9A) 4736 1.1 skrll elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1; 4737 1.1 skrll else if (current_architecture == SPARC_OPCODE_ARCH_V9B) 4738 1.7 christos elf_elfheader (stdoutput)->e_flags |= EF_SPARC_SUN_US1|EF_SPARC_SUN_US3; 4739 1.1 skrll } 4740 1.1 skrll 4741 1.1 skrll const char * 4742 1.1 skrll sparc_cons (expressionS *exp, int size) 4743 1.7 christos { 4744 1.1 skrll char *save; 4745 1.1 skrll const char *sparc_cons_special_reloc = NULL; 4746 1.1 skrll 4747 1.1 skrll SKIP_WHITESPACE (); 4748 1.1 skrll save = input_line_pointer; 4749 1.1 skrll if (input_line_pointer[0] == '%' 4750 1.1 skrll && input_line_pointer[1] == 'r' 4751 1.1 skrll && input_line_pointer[2] == '_') 4752 1.1 skrll { 4753 1.7 christos if (startswith (input_line_pointer + 3, "disp")) 4754 1.1 skrll { 4755 1.1 skrll input_line_pointer += 7; 4756 1.1 skrll sparc_cons_special_reloc = "disp"; 4757 1.1 skrll } 4758 1.1 skrll else if (startswith (input_line_pointer + 3, "plt")) 4759 1.1 skrll { 4760 1.1 skrll if (size != 4 && size != 8) 4761 1.1 skrll as_bad (_("Illegal operands: %%r_plt in %d-byte data field"), size); 4762 1.1 skrll else 4763 1.1 skrll { 4764 1.1 skrll input_line_pointer += 6; 4765 1.1 skrll sparc_cons_special_reloc = "plt"; 4766 1.1 skrll } 4767 1.1 skrll } 4768 1.1 skrll else if (startswith (input_line_pointer + 3, "tls_dtpoff")) 4769 1.1 skrll { 4770 1.1 skrll if (size != 4 && size != 8) 4771 1.1 skrll as_bad (_("Illegal operands: %%r_tls_dtpoff in %d-byte data field"), size); 4772 1.1 skrll else 4773 1.1 skrll { 4774 1.1 skrll input_line_pointer += 13; 4775 1.1 skrll sparc_cons_special_reloc = "tls_dtpoff"; 4776 1.1 skrll } 4777 1.1 skrll } 4778 1.1 skrll if (sparc_cons_special_reloc) 4779 1.1 skrll { 4780 1.1 skrll int bad = 0; 4781 1.1 skrll 4782 1.1 skrll switch (size) 4783 1.1 skrll { 4784 1.1 skrll case 1: 4785 1.1 skrll if (*input_line_pointer != '8') 4786 1.1 skrll bad = 1; 4787 1.1 skrll input_line_pointer--; 4788 1.1 skrll break; 4789 1.1 skrll case 2: 4790 1.1 skrll if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6') 4791 1.1 skrll bad = 1; 4792 1.1 skrll break; 4793 1.1 skrll case 4: 4794 1.1 skrll if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2') 4795 1.1 skrll bad = 1; 4796 1.1 skrll break; 4797 1.1 skrll case 8: 4798 1.1 skrll if (input_line_pointer[0] != '6' || input_line_pointer[1] != '4') 4799 1.1 skrll bad = 1; 4800 1.1 skrll break; 4801 1.1 skrll default: 4802 1.1 skrll bad = 1; 4803 1.1 skrll break; 4804 1.1 skrll } 4805 1.1 skrll 4806 1.1 skrll if (bad) 4807 1.1 skrll { 4808 1.1 skrll as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"), 4809 1.1 skrll sparc_cons_special_reloc, size * 8, size); 4810 1.1 skrll } 4811 1.1 skrll else 4812 1.1 skrll { 4813 1.1 skrll input_line_pointer += 2; 4814 1.1 skrll if (*input_line_pointer != '(') 4815 1.1 skrll { 4816 1.1 skrll as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"), 4817 1.1 skrll sparc_cons_special_reloc, size * 8); 4818 1.9 christos bad = 1; 4819 1.1 skrll } 4820 1.1 skrll } 4821 1.1 skrll 4822 1.1 skrll if (bad) 4823 1.1 skrll { 4824 1.1 skrll input_line_pointer = save; 4825 1.1 skrll sparc_cons_special_reloc = NULL; 4826 1.1 skrll } 4827 1.1 skrll else 4828 1.1 skrll { 4829 1.1 skrll int c; 4830 1.1 skrll char *end = ++input_line_pointer; 4831 1.1 skrll int npar = 0; 4832 1.1 skrll 4833 1.1 skrll while (! is_end_of_stmt (c = *end)) 4834 1.1 skrll { 4835 1.1 skrll if (c == '(') 4836 1.1 skrll npar++; 4837 1.1 skrll else if (c == ')') 4838 1.1 skrll { 4839 1.1 skrll if (!npar) 4840 1.1 skrll break; 4841 1.1 skrll npar--; 4842 1.1 skrll } 4843 1.1 skrll end++; 4844 1.1 skrll } 4845 1.1 skrll 4846 1.1 skrll if (c != ')') 4847 1.1 skrll as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"), 4848 1.1 skrll sparc_cons_special_reloc, size * 8); 4849 1.9 christos else 4850 1.1 skrll { 4851 1.1 skrll *end = '\0'; 4852 1.1 skrll expression (exp); 4853 1.1 skrll *end = c; 4854 1.1 skrll if (input_line_pointer != end) 4855 1.1 skrll { 4856 1.1 skrll as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"), 4857 1.1 skrll sparc_cons_special_reloc, size * 8); 4858 1.1 skrll } 4859 1.2 joerg else 4860 1.1 skrll { 4861 1.1 skrll input_line_pointer++; 4862 1.1 skrll SKIP_WHITESPACE (); 4863 1.1 skrll c = *input_line_pointer; 4864 1.1 skrll if (! is_end_of_stmt (c) && c != ',') 4865 1.1 skrll as_bad (_("Illegal operands: garbage after %%r_%s%d()"), 4866 1.1 skrll sparc_cons_special_reloc, size * 8); 4867 1.1 skrll } 4868 1.1 skrll } 4869 1.1 skrll } 4870 1.2 joerg } 4871 1.2 joerg } 4872 1.1 skrll if (sparc_cons_special_reloc == NULL) 4873 1.1 skrll expression (exp); 4874 1.1 skrll return sparc_cons_special_reloc; 4875 1.1 skrll } 4876 1.1 skrll 4877 1.1 skrll /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a 4878 1.1 skrll reloc for a cons. We could use the definition there, except that 4879 1.1 skrll we want to handle little endian relocs specially. */ 4880 1.1 skrll 4881 1.1 skrll void 4882 1.1 skrll cons_fix_new_sparc (fragS *frag, 4883 1.1 skrll int where, 4884 1.4 christos unsigned int nbytes, 4885 1.4 christos expressionS *exp, 4886 1.4 christos const char *sparc_cons_special_reloc) 4887 1.4 christos { 4888 1.4 christos bfd_reloc_code_real_type r; 4889 1.4 christos 4890 1.4 christos r = (nbytes == 1 ? BFD_RELOC_8 : 4891 1.4 christos (nbytes == 2 ? BFD_RELOC_16 : 4892 1.4 christos (nbytes == 4 ? BFD_RELOC_32 : BFD_RELOC_64))); 4893 1.1 skrll 4894 1.1 skrll if (target_little_endian_data 4895 1.1 skrll && nbytes == 4 4896 1.1 skrll && now_seg->flags & SEC_ALLOC) 4897 1.1 skrll r = BFD_RELOC_SPARC_REV32; 4898 1.1 skrll 4899 1.1 skrll #ifdef TE_SOLARIS 4900 1.1 skrll /* The Solaris linker does not allow R_SPARC_UA64 4901 1.1 skrll relocations for 32-bit executables. */ 4902 1.1 skrll if (!target_little_endian_data 4903 1.1 skrll && sparc_arch_size != 64 4904 1.1 skrll && r == BFD_RELOC_64) 4905 1.1 skrll r = BFD_RELOC_32; 4906 1.1 skrll #endif 4907 1.10 christos 4908 1.10 christos if (sparc_cons_special_reloc) 4909 1.1 skrll { 4910 1.1 skrll if (*sparc_cons_special_reloc == 'd') 4911 1.1 skrll switch (nbytes) 4912 1.1 skrll { 4913 1.1 skrll case 1: r = BFD_RELOC_8_PCREL; break; 4914 1.1 skrll case 2: r = BFD_RELOC_16_PCREL; break; 4915 1.1 skrll case 4: r = BFD_RELOC_32_PCREL; break; 4916 1.1 skrll case 8: r = BFD_RELOC_64_PCREL; break; 4917 1.4 christos default: abort (); 4918 1.4 christos } 4919 1.4 christos else if (*sparc_cons_special_reloc == 'p') 4920 1.4 christos switch (nbytes) 4921 1.1 skrll { 4922 1.1 skrll case 4: r = BFD_RELOC_32_PLT_PCREL; break; 4923 1.1 skrll case 8: r = BFD_RELOC_64_PLT_PCREL; break; 4924 1.1 skrll } 4925 1.1 skrll else 4926 1.4 christos switch (nbytes) 4927 1.4 christos { 4928 1.4 christos case 4: r = BFD_RELOC_SPARC_TLS_DTPOFF32; break; 4929 1.4 christos case 8: r = BFD_RELOC_SPARC_TLS_DTPOFF64; break; 4930 1.4 christos } 4931 1.4 christos } 4932 1.1 skrll else if (sparc_no_align_cons 4933 1.4 christos || /* PR 20803 - relocs in the .eh_frame section 4934 1.1 skrll need to support unaligned access. */ 4935 1.1 skrll strcmp (now_seg->name, ".eh_frame") == 0) 4936 1.1 skrll { 4937 1.1 skrll switch (nbytes) 4938 1.9 christos { 4939 1.1 skrll case 2: r = BFD_RELOC_SPARC_UA16; break; 4940 1.1 skrll case 4: r = BFD_RELOC_SPARC_UA32; break; 4941 1.1 skrll #ifdef TE_SOLARIS 4942 1.1 skrll /* The Solaris linker does not allow R_SPARC_UA64 4943 1.1 skrll relocations for 32-bit executables. */ 4944 1.1 skrll case 8: r = sparc_arch_size == 64 ? 4945 1.1 skrll BFD_RELOC_SPARC_UA64 : BFD_RELOC_SPARC_UA32; break; 4946 1.1 skrll #else 4947 1.1 skrll case 8: r = BFD_RELOC_SPARC_UA64; break; 4948 1.1 skrll #endif 4949 1.1 skrll default: abort (); 4950 1.3 christos } 4951 1.3 christos } 4952 1.1 skrll 4953 1.1 skrll fix_new_exp (frag, where, nbytes, exp, 0, r); 4954 1.1 skrll } 4955 1.1 skrll 4956 1.3 christos void 4957 1.3 christos sparc_cfi_frame_initial_instructions (void) 4958 1.3 christos { 4959 1.3 christos cfi_add_CFA_def_cfa (14, sparc_arch_size == 64 ? 0x7ff : 0); 4960 1.3 christos } 4961 1.3 christos 4962 1.3 christos int 4963 1.3 christos sparc_regname_to_dw2regnum (char *regname) 4964 1.3 christos { 4965 1.1 skrll char *q; 4966 1.1 skrll int i; 4967 1.1 skrll 4968 1.3 christos if (!regname[0]) 4969 1.1 skrll return -1; 4970 1.1 skrll 4971 1.1 skrll switch (regname[0]) 4972 1.1 skrll { 4973 1.1 skrll case 'g': i = 0; break; 4974 1.1 skrll case 'o': i = 1; break; 4975 1.1 skrll case 'l': i = 2; break; 4976 1.1 skrll case 'i': i = 3; break; 4977 1.1 skrll default: i = -1; break; 4978 1.1 skrll } 4979 1.3 christos if (i != -1) 4980 1.1 skrll { 4981 1.1 skrll if (regname[1] < '0' || regname[1] > '8' || regname[2]) 4982 1.1 skrll return -1; 4983 1.1 skrll return i * 8 + regname[1] - '0'; 4984 1.1 skrll } 4985 1.1 skrll if (regname[0] == 's' && regname[1] == 'p' && !regname[2]) 4986 1.1 skrll return 14; 4987 1.1 skrll if (regname[0] == 'f' && regname[1] == 'p' && !regname[2]) 4988 1.1 skrll return 30; 4989 1.1 skrll if (regname[0] == 'f' || regname[0] == 'r') 4990 1.1 skrll { 4991 1.1 skrll unsigned int regnum; 4992 1.1 skrll 4993 1.1 skrll regnum = strtoul (regname + 1, &q, 10); 4994 1.1 skrll if (q == NULL || *q) 4995 1.1 skrll return -1; 4996 1.1 skrll if (regnum >= ((regname[0] == 'f' 4997 1.1 skrll && SPARC_OPCODE_ARCH_V9_P (max_architecture)) 4998 1.1 skrll ? 64 : 32)) 4999 1.1 skrll return -1; 5000 1.2 joerg if (regname[0] == 'f') 5001 1.1 skrll { 5002 1.1 skrll regnum += 32; 5003 1.8 christos if (regnum >= 64 && (regnum & 1)) 5004 return -1; 5005 } 5006 return regnum; 5007 } 5008 return -1; 5009 } 5010 5011 void 5012 sparc_cfi_emit_pcrel_expr (expressionS *exp, unsigned int nbytes) 5013 { 5014 sparc_no_align_cons = 1; 5015 emit_expr_with_reloc (exp, nbytes, "disp"); 5016 sparc_no_align_cons = 0; 5017 } 5018 5019