1 /* Altera Nios II assembler. 2 Copyright (C) 2012-2018 Free Software Foundation, Inc. 3 Contributed by Nigel Gray (ngray@altera.com). 4 Contributed by Mentor Graphics, Inc. 5 6 This file is part of GAS, the GNU Assembler. 7 8 GAS is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GAS is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GAS; see the file COPYING. If not, write to the Free 20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 21 02110-1301, USA. */ 22 23 #include "as.h" 24 #include "opcode/nios2.h" 25 #include "elf/nios2.h" 26 #include "tc-nios2.h" 27 #include "bfd.h" 28 #include "dwarf2dbg.h" 29 #include "subsegs.h" 30 #include "safe-ctype.h" 31 #include "dw2gencfi.h" 32 33 #ifndef OBJ_ELF 34 /* We are not supporting any other target so we throw a compile time error. */ 35 OBJ_ELF not defined 36 #endif 37 38 /* We can choose our endianness at run-time, regardless of configuration. */ 39 extern int target_big_endian; 40 41 /* This array holds the chars that always start a comment. If the 42 pre-processor is disabled, these aren't very useful. */ 43 const char comment_chars[] = "#"; 44 45 /* This array holds the chars that only start a comment at the beginning of 46 a line. If the line seems to have the form '# 123 filename' 47 .line and .file directives will appear in the pre-processed output. */ 48 /* Note that input_file.c hand checks for '#' at the beginning of the 49 first line of the input file. This is because the compiler outputs 50 #NO_APP at the beginning of its output. */ 51 /* Also note that C style comments are always supported. */ 52 const char line_comment_chars[] = "#"; 53 54 /* This array holds machine specific line separator characters. */ 55 const char line_separator_chars[] = ";"; 56 57 /* Chars that can be used to separate mant from exp in floating point nums. */ 58 const char EXP_CHARS[] = "eE"; 59 60 /* Chars that mean this number is a floating point constant. */ 61 /* As in 0f12.456 */ 62 /* or 0d1.2345e12 */ 63 const char FLT_CHARS[] = "rRsSfFdDxXpP"; 64 65 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be 66 changed in read.c. Ideally it shouldn't have to know about it at all, 67 but nothing is ideal around here. */ 68 69 /* Machine-dependent command-line options. */ 70 71 const char *md_shortopts = "r"; 72 73 struct option md_longopts[] = { 74 #define OPTION_RELAX_ALL (OPTION_MD_BASE + 0) 75 {"relax-all", no_argument, NULL, OPTION_RELAX_ALL}, 76 #define OPTION_NORELAX (OPTION_MD_BASE + 1) 77 {"no-relax", no_argument, NULL, OPTION_NORELAX}, 78 #define OPTION_RELAX_SECTION (OPTION_MD_BASE + 2) 79 {"relax-section", no_argument, NULL, OPTION_RELAX_SECTION}, 80 #define OPTION_EB (OPTION_MD_BASE + 3) 81 {"EB", no_argument, NULL, OPTION_EB}, 82 #define OPTION_EL (OPTION_MD_BASE + 4) 83 {"EL", no_argument, NULL, OPTION_EL}, 84 #define OPTION_MARCH (OPTION_MD_BASE + 5) 85 {"march", required_argument, NULL, OPTION_MARCH} 86 }; 87 88 size_t md_longopts_size = sizeof (md_longopts); 89 90 /* The assembler supports three different relaxation modes, controlled by 91 command-line options. */ 92 typedef enum 93 { 94 relax_section = 0, 95 relax_none, 96 relax_all 97 } relax_optionT; 98 99 /* Struct contains all assembler options set with .set. */ 100 static struct 101 { 102 /* .set noat -> noat = 1 allows assembly code to use at without warning 103 and macro expansions generate a warning. 104 .set at -> noat = 0, assembly code using at warn but macro expansions 105 do not generate warnings. */ 106 bfd_boolean noat; 107 108 /* .set nobreak -> nobreak = 1 allows assembly code to use ba,bt without 109 warning. 110 .set break -> nobreak = 0, assembly code using ba,bt warns. */ 111 bfd_boolean nobreak; 112 113 /* .cmd line option -relax-all allows all branches and calls to be replaced 114 with longer versions. 115 -no-relax inhibits branch/call conversion. 116 The default value is relax_section, which relaxes branches within 117 a section. */ 118 relax_optionT relax; 119 120 } nios2_as_options = {FALSE, FALSE, relax_section}; 121 122 123 typedef struct nios2_insn_reloc 124 { 125 /* Any expression in the instruction is parsed into this field, 126 which is passed to fix_new_exp() to generate a fixup. */ 127 expressionS reloc_expression; 128 129 /* The type of the relocation to be applied. */ 130 bfd_reloc_code_real_type reloc_type; 131 132 /* PC-relative. */ 133 unsigned int reloc_pcrel; 134 135 /* The next relocation to be applied to the instruction. */ 136 struct nios2_insn_reloc *reloc_next; 137 } nios2_insn_relocS; 138 139 /* This struct is used to hold state when assembling instructions. */ 140 typedef struct nios2_insn_info 141 { 142 /* Assembled instruction. */ 143 unsigned long insn_code; 144 145 /* Constant bits masked into insn_code for self-check mode. */ 146 unsigned long constant_bits; 147 148 /* Pointer to the relevant bit of the opcode table. */ 149 const struct nios2_opcode *insn_nios2_opcode; 150 /* After parsing ptrs to the tokens in the instruction fill this array 151 it is terminated with a null pointer (hence the first +1). 152 The second +1 is because in some parts of the code the opcode 153 is not counted as a token, but still placed in this array. */ 154 const char *insn_tokens[NIOS2_MAX_INSN_TOKENS + 1 + 1]; 155 156 /* This holds information used to generate fixups 157 and eventually relocations if it is not null. */ 158 nios2_insn_relocS *insn_reloc; 159 } nios2_insn_infoS; 160 161 162 /* This struct is used to convert Nios II pseudo-ops into the 163 corresponding real op. */ 164 typedef struct nios2_ps_insn_info 165 { 166 /* Map this pseudo_op... */ 167 const char *pseudo_insn; 168 169 /* ...to this real instruction. */ 170 const char *insn; 171 172 /* Call this function to modify the operands.... */ 173 void (*arg_modifer_func) (char ** parsed_args, const char *arg, int num, 174 int start); 175 176 /* ...with these arguments. */ 177 const char *arg_modifier; 178 int num; 179 int index; 180 181 /* If arg_modifier_func allocates new memory, provide this function 182 to free it afterwards. */ 183 void (*arg_cleanup_func) (char **parsed_args, int num, int start); 184 } nios2_ps_insn_infoS; 185 186 /* Opcode hash table. */ 187 static struct hash_control *nios2_opcode_hash = NULL; 188 #define nios2_opcode_lookup(NAME) \ 189 ((struct nios2_opcode *) hash_find (nios2_opcode_hash, (NAME))) 190 191 /* Register hash table. */ 192 static struct hash_control *nios2_reg_hash = NULL; 193 #define nios2_reg_lookup(NAME) \ 194 ((struct nios2_reg *) hash_find (nios2_reg_hash, (NAME))) 195 196 197 /* Pseudo-op hash table. */ 198 static struct hash_control *nios2_ps_hash = NULL; 199 #define nios2_ps_lookup(NAME) \ 200 ((nios2_ps_insn_infoS *) hash_find (nios2_ps_hash, (NAME))) 201 202 /* The known current alignment of the current section. */ 203 static int nios2_current_align; 204 static segT nios2_current_align_seg; 205 206 static int nios2_auto_align_on = 1; 207 208 /* The last seen label in the current section. This is used to auto-align 209 labels preceding instructions. */ 210 static symbolS *nios2_last_label; 211 212 /* If we saw a 16-bit CDX instruction, we can align on 2-byte boundaries 213 instead of 4-bytes. Use this to keep track of the minimum power-of-2 214 alignment. */ 215 static int nios2_min_align = 2; 216 217 #ifdef OBJ_ELF 218 /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */ 219 symbolS *GOT_symbol; 220 #endif 221 222 /* The processor architecture value, EF_NIOS2_ARCH_R1 by default. */ 223 static int nios2_architecture = EF_NIOS2_ARCH_R1; 224 225 226 /** Utility routines. */ 227 /* Function md_chars_to_number takes the sequence of 228 bytes in buf and returns the corresponding value 229 in an int. n must be 1, 2 or 4. */ 230 static valueT 231 md_chars_to_number (char *buf, int n) 232 { 233 int i; 234 valueT val; 235 236 gas_assert (n == 1 || n == 2 || n == 4); 237 238 val = 0; 239 if (target_big_endian) 240 for (i = 0; i < n; ++i) 241 val = val | ((buf[i] & 0xff) << 8 * (n - (i + 1))); 242 else 243 for (i = 0; i < n; ++i) 244 val = val | ((buf[i] & 0xff) << 8 * i); 245 return val; 246 } 247 248 249 /* This function turns a C long int, short int or char 250 into the series of bytes that represent the number 251 on the target machine. */ 252 void 253 md_number_to_chars (char *buf, valueT val, int n) 254 { 255 gas_assert (n == 1 || n == 2 || n == 4 || n == 8); 256 if (target_big_endian) 257 number_to_chars_bigendian (buf, val, n); 258 else 259 number_to_chars_littleendian (buf, val, n); 260 } 261 262 /* Turn a string in input_line_pointer into a floating point constant 263 of type TYPE, and store the appropriate bytes in *LITP. The number 264 of LITTLENUMS emitted is stored in *SIZEP. An error message is 265 returned, or NULL on OK. */ 266 const char * 267 md_atof (int type, char *litP, int *sizeP) 268 { 269 int prec; 270 LITTLENUM_TYPE words[4]; 271 char *t; 272 int i; 273 274 switch (type) 275 { 276 case 'f': 277 prec = 2; 278 break; 279 case 'd': 280 prec = 4; 281 break; 282 default: 283 *sizeP = 0; 284 return _("bad call to md_atof"); 285 } 286 287 t = atof_ieee (input_line_pointer, type, words); 288 if (t) 289 input_line_pointer = t; 290 291 *sizeP = prec * 2; 292 293 if (! target_big_endian) 294 for (i = prec - 1; i >= 0; i--, litP += 2) 295 md_number_to_chars (litP, (valueT) words[i], 2); 296 else 297 for (i = 0; i < prec; i++, litP += 2) 298 md_number_to_chars (litP, (valueT) words[i], 2); 299 300 return NULL; 301 } 302 303 /* Return true if STR starts with PREFIX, which should be a string literal. */ 304 #define strprefix(STR, PREFIX) \ 305 (strncmp ((STR), PREFIX, strlen (PREFIX)) == 0) 306 307 308 /* Return true if STR is prefixed with a special relocation operator. */ 309 static int 310 nios2_special_relocation_p (const char *str) 311 { 312 return (strprefix (str, "%lo") 313 || strprefix (str, "%hi") 314 || strprefix (str, "%hiadj") 315 || strprefix (str, "%gprel") 316 || strprefix (str, "%got") 317 || strprefix (str, "%call") 318 || strprefix (str, "%gotoff_lo") 319 || strprefix (str, "%gotoff_hiadj") 320 || strprefix (str, "%tls_gd") 321 || strprefix (str, "%tls_ldm") 322 || strprefix (str, "%tls_ldo") 323 || strprefix (str, "%tls_ie") 324 || strprefix (str, "%tls_le") 325 || strprefix (str, "%gotoff")); 326 } 327 328 329 /* nop fill patterns for text section. */ 330 static char const nop_r1[4] = { 0x3a, 0x88, 0x01, 0x00 }; 331 static char const nop_r2[4] = { 0x20, 0x00, 0x00, 0xc4 }; 332 static char const nop_r2_cdx[2] = { 0x3b, 0x00 }; 333 static char const *nop32 = nop_r1; 334 static char const *nop16 = NULL; 335 336 /* Handles all machine-dependent alignment needs. */ 337 static void 338 nios2_align (int log_size, const char *pfill, symbolS *label) 339 { 340 int align; 341 long max_alignment = 15; 342 343 /* The front end is prone to changing segments out from under us 344 temporarily when -g is in effect. */ 345 int switched_seg_p = (nios2_current_align_seg != now_seg); 346 347 align = log_size; 348 if (align > max_alignment) 349 { 350 align = max_alignment; 351 as_bad (_("Alignment too large: %d. assumed"), align); 352 } 353 else if (align < 0) 354 { 355 as_warn (_("Alignment negative: 0 assumed")); 356 align = 0; 357 } 358 359 if (align != 0) 360 { 361 if (subseg_text_p (now_seg) && align >= nios2_min_align) 362 { 363 /* First, make sure we're on the minimum boundary, in case 364 someone has been putting .byte values the text section. */ 365 if (nios2_current_align < nios2_min_align || switched_seg_p) 366 frag_align (nios2_min_align, 0, 0); 367 368 /* If we might be on a 2-byte boundary, first align to a 369 4-byte boundary using the 2-byte nop as fill. */ 370 if (nios2_min_align == 1 371 && align > nios2_min_align 372 && pfill == nop32 ) 373 { 374 gas_assert (nop16); 375 frag_align_pattern (2, nop16, 2, 0); 376 } 377 378 /* Now fill in the alignment pattern. */ 379 if (pfill != NULL) 380 frag_align_pattern (align, pfill, 4, 0); 381 else 382 frag_align (align, 0, 0); 383 } 384 else 385 frag_align (align, 0, 0); 386 387 if (!switched_seg_p) 388 nios2_current_align = align; 389 390 /* If the last label was in a different section we can't align it. */ 391 if (label != NULL && !switched_seg_p) 392 { 393 symbolS *sym; 394 int label_seen = FALSE; 395 struct frag *old_frag; 396 valueT old_value; 397 valueT new_value; 398 399 gas_assert (S_GET_SEGMENT (label) == now_seg); 400 401 old_frag = symbol_get_frag (label); 402 old_value = S_GET_VALUE (label); 403 new_value = (valueT) frag_now_fix (); 404 405 /* It is possible to have more than one label at a particular 406 address, especially if debugging is enabled, so we must 407 take care to adjust all the labels at this address in this 408 fragment. To save time we search from the end of the symbol 409 list, backwards, since the symbols we are interested in are 410 almost certainly the ones that were most recently added. 411 Also to save time we stop searching once we have seen at least 412 one matching label, and we encounter a label that is no longer 413 in the target fragment. Note, this search is guaranteed to 414 find at least one match when sym == label, so no special case 415 code is necessary. */ 416 for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym)) 417 if (symbol_get_frag (sym) == old_frag 418 && S_GET_VALUE (sym) == old_value) 419 { 420 label_seen = TRUE; 421 symbol_set_frag (sym, frag_now); 422 S_SET_VALUE (sym, new_value); 423 } 424 else if (label_seen && symbol_get_frag (sym) != old_frag) 425 break; 426 } 427 record_alignment (now_seg, align); 428 } 429 } 430 431 432 /** Support for self-check mode. */ 433 434 /* Mode of the assembler. */ 435 typedef enum 436 { 437 NIOS2_MODE_ASSEMBLE, /* Ordinary operation. */ 438 NIOS2_MODE_TEST /* Hidden mode used for self testing. */ 439 } NIOS2_MODE; 440 441 static NIOS2_MODE nios2_mode = NIOS2_MODE_ASSEMBLE; 442 443 /* This function is used to in self-checking mode 444 to check the assembled instruction 445 opcode should be the assembled opcode, and exp_opcode 446 the parsed string representing the expected opcode. */ 447 static void 448 nios2_check_assembly (unsigned int opcode, const char *exp_opcode) 449 { 450 if (nios2_mode == NIOS2_MODE_TEST) 451 { 452 if (exp_opcode == NULL) 453 as_bad (_("expecting opcode string in self test mode")); 454 else if (opcode != strtoul (exp_opcode, NULL, 16)) 455 as_bad (_("assembly 0x%08x, expected %s"), opcode, exp_opcode); 456 } 457 } 458 459 460 /** Support for machine-dependent assembler directives. */ 461 /* Handle the .align pseudo-op. This aligns to a power of two. It 462 also adjusts any current instruction label. We treat this the same 463 way the MIPS port does: .align 0 turns off auto alignment. */ 464 static void 465 s_nios2_align (int ignore ATTRIBUTE_UNUSED) 466 { 467 int align; 468 char fill; 469 const char *pfill = NULL; 470 long max_alignment = 15; 471 472 align = get_absolute_expression (); 473 if (align > max_alignment) 474 { 475 align = max_alignment; 476 as_bad (_("Alignment too large: %d. assumed"), align); 477 } 478 else if (align < 0) 479 { 480 as_warn (_("Alignment negative: 0 assumed")); 481 align = 0; 482 } 483 484 if (*input_line_pointer == ',') 485 { 486 input_line_pointer++; 487 fill = get_absolute_expression (); 488 pfill = (const char *) &fill; 489 } 490 else if (subseg_text_p (now_seg)) 491 pfill = (const char *) nop32; 492 else 493 { 494 pfill = NULL; 495 nios2_last_label = NULL; 496 } 497 498 if (align != 0) 499 { 500 nios2_auto_align_on = 1; 501 nios2_align (align, pfill, nios2_last_label); 502 nios2_last_label = NULL; 503 } 504 else 505 nios2_auto_align_on = 0; 506 507 demand_empty_rest_of_line (); 508 } 509 510 /* Handle the .text pseudo-op. This is like the usual one, but it 511 clears the saved last label and resets known alignment. */ 512 static void 513 s_nios2_text (int i) 514 { 515 s_text (i); 516 nios2_last_label = NULL; 517 nios2_current_align = 0; 518 nios2_current_align_seg = now_seg; 519 } 520 521 /* Handle the .data pseudo-op. This is like the usual one, but it 522 clears the saved last label and resets known alignment. */ 523 static void 524 s_nios2_data (int i) 525 { 526 s_data (i); 527 nios2_last_label = NULL; 528 nios2_current_align = 0; 529 nios2_current_align_seg = now_seg; 530 } 531 532 /* Handle the .section pseudo-op. This is like the usual one, but it 533 clears the saved last label and resets known alignment. */ 534 static void 535 s_nios2_section (int ignore) 536 { 537 obj_elf_section (ignore); 538 nios2_last_label = NULL; 539 nios2_current_align = 0; 540 nios2_current_align_seg = now_seg; 541 } 542 543 /* Explicitly unaligned cons. */ 544 static void 545 s_nios2_ucons (int nbytes) 546 { 547 int hold; 548 hold = nios2_auto_align_on; 549 nios2_auto_align_on = 0; 550 cons (nbytes); 551 nios2_auto_align_on = hold; 552 } 553 554 /* Handle the .sdata directive. */ 555 static void 556 s_nios2_sdata (int ignore ATTRIBUTE_UNUSED) 557 { 558 get_absolute_expression (); /* Ignored. */ 559 subseg_new (".sdata", 0); 560 demand_empty_rest_of_line (); 561 } 562 563 /* .set sets assembler options eg noat/at and is also used 564 to set symbol values (.equ, .equiv ). */ 565 static void 566 s_nios2_set (int equiv) 567 { 568 char *save = input_line_pointer; 569 char *directive; 570 char delim = get_symbol_name (&directive); 571 char *endline = input_line_pointer; 572 573 (void) restore_line_pointer (delim); 574 575 /* We only want to handle ".set XXX" if the 576 user has tried ".set XXX, YYY" they are not 577 trying a directive. This prevents 578 us from polluting the name space. */ 579 SKIP_WHITESPACE (); 580 if (is_end_of_line[(unsigned char) *input_line_pointer]) 581 { 582 bfd_boolean done = TRUE; 583 *endline = 0; 584 585 if (!strcmp (directive, "noat")) 586 nios2_as_options.noat = TRUE; 587 else if (!strcmp (directive, "at")) 588 nios2_as_options.noat = FALSE; 589 else if (!strcmp (directive, "nobreak")) 590 nios2_as_options.nobreak = TRUE; 591 else if (!strcmp (directive, "break")) 592 nios2_as_options.nobreak = FALSE; 593 else if (!strcmp (directive, "norelax")) 594 nios2_as_options.relax = relax_none; 595 else if (!strcmp (directive, "relaxsection")) 596 nios2_as_options.relax = relax_section; 597 else if (!strcmp (directive, "relaxall")) 598 nios2_as_options.relax = relax_all; 599 else 600 done = FALSE; 601 602 if (done) 603 { 604 *endline = delim; 605 demand_empty_rest_of_line (); 606 return; 607 } 608 } 609 610 /* If we fall through to here, either we have ".set XXX, YYY" 611 or we have ".set XXX" where XXX is unknown or we have 612 a syntax error. */ 613 input_line_pointer = save; 614 s_set (equiv); 615 } 616 617 /* Machine-dependent assembler directives. 618 Format of each entry is: 619 { "directive", handler_func, param } */ 620 const pseudo_typeS md_pseudo_table[] = { 621 {"align", s_nios2_align, 0}, 622 {"text", s_nios2_text, 0}, 623 {"data", s_nios2_data, 0}, 624 {"section", s_nios2_section, 0}, 625 {"section.s", s_nios2_section, 0}, 626 {"sect", s_nios2_section, 0}, 627 {"sect.s", s_nios2_section, 0}, 628 /* .dword and .half are included for compatibility with MIPS. */ 629 {"dword", cons, 8}, 630 {"half", cons, 2}, 631 /* NIOS2 native word size is 4 bytes, so we override 632 the GAS default of 2. */ 633 {"word", cons, 4}, 634 /* Explicitly unaligned directives. */ 635 {"2byte", s_nios2_ucons, 2}, 636 {"4byte", s_nios2_ucons, 4}, 637 {"8byte", s_nios2_ucons, 8}, 638 {"16byte", s_nios2_ucons, 16}, 639 #ifdef OBJ_ELF 640 {"sdata", s_nios2_sdata, 0}, 641 #endif 642 {"set", s_nios2_set, 0}, 643 {NULL, NULL, 0} 644 }; 645 646 647 /** Relaxation support. */ 648 649 /* We support two relaxation modes: a limited PC-relative mode with 650 -relax-section (the default), and an absolute jump mode with -relax-all. 651 652 Nios II PC-relative branch instructions only support 16-bit offsets. 653 And, there's no good way to add a 32-bit constant to the PC without 654 using two registers. 655 656 To deal with this, for the pc-relative relaxation mode we convert 657 br label 658 into a series of 16-bit adds, like: 659 nextpc at 660 addi at, at, 32767 661 ... 662 addi at, at, remainder 663 jmp at 664 665 Similarly, conditional branches are converted from 666 b(condition) r, s, label 667 into a series like: 668 b(opposite condition) r, s, skip 669 nextpc at 670 addi at, at, 32767 671 ... 672 addi at, at, remainder 673 jmp at 674 skip: 675 676 The compiler can do a better job, either by converting the branch 677 directly into a JMP (going through the GOT for PIC) or by allocating 678 a second register for the 32-bit displacement. 679 680 For the -relax-all relaxation mode, the conversions are 681 movhi at, %hi(symbol+offset) 682 ori at, %lo(symbol+offset) 683 jmp at 684 and 685 b(opposite condition), r, s, skip 686 movhi at, %hi(symbol+offset) 687 ori at, %lo(symbol+offset) 688 jmp at 689 skip: 690 respectively. 691 692 16-bit CDX branch instructions are relaxed first into equivalent 693 32-bit branches and then the above transformations are applied 694 if necessary. 695 696 */ 697 698 /* Arbitrarily limit the number of addis we can insert; we need to be able 699 to specify the maximum growth size for each frag that contains a 700 relaxable branch. There's no point in specifying a huge number here 701 since that means the assembler needs to allocate that much extra 702 memory for every branch, and almost no real code will ever need it. 703 Plus, as already noted a better solution is to just use a jmp, or 704 allocate a second register to hold a 32-bit displacement. 705 FIXME: Rather than making this a constant, it could be controlled by 706 a command-line argument. */ 707 #define RELAX_MAX_ADDI 32 708 709 /* The fr_subtype field represents the target-specific relocation state. 710 It has type relax_substateT (unsigned int). We use it to track the 711 number of addis necessary, plus a bit to track whether this is a 712 conditional branch and a bit for 16-bit CDX instructions. 713 Regardless of the smaller RELAX_MAX_ADDI limit, we reserve 16 bits 714 in the fr_subtype to encode the number of addis so that the whole 715 theoretically-valid range is representable. 716 For the -relax-all mode, N = 0 represents an in-range branch and N = 1 717 represents a branch that needs to be relaxed. */ 718 #define UBRANCH (0 << 16) 719 #define CBRANCH (1 << 16) 720 #define CDXBRANCH (1 << 17) 721 #define IS_CBRANCH(SUBTYPE) ((SUBTYPE) & CBRANCH) 722 #define IS_UBRANCH(SUBTYPE) (!IS_CBRANCH (SUBTYPE)) 723 #define IS_CDXBRANCH(SUBTYPE) ((SUBTYPE) & CDXBRANCH) 724 #define UBRANCH_SUBTYPE(N) (UBRANCH | (N)) 725 #define CBRANCH_SUBTYPE(N) (CBRANCH | (N)) 726 #define CDX_UBRANCH_SUBTYPE(N) (CDXBRANCH | UBRANCH | (N)) 727 #define CDX_CBRANCH_SUBTYPE(N) (CDXBRANCH | CBRANCH | (N)) 728 #define SUBTYPE_ADDIS(SUBTYPE) ((SUBTYPE) & 0xffff) 729 730 /* For the -relax-section mode, unconditional branches require 2 extra 731 instructions besides the addis, conditional branches require 3. */ 732 #define UBRANCH_ADDIS_TO_SIZE(N) (((N) + 2) * 4) 733 #define CBRANCH_ADDIS_TO_SIZE(N) (((N) + 3) * 4) 734 735 /* For the -relax-all mode, unconditional branches require 3 instructions 736 and conditional branches require 4. */ 737 #define UBRANCH_JUMP_SIZE 12 738 #define CBRANCH_JUMP_SIZE 16 739 740 /* Maximum sizes of relaxation sequences. */ 741 #define UBRANCH_MAX_SIZE \ 742 (nios2_as_options.relax == relax_all \ 743 ? UBRANCH_JUMP_SIZE \ 744 : UBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI)) 745 #define CBRANCH_MAX_SIZE \ 746 (nios2_as_options.relax == relax_all \ 747 ? CBRANCH_JUMP_SIZE \ 748 : CBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI)) 749 750 /* Register number of AT, the assembler temporary. */ 751 #define AT_REGNUM 1 752 753 /* Determine how many bytes are required to represent the sequence 754 indicated by SUBTYPE. */ 755 static int 756 nios2_relax_subtype_size (relax_substateT subtype) 757 { 758 int n = SUBTYPE_ADDIS (subtype); 759 if (n == 0) 760 /* Regular conditional/unconditional branch instruction. */ 761 return (IS_CDXBRANCH (subtype) ? 2 : 4); 762 else if (nios2_as_options.relax == relax_all) 763 return (IS_CBRANCH (subtype) ? CBRANCH_JUMP_SIZE : UBRANCH_JUMP_SIZE); 764 else if (IS_CBRANCH (subtype)) 765 return CBRANCH_ADDIS_TO_SIZE (n); 766 else 767 return UBRANCH_ADDIS_TO_SIZE (n); 768 } 769 770 /* Estimate size of fragp before relaxation. 771 This could also examine the offset in fragp and adjust 772 fragp->fr_subtype, but we will do that in nios2_relax_frag anyway. */ 773 int 774 md_estimate_size_before_relax (fragS *fragp, segT segment ATTRIBUTE_UNUSED) 775 { 776 return nios2_relax_subtype_size (fragp->fr_subtype); 777 } 778 779 /* Implement md_relax_frag, returning the change in size of the frag. */ 780 long 781 nios2_relax_frag (segT segment, fragS *fragp, long stretch) 782 { 783 addressT target = fragp->fr_offset; 784 relax_substateT subtype = fragp->fr_subtype; 785 symbolS *symbolp = fragp->fr_symbol; 786 787 if (symbolp) 788 { 789 fragS *sym_frag = symbol_get_frag (symbolp); 790 offsetT offset; 791 int n; 792 bfd_boolean is_cdx = FALSE; 793 794 target += S_GET_VALUE (symbolp); 795 796 /* See comments in write.c:relax_frag about handling of stretch. */ 797 if (stretch != 0 798 && sym_frag->relax_marker != fragp->relax_marker) 799 { 800 if (stretch < 0 || sym_frag->region == fragp->region) 801 target += stretch; 802 else if (target < fragp->fr_address) 803 target = fragp->fr_next->fr_address + stretch; 804 } 805 806 /* We subtract fr_var (4 for 32-bit insns) because all pc relative 807 branches are from the next instruction. */ 808 offset = target - fragp->fr_address - fragp->fr_fix - fragp->fr_var; 809 if (IS_CDXBRANCH (subtype) && IS_UBRANCH (subtype) 810 && offset >= -1024 && offset < 1024) 811 /* PC-relative CDX branch with 11-bit offset. */ 812 is_cdx = TRUE; 813 else if (IS_CDXBRANCH (subtype) && IS_CBRANCH (subtype) 814 && offset >= -128 && offset < 128) 815 /* PC-relative CDX branch with 8-bit offset. */ 816 is_cdx = TRUE; 817 else if (offset >= -32768 && offset < 32768) 818 /* Fits in PC-relative branch. */ 819 n = 0; 820 else if (nios2_as_options.relax == relax_all) 821 /* Convert to jump. */ 822 n = 1; 823 else if (nios2_as_options.relax == relax_section 824 && S_GET_SEGMENT (symbolp) == segment 825 && S_IS_DEFINED (symbolp)) 826 /* Attempt a PC-relative relaxation on a branch to a defined 827 symbol in the same segment. */ 828 { 829 /* The relaxation for conditional branches is offset by 4 830 bytes because we insert the inverted branch around the 831 sequence. */ 832 if (IS_CBRANCH (subtype)) 833 offset = offset - 4; 834 if (offset > 0) 835 n = offset / 32767 + 1; 836 else 837 n = offset / -32768 + 1; 838 839 /* Bail out immediately if relaxation has failed. If we try to 840 defer the diagnostic to md_convert_frag, some pathological test 841 cases (e.g. gcc/testsuite/gcc.c-torture/compile/20001226-1.c) 842 apparently never converge. By returning 0 here we could pretend 843 to the caller that nothing has changed, but that leaves things 844 in an inconsistent state when we get to md_convert_frag. */ 845 if (n > RELAX_MAX_ADDI) 846 { 847 as_bad_where (fragp->fr_file, fragp->fr_line, 848 _("branch offset out of range\n")); 849 as_fatal (_("branch relaxation failed\n")); 850 } 851 } 852 else 853 /* We cannot handle this case, diagnose overflow later. */ 854 return 0; 855 856 if (is_cdx) 857 fragp->fr_subtype = subtype; 858 else if (IS_CBRANCH (subtype)) 859 fragp->fr_subtype = CBRANCH_SUBTYPE (n); 860 else 861 fragp->fr_subtype = UBRANCH_SUBTYPE (n); 862 863 return (nios2_relax_subtype_size (fragp->fr_subtype) 864 - nios2_relax_subtype_size (subtype)); 865 } 866 867 /* If we got here, it's probably an error. */ 868 return 0; 869 } 870 871 872 /* Complete fragp using the data from the relaxation pass. */ 873 void 874 md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT segment ATTRIBUTE_UNUSED, 875 fragS *fragp) 876 { 877 char *buffer = fragp->fr_literal + fragp->fr_fix; 878 relax_substateT subtype = fragp->fr_subtype; 879 int n = SUBTYPE_ADDIS (subtype); 880 addressT target = fragp->fr_offset; 881 symbolS *symbolp = fragp->fr_symbol; 882 offsetT offset; 883 unsigned int addend_mask, addi_mask, op; 884 offsetT addend, remainder; 885 int i; 886 bfd_boolean is_r2 = (bfd_get_mach (stdoutput) == bfd_mach_nios2r2); 887 888 /* If this is a CDX branch we're not relaxing, just generate the fixup. */ 889 if (IS_CDXBRANCH (subtype)) 890 { 891 gas_assert (is_r2); 892 fix_new (fragp, fragp->fr_fix, 2, fragp->fr_symbol, 893 fragp->fr_offset, 1, 894 (IS_UBRANCH (subtype) 895 ? BFD_RELOC_NIOS2_R2_I10_1_PCREL 896 : BFD_RELOC_NIOS2_R2_T1I7_1_PCREL)); 897 fragp->fr_fix += 2; 898 return; 899 } 900 901 /* If this is a CDX branch we are relaxing, turn it into an equivalent 902 32-bit branch and then fall through to the normal non-CDX cases. */ 903 if (fragp->fr_var == 2) 904 { 905 unsigned int opcode = md_chars_to_number (buffer, 2); 906 gas_assert (is_r2); 907 if (IS_CBRANCH (subtype)) 908 { 909 unsigned int reg = nios2_r2_reg3_mappings[GET_IW_T1I7_A3 (opcode)]; 910 if (GET_IW_R2_OP (opcode) == R2_OP_BNEZ_N) 911 opcode = MATCH_R2_BNE | SET_IW_F2I16_A (reg); 912 else 913 opcode = MATCH_R2_BEQ | SET_IW_F2I16_A (reg); 914 } 915 else 916 opcode = MATCH_R2_BR; 917 md_number_to_chars (buffer, opcode, 4); 918 fragp->fr_var = 4; 919 } 920 921 /* If we didn't or can't relax, this is a regular branch instruction. 922 We just need to generate the fixup for the symbol and offset. */ 923 if (n == 0) 924 { 925 fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, 926 fragp->fr_offset, 1, BFD_RELOC_16_PCREL); 927 fragp->fr_fix += 4; 928 return; 929 } 930 931 /* Replace the cbranch at fr_fix with one that has the opposite condition 932 in order to jump around the block of instructions we'll be adding. */ 933 if (IS_CBRANCH (subtype)) 934 { 935 unsigned int br_opcode; 936 unsigned int old_op, new_op; 937 int nbytes; 938 939 /* Account for the nextpc and jmp in the pc-relative case, or the two 940 load instructions and jump in the absolute case. */ 941 if (nios2_as_options.relax == relax_section) 942 nbytes = (n + 2) * 4; 943 else 944 nbytes = 12; 945 946 br_opcode = md_chars_to_number (buffer, 4); 947 if (is_r2) 948 { 949 old_op = GET_IW_R2_OP (br_opcode); 950 switch (old_op) 951 { 952 case R2_OP_BEQ: 953 new_op = R2_OP_BNE; 954 break; 955 case R2_OP_BNE: 956 new_op = R2_OP_BEQ; 957 break; 958 case R2_OP_BGE: 959 new_op = R2_OP_BLT; 960 break; 961 case R2_OP_BGEU: 962 new_op = R2_OP_BLTU; 963 break; 964 case R2_OP_BLT: 965 new_op = R2_OP_BGE; 966 break; 967 case R2_OP_BLTU: 968 new_op = R2_OP_BGEU; 969 break; 970 default: 971 abort (); 972 } 973 br_opcode = ((br_opcode & ~IW_R2_OP_SHIFTED_MASK) 974 | SET_IW_R2_OP (new_op)); 975 br_opcode = br_opcode | SET_IW_F2I16_IMM16 (nbytes); 976 } 977 else 978 { 979 old_op = GET_IW_R1_OP (br_opcode); 980 switch (old_op) 981 { 982 case R1_OP_BEQ: 983 new_op = R1_OP_BNE; 984 break; 985 case R1_OP_BNE: 986 new_op = R1_OP_BEQ; 987 break; 988 case R1_OP_BGE: 989 new_op = R1_OP_BLT; 990 break; 991 case R1_OP_BGEU: 992 new_op = R1_OP_BLTU; 993 break; 994 case R1_OP_BLT: 995 new_op = R1_OP_BGE; 996 break; 997 case R1_OP_BLTU: 998 new_op = R1_OP_BGEU; 999 break; 1000 default: 1001 abort (); 1002 } 1003 br_opcode = ((br_opcode & ~IW_R1_OP_SHIFTED_MASK) 1004 | SET_IW_R1_OP (new_op)); 1005 br_opcode = br_opcode | SET_IW_I_IMM16 (nbytes); 1006 } 1007 md_number_to_chars (buffer, br_opcode, 4); 1008 fragp->fr_fix += 4; 1009 buffer += 4; 1010 } 1011 1012 /* Load at for the PC-relative case. */ 1013 if (nios2_as_options.relax == relax_section) 1014 { 1015 /* Insert the nextpc instruction. */ 1016 if (is_r2) 1017 op = MATCH_R2_NEXTPC | SET_IW_F3X6L5_C (AT_REGNUM); 1018 else 1019 op = MATCH_R1_NEXTPC | SET_IW_R_C (AT_REGNUM); 1020 md_number_to_chars (buffer, op, 4); 1021 fragp->fr_fix += 4; 1022 buffer += 4; 1023 1024 /* We need to know whether the offset is positive or negative. */ 1025 target += S_GET_VALUE (symbolp); 1026 offset = target - fragp->fr_address - fragp->fr_fix; 1027 if (offset > 0) 1028 addend = 32767; 1029 else 1030 addend = -32768; 1031 if (is_r2) 1032 addend_mask = SET_IW_F2I16_IMM16 ((unsigned int)addend); 1033 else 1034 addend_mask = SET_IW_I_IMM16 ((unsigned int)addend); 1035 1036 /* Insert n-1 addi instructions. */ 1037 if (is_r2) 1038 addi_mask = (MATCH_R2_ADDI 1039 | SET_IW_F2I16_B (AT_REGNUM) 1040 | SET_IW_F2I16_A (AT_REGNUM)); 1041 else 1042 addi_mask = (MATCH_R1_ADDI 1043 | SET_IW_I_B (AT_REGNUM) 1044 | SET_IW_I_A (AT_REGNUM)); 1045 for (i = 0; i < n - 1; i ++) 1046 { 1047 md_number_to_chars (buffer, addi_mask | addend_mask, 4); 1048 fragp->fr_fix += 4; 1049 buffer += 4; 1050 } 1051 1052 /* Insert the last addi instruction to hold the remainder. */ 1053 remainder = offset - addend * (n - 1); 1054 gas_assert (remainder >= -32768 && remainder <= 32767); 1055 if (is_r2) 1056 addend_mask = SET_IW_F2I16_IMM16 ((unsigned int)remainder); 1057 else 1058 addend_mask = SET_IW_I_IMM16 ((unsigned int)remainder); 1059 md_number_to_chars (buffer, addi_mask | addend_mask, 4); 1060 fragp->fr_fix += 4; 1061 buffer += 4; 1062 } 1063 1064 /* Load at for the absolute case. */ 1065 else 1066 { 1067 if (is_r2) 1068 op = MATCH_R2_ORHI | SET_IW_F2I16_B (AT_REGNUM) | SET_IW_F2I16_A (0); 1069 else 1070 op = MATCH_R1_ORHI | SET_IW_I_B (AT_REGNUM) | SET_IW_I_A (0); 1071 md_number_to_chars (buffer, op, 4); 1072 fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset, 1073 0, BFD_RELOC_NIOS2_HI16); 1074 fragp->fr_fix += 4; 1075 buffer += 4; 1076 if (is_r2) 1077 op = (MATCH_R2_ORI | SET_IW_F2I16_B (AT_REGNUM) 1078 | SET_IW_F2I16_A (AT_REGNUM)); 1079 else 1080 op = (MATCH_R1_ORI | SET_IW_I_B (AT_REGNUM) 1081 | SET_IW_I_A (AT_REGNUM)); 1082 md_number_to_chars (buffer, op, 4); 1083 fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset, 1084 0, BFD_RELOC_NIOS2_LO16); 1085 fragp->fr_fix += 4; 1086 buffer += 4; 1087 } 1088 1089 /* Insert the jmp instruction. */ 1090 if (is_r2) 1091 op = MATCH_R2_JMP | SET_IW_F3X6L5_A (AT_REGNUM); 1092 else 1093 op = MATCH_R1_JMP | SET_IW_R_A (AT_REGNUM); 1094 md_number_to_chars (buffer, op, 4); 1095 fragp->fr_fix += 4; 1096 buffer += 4; 1097 } 1098 1099 1100 /** Fixups and overflow checking. */ 1101 1102 /* Check a fixup for overflow. */ 1103 static bfd_boolean 1104 nios2_check_overflow (valueT fixup, reloc_howto_type *howto) 1105 { 1106 /* If there is a rightshift, check that the low-order bits are 1107 zero before applying it. */ 1108 if (howto->rightshift) 1109 { 1110 if ((~(~((valueT) 0) << howto->rightshift) & fixup) 1111 && howto->complain_on_overflow != complain_overflow_dont) 1112 return TRUE; 1113 fixup = ((signed)fixup) >> howto->rightshift; 1114 } 1115 1116 /* Check for overflow - return TRUE if overflow, FALSE if not. */ 1117 switch (howto->complain_on_overflow) 1118 { 1119 case complain_overflow_dont: 1120 break; 1121 case complain_overflow_bitfield: 1122 if ((fixup >> howto->bitsize) != 0 1123 && ((signed) fixup >> howto->bitsize) != -1) 1124 return TRUE; 1125 break; 1126 case complain_overflow_signed: 1127 if ((fixup & 0x80000000) > 0) 1128 { 1129 /* Check for negative overflow. */ 1130 if ((signed) fixup < (signed) (~0U << (howto->bitsize - 1))) 1131 return TRUE; 1132 } 1133 else 1134 { 1135 /* Check for positive overflow. */ 1136 if (fixup >= ((unsigned) 1 << (howto->bitsize - 1))) 1137 return TRUE; 1138 } 1139 break; 1140 case complain_overflow_unsigned: 1141 if ((fixup >> howto->bitsize) != 0) 1142 return TRUE; 1143 break; 1144 default: 1145 as_bad (_("error checking for overflow - broken assembler")); 1146 break; 1147 } 1148 return FALSE; 1149 } 1150 1151 /* Emit diagnostic for fixup overflow. */ 1152 static void 1153 nios2_diagnose_overflow (valueT fixup, reloc_howto_type *howto, 1154 fixS *fixP, valueT value) 1155 { 1156 if (fixP->fx_r_type == BFD_RELOC_8 1157 || fixP->fx_r_type == BFD_RELOC_16 1158 || fixP->fx_r_type == BFD_RELOC_32) 1159 /* These relocs are against data, not instructions. */ 1160 as_bad_where (fixP->fx_file, fixP->fx_line, 1161 _("immediate value 0x%x truncated to 0x%x"), 1162 (unsigned int) fixup, 1163 (unsigned int) (~(~(valueT) 0 << howto->bitsize) & fixup)); 1164 else 1165 { 1166 /* What opcode is the instruction? This will determine 1167 whether we check for overflow in immediate values 1168 and what error message we get. */ 1169 const struct nios2_opcode *opcode; 1170 enum overflow_type overflow_msg_type; 1171 unsigned int range_min; 1172 unsigned int range_max; 1173 unsigned int address; 1174 1175 opcode = nios2_find_opcode_hash (value, bfd_get_mach (stdoutput)); 1176 gas_assert (opcode); 1177 gas_assert (fixP->fx_size == opcode->size); 1178 overflow_msg_type = opcode->overflow_msg; 1179 switch (overflow_msg_type) 1180 { 1181 case call_target_overflow: 1182 range_min 1183 = ((fixP->fx_frag->fr_address + fixP->fx_where) & 0xf0000000); 1184 range_max = range_min + 0x0fffffff; 1185 address = fixup | range_min; 1186 1187 as_bad_where (fixP->fx_file, fixP->fx_line, 1188 _("call target address 0x%08x out of range 0x%08x to 0x%08x"), 1189 address, range_min, range_max); 1190 break; 1191 case branch_target_overflow: 1192 if (opcode->format == iw_i_type || opcode->format == iw_F2I16_type) 1193 as_bad_where (fixP->fx_file, fixP->fx_line, 1194 _("branch offset %d out of range %d to %d"), 1195 (int)fixup, -32768, 32767); 1196 else 1197 as_bad_where (fixP->fx_file, fixP->fx_line, 1198 _("branch offset %d out of range"), 1199 (int)fixup); 1200 break; 1201 case address_offset_overflow: 1202 if (opcode->format == iw_i_type || opcode->format == iw_F2I16_type) 1203 as_bad_where (fixP->fx_file, fixP->fx_line, 1204 _("%s offset %d out of range %d to %d"), 1205 opcode->name, (int)fixup, -32768, 32767); 1206 else 1207 as_bad_where (fixP->fx_file, fixP->fx_line, 1208 _("%s offset %d out of range"), 1209 opcode->name, (int)fixup); 1210 break; 1211 case signed_immed16_overflow: 1212 as_bad_where (fixP->fx_file, fixP->fx_line, 1213 _("immediate value %d out of range %d to %d"), 1214 (int)fixup, -32768, 32767); 1215 break; 1216 case unsigned_immed16_overflow: 1217 as_bad_where (fixP->fx_file, fixP->fx_line, 1218 _("immediate value %u out of range %u to %u"), 1219 (unsigned int)fixup, 0, 65535); 1220 break; 1221 case unsigned_immed5_overflow: 1222 as_bad_where (fixP->fx_file, fixP->fx_line, 1223 _("immediate value %u out of range %u to %u"), 1224 (unsigned int)fixup, 0, 31); 1225 break; 1226 case signed_immed12_overflow: 1227 as_bad_where (fixP->fx_file, fixP->fx_line, 1228 _("immediate value %d out of range %d to %d"), 1229 (int)fixup, -2048, 2047); 1230 break; 1231 case custom_opcode_overflow: 1232 as_bad_where (fixP->fx_file, fixP->fx_line, 1233 _("custom instruction opcode %u out of range %u to %u"), 1234 (unsigned int)fixup, 0, 255); 1235 break; 1236 default: 1237 as_bad_where (fixP->fx_file, fixP->fx_line, 1238 _("overflow in immediate argument")); 1239 break; 1240 } 1241 } 1242 } 1243 1244 /* Apply a fixup to the object file. */ 1245 void 1246 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) 1247 { 1248 /* Assert that the fixup is one we can handle. */ 1249 gas_assert (fixP != NULL && valP != NULL 1250 && (fixP->fx_r_type == BFD_RELOC_8 1251 || fixP->fx_r_type == BFD_RELOC_16 1252 || fixP->fx_r_type == BFD_RELOC_32 1253 || fixP->fx_r_type == BFD_RELOC_64 1254 || fixP->fx_r_type == BFD_RELOC_NIOS2_S16 1255 || fixP->fx_r_type == BFD_RELOC_NIOS2_U16 1256 || fixP->fx_r_type == BFD_RELOC_16_PCREL 1257 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26 1258 || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM5 1259 || fixP->fx_r_type == BFD_RELOC_NIOS2_CACHE_OPX 1260 || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM6 1261 || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM8 1262 || fixP->fx_r_type == BFD_RELOC_NIOS2_HI16 1263 || fixP->fx_r_type == BFD_RELOC_NIOS2_LO16 1264 || fixP->fx_r_type == BFD_RELOC_NIOS2_HIADJ16 1265 || fixP->fx_r_type == BFD_RELOC_NIOS2_GPREL 1266 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 1267 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY 1268 || fixP->fx_r_type == BFD_RELOC_NIOS2_UJMP 1269 || fixP->fx_r_type == BFD_RELOC_NIOS2_CJMP 1270 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALLR 1271 || fixP->fx_r_type == BFD_RELOC_NIOS2_ALIGN 1272 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT16 1273 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL16 1274 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO 1275 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA 1276 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16 1277 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16 1278 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16 1279 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16 1280 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16 1281 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF 1282 || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL 1283 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26_NOAT 1284 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_LO 1285 || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_HA 1286 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_LO 1287 || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_HA 1288 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_S12 1289 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_I10_1_PCREL 1290 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1I7_1_PCREL 1291 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1I7_2 1292 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4 1293 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4_1 1294 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4_2 1295 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_X1I7_2 1296 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_X2L5 1297 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_F1I5_2 1298 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_L5I4X1 1299 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1X1I6 1300 || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1X1I6_2 1301 /* Add other relocs here as we generate them. */ 1302 )); 1303 1304 if (fixP->fx_r_type == BFD_RELOC_64) 1305 { 1306 /* We may reach here due to .8byte directives, but we never output 1307 BFD_RELOC_64; it must be resolved. */ 1308 if (fixP->fx_addsy != NULL) 1309 as_bad_where (fixP->fx_file, fixP->fx_line, 1310 _("cannot create 64-bit relocation")); 1311 else 1312 { 1313 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, 1314 *valP, 8); 1315 fixP->fx_done = 1; 1316 } 1317 return; 1318 } 1319 1320 /* The value passed in valP can be the value of a fully 1321 resolved expression, or it can be the value of a partially 1322 resolved expression. In the former case, both fixP->fx_addsy 1323 and fixP->fx_subsy are NULL, and fixP->fx_offset == *valP, and 1324 we can fix up the instruction that fixP relates to. 1325 In the latter case, one or both of fixP->fx_addsy and 1326 fixP->fx_subsy are not NULL, and fixP->fx_offset may or may not 1327 equal *valP. We don't need to check for fixP->fx_subsy being null 1328 because the generic part of the assembler generates an error if 1329 it is not an absolute symbol. */ 1330 if (fixP->fx_addsy != NULL) 1331 /* Partially resolved expression. */ 1332 { 1333 fixP->fx_addnumber = fixP->fx_offset; 1334 fixP->fx_done = 0; 1335 1336 switch (fixP->fx_r_type) 1337 { 1338 case BFD_RELOC_NIOS2_TLS_GD16: 1339 case BFD_RELOC_NIOS2_TLS_LDM16: 1340 case BFD_RELOC_NIOS2_TLS_LDO16: 1341 case BFD_RELOC_NIOS2_TLS_IE16: 1342 case BFD_RELOC_NIOS2_TLS_LE16: 1343 case BFD_RELOC_NIOS2_TLS_DTPMOD: 1344 case BFD_RELOC_NIOS2_TLS_DTPREL: 1345 case BFD_RELOC_NIOS2_TLS_TPREL: 1346 S_SET_THREAD_LOCAL (fixP->fx_addsy); 1347 break; 1348 default: 1349 break; 1350 } 1351 } 1352 else 1353 /* Fully resolved fixup. */ 1354 { 1355 reloc_howto_type *howto 1356 = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type); 1357 1358 if (howto == NULL) 1359 as_bad_where (fixP->fx_file, fixP->fx_line, 1360 _("relocation is not supported")); 1361 else 1362 { 1363 valueT fixup = *valP; 1364 valueT value; 1365 char *buf; 1366 1367 /* If this is a pc-relative relocation, we need to 1368 subtract the current offset within the object file 1369 FIXME : for some reason fixP->fx_pcrel isn't 1 when it should be 1370 so I'm using the howto structure instead to determine this. */ 1371 if (howto->pc_relative == 1) 1372 { 1373 fixup = (fixup - (fixP->fx_frag->fr_address + fixP->fx_where 1374 + fixP->fx_size)); 1375 *valP = fixup; 1376 } 1377 1378 /* Get the instruction or data to be fixed up. */ 1379 buf = fixP->fx_frag->fr_literal + fixP->fx_where; 1380 value = md_chars_to_number (buf, fixP->fx_size); 1381 1382 /* Check for overflow, emitting a diagnostic if necessary. */ 1383 if (nios2_check_overflow (fixup, howto)) 1384 nios2_diagnose_overflow (fixup, howto, fixP, value); 1385 1386 /* Apply the right shift. */ 1387 fixup = ((signed)fixup) >> howto->rightshift; 1388 1389 /* Truncate the fixup to right size. */ 1390 switch (fixP->fx_r_type) 1391 { 1392 case BFD_RELOC_NIOS2_HI16: 1393 fixup = (fixup >> 16) & 0xFFFF; 1394 break; 1395 case BFD_RELOC_NIOS2_LO16: 1396 fixup = fixup & 0xFFFF; 1397 break; 1398 case BFD_RELOC_NIOS2_HIADJ16: 1399 fixup = ((((fixup >> 16) & 0xFFFF) + ((fixup >> 15) & 0x01)) 1400 & 0xFFFF); 1401 break; 1402 default: 1403 { 1404 int n = sizeof (fixup) * 8 - howto->bitsize; 1405 fixup = (fixup << n) >> n; 1406 break; 1407 } 1408 } 1409 1410 /* Fix up the instruction. */ 1411 value = (value & ~howto->dst_mask) | (fixup << howto->bitpos); 1412 md_number_to_chars (buf, value, fixP->fx_size); 1413 } 1414 1415 fixP->fx_done = 1; 1416 } 1417 1418 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT) 1419 { 1420 fixP->fx_done = 0; 1421 if (fixP->fx_addsy 1422 && !S_IS_DEFINED (fixP->fx_addsy) && !S_IS_WEAK (fixP->fx_addsy)) 1423 S_SET_WEAK (fixP->fx_addsy); 1424 } 1425 else if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 1426 fixP->fx_done = 0; 1427 } 1428 1429 1430 1431 /** Instruction parsing support. */ 1432 1433 /* General internal error routine. */ 1434 1435 static void 1436 bad_opcode (const struct nios2_opcode *op) 1437 { 1438 fprintf (stderr, _("internal error: broken opcode descriptor for `%s %s'\n"), 1439 op->name, op->args); 1440 as_fatal (_("Broken assembler. No assembly attempted.")); 1441 } 1442 1443 /* Special relocation directive strings. */ 1444 1445 struct nios2_special_relocS 1446 { 1447 const char *string; 1448 bfd_reloc_code_real_type reloc_type; 1449 }; 1450 1451 /* This table is sorted so that prefix strings are listed after the longer 1452 strings that include them -- e.g., %got after %got_hiadj, etc. */ 1453 1454 struct nios2_special_relocS nios2_special_reloc[] = { 1455 {"%hiadj", BFD_RELOC_NIOS2_HIADJ16}, 1456 {"%hi", BFD_RELOC_NIOS2_HI16}, 1457 {"%lo", BFD_RELOC_NIOS2_LO16}, 1458 {"%gprel", BFD_RELOC_NIOS2_GPREL}, 1459 {"%call_lo", BFD_RELOC_NIOS2_CALL_LO}, 1460 {"%call_hiadj", BFD_RELOC_NIOS2_CALL_HA}, 1461 {"%call", BFD_RELOC_NIOS2_CALL16}, 1462 {"%gotoff_lo", BFD_RELOC_NIOS2_GOTOFF_LO}, 1463 {"%gotoff_hiadj", BFD_RELOC_NIOS2_GOTOFF_HA}, 1464 {"%gotoff", BFD_RELOC_NIOS2_GOTOFF}, 1465 {"%got_hiadj", BFD_RELOC_NIOS2_GOT_HA}, 1466 {"%got_lo", BFD_RELOC_NIOS2_GOT_LO}, 1467 {"%got", BFD_RELOC_NIOS2_GOT16}, 1468 {"%tls_gd", BFD_RELOC_NIOS2_TLS_GD16}, 1469 {"%tls_ldm", BFD_RELOC_NIOS2_TLS_LDM16}, 1470 {"%tls_ldo", BFD_RELOC_NIOS2_TLS_LDO16}, 1471 {"%tls_ie", BFD_RELOC_NIOS2_TLS_IE16}, 1472 {"%tls_le", BFD_RELOC_NIOS2_TLS_LE16}, 1473 }; 1474 1475 #define NIOS2_NUM_SPECIAL_RELOCS \ 1476 (sizeof(nios2_special_reloc)/sizeof(nios2_special_reloc[0])) 1477 const int nios2_num_special_relocs = NIOS2_NUM_SPECIAL_RELOCS; 1478 1479 /* Creates a new nios2_insn_relocS and returns a pointer to it. */ 1480 static nios2_insn_relocS * 1481 nios2_insn_reloc_new (bfd_reloc_code_real_type reloc_type, unsigned int pcrel) 1482 { 1483 nios2_insn_relocS *retval; 1484 retval = XNEW (nios2_insn_relocS); 1485 if (retval == NULL) 1486 { 1487 as_bad (_("can't create relocation")); 1488 abort (); 1489 } 1490 1491 /* Fill out the fields with default values. */ 1492 retval->reloc_next = NULL; 1493 retval->reloc_type = reloc_type; 1494 retval->reloc_pcrel = pcrel; 1495 return retval; 1496 } 1497 1498 /* Frees up memory previously allocated by nios2_insn_reloc_new(). */ 1499 /* FIXME: this is never called; memory leak? */ 1500 #if 0 1501 static void 1502 nios2_insn_reloc_destroy (nios2_insn_relocS *reloc) 1503 { 1504 gas_assert (reloc != NULL); 1505 free (reloc); 1506 } 1507 #endif 1508 1509 /* Look up a register name and validate it for the given regtype. 1510 Return the register mapping or NULL on failure. */ 1511 static struct nios2_reg * 1512 nios2_parse_reg (const char *token, unsigned long regtype) 1513 { 1514 struct nios2_reg *reg = nios2_reg_lookup (token); 1515 1516 if (reg == NULL) 1517 { 1518 as_bad (_("unknown register %s"), token); 1519 return NULL; 1520 } 1521 1522 /* Matched a register, but is it the wrong type? */ 1523 if (!(regtype & reg->regtype)) 1524 { 1525 if (regtype & REG_CONTROL) 1526 as_bad (_("expecting control register")); 1527 else if (reg->regtype & REG_CONTROL) 1528 as_bad (_("illegal use of control register")); 1529 else if (reg->regtype & REG_COPROCESSOR) 1530 as_bad (_("illegal use of coprocessor register")); 1531 else 1532 as_bad (_("invalid register %s"), token); 1533 return NULL; 1534 } 1535 1536 /* Warn for explicit use of special registers. */ 1537 if (reg->regtype & REG_NORMAL) 1538 { 1539 if (!nios2_as_options.noat && reg->index == 1) 1540 as_warn (_("Register at (r1) can sometimes be corrupted by " 1541 "assembler optimizations.\n" 1542 "Use .set noat to turn off those optimizations " 1543 "(and this warning).")); 1544 if (!nios2_as_options.nobreak && reg->index == 25) 1545 as_warn (_("The debugger will corrupt bt (r25).\n" 1546 "If you don't need to debug this " 1547 "code use .set nobreak to turn off this warning.")); 1548 if (!nios2_as_options.nobreak && reg->index == 30) 1549 as_warn (_("The debugger will corrupt sstatus/ba (r30).\n" 1550 "If you don't need to debug this " 1551 "code use .set nobreak to turn off this warning.")); 1552 } 1553 1554 return reg; 1555 } 1556 1557 /* This function parses a reglist for ldwm/stwm and push.n/pop.n 1558 instructions, given as a brace-enclosed register list. The tokenizer 1559 has replaced commas in the token with spaces. 1560 The return value is a bitmask of registers in the set. It also 1561 sets nios2_reglist_mask and nios2_reglist_dir to allow error checking 1562 when parsing the base register. */ 1563 1564 static unsigned long nios2_reglist_mask; 1565 static int nios2_reglist_dir; 1566 1567 static unsigned long 1568 nios2_parse_reglist (char *token, const struct nios2_opcode *op) 1569 { 1570 unsigned long mask = 0; 1571 int dir = 0; 1572 unsigned long regtype = 0; 1573 int last = -1; 1574 const char *regname; 1575 1576 nios2_reglist_mask = 0; 1577 nios2_reglist_dir = 0; 1578 1579 if (op->match == MATCH_R2_LDWM || op->match == MATCH_R2_STWM) 1580 { 1581 regtype = REG_LDWM; 1582 dir = 0; 1583 } 1584 else if (op->match == MATCH_R2_PUSH_N) 1585 { 1586 regtype = REG_POP; 1587 dir = -1; 1588 } 1589 else if (op->match == MATCH_R2_POP_N) 1590 { 1591 regtype = REG_POP; 1592 dir = 1; 1593 } 1594 else 1595 bad_opcode (op); 1596 1597 for (regname = strtok (token, "{ }"); 1598 regname; 1599 regname = strtok (NULL, "{ }")) 1600 { 1601 int regno; 1602 struct nios2_reg *reg = nios2_parse_reg (regname, regtype); 1603 1604 if (!reg) 1605 break; 1606 regno = reg->index; 1607 1608 /* Make sure registers are listed in proper sequence. */ 1609 if (last >= 0) 1610 { 1611 if (regno == last) 1612 { 1613 as_bad ("duplicate register %s\n", reg->name); 1614 return 0; 1615 } 1616 else if (dir == 0) 1617 dir = (regno < last ? -1 : 1); 1618 else if ((dir > 0 && regno < last) 1619 || (dir < 0 && regno > last) 1620 || (op->match == MATCH_R2_PUSH_N 1621 && ! ((last == 31 && regno == 28) 1622 || (last == 31 && regno <= 23) 1623 || (last == 28 && regno <= 23) 1624 || (regno < 23 && regno == last - 1))) 1625 || (op->match == MATCH_R2_POP_N 1626 && ! ((regno == 31 && last == 28) 1627 || (regno == 31 && last <= 23) 1628 || (regno == 28 && last <= 23) 1629 || (last < 23 && last == regno - 1)))) 1630 { 1631 as_bad ("invalid register order"); 1632 return 0; 1633 } 1634 } 1635 1636 mask |= 1 << regno; 1637 last = regno; 1638 } 1639 1640 /* Check that all ldwm/stwm regs belong to the same set. */ 1641 if ((op->match == MATCH_R2_LDWM || op->match == MATCH_R2_STWM) 1642 && (mask & 0x00003ffc) && (mask & 0x90ffc000)) 1643 { 1644 as_bad ("invalid register set in reglist"); 1645 return 0; 1646 } 1647 1648 /* Check that push.n/pop.n regs include RA. */ 1649 if ((op->match == MATCH_R2_PUSH_N || op->match == MATCH_R2_POP_N) 1650 && ((mask & 0x80000000) == 0)) 1651 { 1652 as_bad ("reglist must include ra (r31)"); 1653 return 0; 1654 } 1655 1656 /* Check that there is at least one register in the set. */ 1657 if (!mask) 1658 { 1659 as_bad ("reglist must include at least one register"); 1660 return 0; 1661 } 1662 1663 /* OK, reglist passed validation. */ 1664 nios2_reglist_mask = mask; 1665 nios2_reglist_dir = dir; 1666 return mask; 1667 } 1668 1669 /* This function parses the base register and options used by the ldwm/stwm 1670 instructions. Returns the base register and sets the option arguments 1671 accordingly. On failure, returns NULL. */ 1672 static struct nios2_reg * 1673 nios2_parse_base_register (char *str, int *direction, int *writeback, int *ret) 1674 { 1675 char *regname; 1676 struct nios2_reg *reg; 1677 1678 *direction = 0; 1679 *writeback = 0; 1680 *ret = 0; 1681 1682 /* Check for --. */ 1683 if (strncmp (str, "--", 2) == 0) 1684 { 1685 str += 2; 1686 *direction -= 1; 1687 } 1688 1689 /* Extract the base register. */ 1690 if (*str != '(') 1691 { 1692 as_bad ("expected '(' before base register"); 1693 return NULL; 1694 } 1695 str++; 1696 regname = str; 1697 str = strchr (str, ')'); 1698 if (!str) 1699 { 1700 as_bad ("expected ')' after base register"); 1701 return NULL; 1702 } 1703 *str = '\0'; 1704 str++; 1705 reg = nios2_parse_reg (regname, REG_NORMAL); 1706 if (reg == NULL) 1707 return NULL; 1708 1709 /* Check for ++. */ 1710 if (strncmp (str, "++", 2) == 0) 1711 { 1712 str += 2; 1713 *direction += 1; 1714 } 1715 1716 /* Ensure that either -- or ++ is specified, but not both. */ 1717 if (*direction == 0) 1718 { 1719 as_bad ("invalid base register syntax"); 1720 return NULL;; 1721 } 1722 1723 /* Check for options. The tokenizer has replaced commas with spaces. */ 1724 while (*str) 1725 { 1726 while (*str == ' ') 1727 str++; 1728 if (strncmp (str, "writeback", 9) == 0) 1729 { 1730 *writeback = 1; 1731 str += 9; 1732 } 1733 else if (strncmp (str, "ret", 3) == 0) 1734 { 1735 *ret = 1; 1736 str += 3; 1737 } 1738 else if (*str) 1739 { 1740 as_bad ("invalid option syntax"); 1741 return NULL; 1742 } 1743 } 1744 1745 return reg; 1746 } 1747 1748 1749 /* The various nios2_assemble_* functions call this 1750 function to generate an expression from a string representing an expression. 1751 It then tries to evaluate the expression, and if it can, returns its value. 1752 If not, it creates a new nios2_insn_relocS and stores the expression and 1753 reloc_type for future use. */ 1754 static unsigned long 1755 nios2_assemble_expression (const char *exprstr, 1756 nios2_insn_infoS *insn, 1757 bfd_reloc_code_real_type orig_reloc_type, 1758 unsigned int pcrel) 1759 { 1760 nios2_insn_relocS *reloc; 1761 char *saved_line_ptr; 1762 unsigned long value = 0; 1763 int i; 1764 bfd_reloc_code_real_type reloc_type = orig_reloc_type; 1765 1766 gas_assert (exprstr != NULL); 1767 gas_assert (insn != NULL); 1768 1769 /* Check for relocation operators. 1770 Change the relocation type and advance the ptr to the start of 1771 the expression proper. */ 1772 for (i = 0; i < nios2_num_special_relocs; i++) 1773 if (strstr (exprstr, nios2_special_reloc[i].string) != NULL) 1774 { 1775 reloc_type = nios2_special_reloc[i].reloc_type; 1776 exprstr += strlen (nios2_special_reloc[i].string) + 1; 1777 1778 /* %lo and %hiadj have different meanings for PC-relative 1779 expressions. */ 1780 if (pcrel) 1781 { 1782 if (reloc_type == BFD_RELOC_NIOS2_LO16) 1783 reloc_type = BFD_RELOC_NIOS2_PCREL_LO; 1784 if (reloc_type == BFD_RELOC_NIOS2_HIADJ16) 1785 reloc_type = BFD_RELOC_NIOS2_PCREL_HA; 1786 } 1787 1788 break; 1789 } 1790 1791 /* No relocation allowed; we must have a constant expression. */ 1792 if (orig_reloc_type == BFD_RELOC_NONE) 1793 { 1794 expressionS exp; 1795 1796 /* Parse the expression string. */ 1797 saved_line_ptr = input_line_pointer; 1798 input_line_pointer = (char *) exprstr; 1799 expression (&exp); 1800 input_line_pointer = saved_line_ptr; 1801 1802 /* If we don't have a constant, give an error. */ 1803 if (reloc_type != orig_reloc_type || exp.X_op != O_constant) 1804 as_bad (_("expression must be constant")); 1805 else 1806 value = exp.X_add_number; 1807 return (unsigned long) value; 1808 } 1809 1810 /* We potentially have a relocation. */ 1811 reloc = nios2_insn_reloc_new (reloc_type, pcrel); 1812 reloc->reloc_next = insn->insn_reloc; 1813 insn->insn_reloc = reloc; 1814 1815 /* Parse the expression string. */ 1816 saved_line_ptr = input_line_pointer; 1817 input_line_pointer = (char *) exprstr; 1818 expression (&reloc->reloc_expression); 1819 input_line_pointer = saved_line_ptr; 1820 1821 /* This is redundant as the fixup will put this into 1822 the instruction, but it is included here so that 1823 self-test mode (-r) works. */ 1824 if (nios2_mode == NIOS2_MODE_TEST 1825 && reloc->reloc_expression.X_op == O_constant) 1826 value = reloc->reloc_expression.X_add_number; 1827 1828 return (unsigned long) value; 1829 } 1830 1831 /* Encode a 3-bit register number, giving an error if this is not possible. */ 1832 static unsigned int 1833 nios2_assemble_reg3 (const char *token) 1834 { 1835 struct nios2_reg *reg = nios2_parse_reg (token, REG_3BIT); 1836 int j; 1837 1838 if (reg == NULL) 1839 return 0; 1840 1841 for (j = 0; j < nios2_num_r2_reg3_mappings; j++) 1842 if (nios2_r2_reg3_mappings[j] == reg->index) 1843 return j; 1844 1845 /* Should never get here if we passed validation. */ 1846 as_bad (_("invalid register %s"), token); 1847 return 0; 1848 } 1849 1850 /* Argument assemble functions. */ 1851 1852 1853 /* Control register index. */ 1854 static void 1855 nios2_assemble_arg_c (const char *token, nios2_insn_infoS *insn) 1856 { 1857 struct nios2_reg *reg = nios2_parse_reg (token, REG_CONTROL); 1858 const struct nios2_opcode *op = insn->insn_nios2_opcode; 1859 1860 if (reg == NULL) 1861 return; 1862 1863 switch (op->format) 1864 { 1865 case iw_r_type: 1866 insn->insn_code |= SET_IW_R_IMM5 (reg->index); 1867 break; 1868 case iw_F3X6L5_type: 1869 insn->insn_code |= SET_IW_F3X6L5_IMM5 (reg->index); 1870 break; 1871 default: 1872 bad_opcode (op); 1873 } 1874 } 1875 1876 /* Destination register. */ 1877 static void 1878 nios2_assemble_arg_d (const char *token, nios2_insn_infoS *insn) 1879 { 1880 const struct nios2_opcode *op = insn->insn_nios2_opcode; 1881 unsigned long regtype = REG_NORMAL; 1882 struct nios2_reg *reg; 1883 1884 if (op->format == iw_custom_type || op->format == iw_F3X8_type) 1885 regtype |= REG_COPROCESSOR; 1886 reg = nios2_parse_reg (token, regtype); 1887 if (reg == NULL) 1888 return; 1889 1890 switch (op->format) 1891 { 1892 case iw_r_type: 1893 insn->insn_code |= SET_IW_R_C (reg->index); 1894 break; 1895 case iw_custom_type: 1896 insn->insn_code |= SET_IW_CUSTOM_C (reg->index); 1897 if (reg->regtype & REG_COPROCESSOR) 1898 insn->insn_code |= SET_IW_CUSTOM_READC (0); 1899 else 1900 insn->insn_code |= SET_IW_CUSTOM_READC (1); 1901 break; 1902 case iw_F3X6L5_type: 1903 case iw_F3X6_type: 1904 insn->insn_code |= SET_IW_F3X6L5_C (reg->index); 1905 break; 1906 case iw_F3X8_type: 1907 insn->insn_code |= SET_IW_F3X8_C (reg->index); 1908 if (reg->regtype & REG_COPROCESSOR) 1909 insn->insn_code |= SET_IW_F3X8_READC (0); 1910 else 1911 insn->insn_code |= SET_IW_F3X8_READC (1); 1912 break; 1913 case iw_F2_type: 1914 insn->insn_code |= SET_IW_F2_B (reg->index); 1915 break; 1916 default: 1917 bad_opcode (op); 1918 } 1919 } 1920 1921 /* Source register 1. */ 1922 static void 1923 nios2_assemble_arg_s (const char *token, nios2_insn_infoS *insn) 1924 { 1925 const struct nios2_opcode *op = insn->insn_nios2_opcode; 1926 unsigned long regtype = REG_NORMAL; 1927 struct nios2_reg *reg; 1928 1929 if (op->format == iw_custom_type || op->format == iw_F3X8_type) 1930 regtype |= REG_COPROCESSOR; 1931 reg = nios2_parse_reg (token, regtype); 1932 if (reg == NULL) 1933 return; 1934 1935 switch (op->format) 1936 { 1937 case iw_r_type: 1938 if (op->match == MATCH_R1_JMP && reg->index == 31) 1939 as_bad (_("r31 cannot be used with jmp; use ret instead")); 1940 insn->insn_code |= SET_IW_R_A (reg->index); 1941 break; 1942 case iw_i_type: 1943 insn->insn_code |= SET_IW_I_A (reg->index); 1944 break; 1945 case iw_custom_type: 1946 insn->insn_code |= SET_IW_CUSTOM_A (reg->index); 1947 if (reg->regtype & REG_COPROCESSOR) 1948 insn->insn_code |= SET_IW_CUSTOM_READA (0); 1949 else 1950 insn->insn_code |= SET_IW_CUSTOM_READA (1); 1951 break; 1952 case iw_F2I16_type: 1953 insn->insn_code |= SET_IW_F2I16_A (reg->index); 1954 break; 1955 case iw_F2X4I12_type: 1956 insn->insn_code |= SET_IW_F2X4I12_A (reg->index); 1957 break; 1958 case iw_F1X4I12_type: 1959 insn->insn_code |= SET_IW_F1X4I12_A (reg->index); 1960 break; 1961 case iw_F1X4L17_type: 1962 insn->insn_code |= SET_IW_F1X4L17_A (reg->index); 1963 break; 1964 case iw_F3X6L5_type: 1965 case iw_F3X6_type: 1966 if (op->match == MATCH_R2_JMP && reg->index == 31) 1967 as_bad (_("r31 cannot be used with jmp; use ret instead")); 1968 insn->insn_code |= SET_IW_F3X6L5_A (reg->index); 1969 break; 1970 case iw_F2X6L10_type: 1971 insn->insn_code |= SET_IW_F2X6L10_A (reg->index); 1972 break; 1973 case iw_F3X8_type: 1974 insn->insn_code |= SET_IW_F3X8_A (reg->index); 1975 if (reg->regtype & REG_COPROCESSOR) 1976 insn->insn_code |= SET_IW_F3X8_READA (0); 1977 else 1978 insn->insn_code |= SET_IW_F3X8_READA (1); 1979 break; 1980 case iw_F1X1_type: 1981 if (op->match == MATCH_R2_JMPR_N && reg->index == 31) 1982 as_bad (_("r31 cannot be used with jmpr.n; use ret.n instead")); 1983 insn->insn_code |= SET_IW_F1X1_A (reg->index); 1984 break; 1985 case iw_F1I5_type: 1986 /* Implicit stack pointer reference. */ 1987 if (reg->index != 27) 1988 as_bad (_("invalid register %s"), token); 1989 break; 1990 case iw_F2_type: 1991 insn->insn_code |= SET_IW_F2_A (reg->index); 1992 break; 1993 default: 1994 bad_opcode (op); 1995 } 1996 } 1997 1998 /* Source register 2. */ 1999 static void 2000 nios2_assemble_arg_t (const char *token, nios2_insn_infoS *insn) 2001 { 2002 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2003 unsigned long regtype = REG_NORMAL; 2004 struct nios2_reg *reg; 2005 2006 if (op->format == iw_custom_type || op->format == iw_F3X8_type) 2007 regtype |= REG_COPROCESSOR; 2008 reg = nios2_parse_reg (token, regtype); 2009 if (reg == NULL) 2010 return; 2011 2012 switch (op->format) 2013 { 2014 case iw_r_type: 2015 insn->insn_code |= SET_IW_R_B (reg->index); 2016 break; 2017 case iw_i_type: 2018 insn->insn_code |= SET_IW_I_B (reg->index); 2019 break; 2020 case iw_custom_type: 2021 insn->insn_code |= SET_IW_CUSTOM_B (reg->index); 2022 if (reg->regtype & REG_COPROCESSOR) 2023 insn->insn_code |= SET_IW_CUSTOM_READB (0); 2024 else 2025 insn->insn_code |= SET_IW_CUSTOM_READB (1); 2026 break; 2027 case iw_F2I16_type: 2028 insn->insn_code |= SET_IW_F2I16_B (reg->index); 2029 break; 2030 case iw_F2X4I12_type: 2031 insn->insn_code |= SET_IW_F2X4I12_B (reg->index); 2032 break; 2033 case iw_F3X6L5_type: 2034 case iw_F3X6_type: 2035 insn->insn_code |= SET_IW_F3X6L5_B (reg->index); 2036 break; 2037 case iw_F2X6L10_type: 2038 insn->insn_code |= SET_IW_F2X6L10_B (reg->index); 2039 break; 2040 case iw_F3X8_type: 2041 insn->insn_code |= SET_IW_F3X8_B (reg->index); 2042 if (reg->regtype & REG_COPROCESSOR) 2043 insn->insn_code |= SET_IW_F3X8_READB (0); 2044 else 2045 insn->insn_code |= SET_IW_F3X8_READB (1); 2046 break; 2047 case iw_F1I5_type: 2048 insn->insn_code |= SET_IW_F1I5_B (reg->index); 2049 break; 2050 case iw_F2_type: 2051 insn->insn_code |= SET_IW_F2_B (reg->index); 2052 break; 2053 case iw_T1X1I6_type: 2054 /* Implicit zero register reference. */ 2055 if (reg->index != 0) 2056 as_bad (_("invalid register %s"), token); 2057 break; 2058 2059 default: 2060 bad_opcode (op); 2061 } 2062 } 2063 2064 /* Destination register w/3-bit encoding. */ 2065 static void 2066 nios2_assemble_arg_D (const char *token, nios2_insn_infoS *insn) 2067 { 2068 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2069 int reg = nios2_assemble_reg3 (token); 2070 2071 switch (op->format) 2072 { 2073 case iw_T1I7_type: 2074 insn->insn_code |= SET_IW_T1I7_A3 (reg); 2075 break; 2076 case iw_T2X1L3_type: 2077 insn->insn_code |= SET_IW_T2X1L3_B3 (reg); 2078 break; 2079 case iw_T2X1I3_type: 2080 insn->insn_code |= SET_IW_T2X1I3_B3 (reg); 2081 break; 2082 case iw_T3X1_type: 2083 insn->insn_code |= SET_IW_T3X1_C3 (reg); 2084 break; 2085 case iw_T2X3_type: 2086 /* Some instructions using this encoding take 3 register arguments, 2087 requiring the destination register to be the same as the first 2088 source register. */ 2089 if (op->num_args == 3) 2090 insn->insn_code |= SET_IW_T2X3_A3 (reg); 2091 else 2092 insn->insn_code |= SET_IW_T2X3_B3 (reg); 2093 break; 2094 default: 2095 bad_opcode (op); 2096 } 2097 } 2098 2099 /* Source register w/3-bit encoding. */ 2100 static void 2101 nios2_assemble_arg_S (const char *token, nios2_insn_infoS *insn) 2102 { 2103 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2104 int reg = nios2_assemble_reg3 (token); 2105 2106 switch (op->format) 2107 { 2108 case iw_T1I7_type: 2109 insn->insn_code |= SET_IW_T1I7_A3 (reg); 2110 break; 2111 case iw_T2I4_type: 2112 insn->insn_code |= SET_IW_T2I4_A3 (reg); 2113 break; 2114 case iw_T2X1L3_type: 2115 insn->insn_code |= SET_IW_T2X1L3_A3 (reg); 2116 break; 2117 case iw_T2X1I3_type: 2118 insn->insn_code |= SET_IW_T2X1I3_A3 (reg); 2119 break; 2120 case iw_T3X1_type: 2121 insn->insn_code |= SET_IW_T3X1_A3 (reg); 2122 break; 2123 case iw_T2X3_type: 2124 /* Some instructions using this encoding take 3 register arguments, 2125 requiring the destination register to be the same as the first 2126 source register. */ 2127 if (op->num_args == 3) 2128 { 2129 int dreg = GET_IW_T2X3_A3 (insn->insn_code); 2130 if (dreg != reg) 2131 as_bad ("source and destination registers must be the same"); 2132 } 2133 else 2134 insn->insn_code |= SET_IW_T2X3_A3 (reg); 2135 break; 2136 case iw_T1X1I6_type: 2137 insn->insn_code |= SET_IW_T1X1I6_A3 (reg); 2138 break; 2139 default: 2140 bad_opcode (op); 2141 } 2142 } 2143 2144 /* Source register 2 w/3-bit encoding. */ 2145 static void 2146 nios2_assemble_arg_T (const char *token, nios2_insn_infoS *insn) 2147 { 2148 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2149 int reg = nios2_assemble_reg3 (token); 2150 2151 switch (op->format) 2152 { 2153 case iw_T2I4_type: 2154 insn->insn_code |= SET_IW_T2I4_B3 (reg); 2155 break; 2156 case iw_T3X1_type: 2157 insn->insn_code |= SET_IW_T3X1_B3 (reg); 2158 break; 2159 case iw_T2X3_type: 2160 insn->insn_code |= SET_IW_T2X3_B3 (reg); 2161 break; 2162 default: 2163 bad_opcode (op); 2164 } 2165 } 2166 2167 /* 16-bit signed immediate. */ 2168 static void 2169 nios2_assemble_arg_i (const char *token, nios2_insn_infoS *insn) 2170 { 2171 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2172 unsigned int val; 2173 2174 switch (op->format) 2175 { 2176 case iw_i_type: 2177 val = nios2_assemble_expression (token, insn, 2178 BFD_RELOC_NIOS2_S16, 0); 2179 insn->constant_bits |= SET_IW_I_IMM16 (val); 2180 break; 2181 case iw_F2I16_type: 2182 val = nios2_assemble_expression (token, insn, 2183 BFD_RELOC_NIOS2_S16, 0); 2184 insn->constant_bits |= SET_IW_F2I16_IMM16 (val); 2185 break; 2186 default: 2187 bad_opcode (op); 2188 } 2189 } 2190 2191 /* 12-bit signed immediate. */ 2192 static void 2193 nios2_assemble_arg_I (const char *token, nios2_insn_infoS *insn) 2194 { 2195 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2196 unsigned int val; 2197 2198 switch (op->format) 2199 { 2200 case iw_F2X4I12_type: 2201 val = nios2_assemble_expression (token, insn, 2202 BFD_RELOC_NIOS2_R2_S12, 0); 2203 insn->constant_bits |= SET_IW_F2X4I12_IMM12 (val); 2204 break; 2205 case iw_F1X4I12_type: 2206 val = nios2_assemble_expression (token, insn, 2207 BFD_RELOC_NIOS2_R2_S12, 0); 2208 insn->constant_bits |= SET_IW_F2X4I12_IMM12 (val); 2209 break; 2210 default: 2211 bad_opcode (op); 2212 } 2213 } 2214 2215 /* 16-bit unsigned immediate. */ 2216 static void 2217 nios2_assemble_arg_u (const char *token, nios2_insn_infoS *insn) 2218 { 2219 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2220 unsigned int val; 2221 2222 switch (op->format) 2223 { 2224 case iw_i_type: 2225 val = nios2_assemble_expression (token, insn, 2226 BFD_RELOC_NIOS2_U16, 0); 2227 insn->constant_bits |= SET_IW_I_IMM16 (val); 2228 break; 2229 case iw_F2I16_type: 2230 val = nios2_assemble_expression (token, insn, 2231 BFD_RELOC_NIOS2_U16, 0); 2232 insn->constant_bits |= SET_IW_F2I16_IMM16 (val); 2233 break; 2234 default: 2235 bad_opcode (op); 2236 } 2237 } 2238 2239 /* 7-bit unsigned immediate with 2-bit shift. */ 2240 static void 2241 nios2_assemble_arg_U (const char *token, nios2_insn_infoS *insn) 2242 { 2243 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2244 unsigned int val; 2245 2246 switch (op->format) 2247 { 2248 case iw_T1I7_type: 2249 val = nios2_assemble_expression (token, insn, 2250 BFD_RELOC_NIOS2_R2_T1I7_2, 0); 2251 insn->constant_bits |= SET_IW_T1I7_IMM7 (val >> 2); 2252 break; 2253 case iw_X1I7_type: 2254 val = nios2_assemble_expression (token, insn, 2255 BFD_RELOC_NIOS2_R2_X1I7_2, 0); 2256 insn->constant_bits |= SET_IW_X1I7_IMM7 (val >> 2); 2257 break; 2258 default: 2259 bad_opcode (op); 2260 } 2261 } 2262 2263 /* 5-bit unsigned immediate with 2-bit shift. */ 2264 static void 2265 nios2_assemble_arg_V (const char *token, nios2_insn_infoS *insn) 2266 { 2267 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2268 unsigned int val; 2269 2270 switch (op->format) 2271 { 2272 case iw_F1I5_type: 2273 val = nios2_assemble_expression (token, insn, 2274 BFD_RELOC_NIOS2_R2_F1I5_2, 0); 2275 insn->constant_bits |= SET_IW_F1I5_IMM5 (val >> 2); 2276 break; 2277 default: 2278 bad_opcode (op); 2279 } 2280 } 2281 2282 /* 4-bit unsigned immediate with 2-bit shift. */ 2283 static void 2284 nios2_assemble_arg_W (const char *token, nios2_insn_infoS *insn) 2285 { 2286 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2287 unsigned int val; 2288 2289 switch (op->format) 2290 { 2291 case iw_T2I4_type: 2292 val = nios2_assemble_expression (token, insn, 2293 BFD_RELOC_NIOS2_R2_T2I4_2, 0); 2294 insn->constant_bits |= SET_IW_T2I4_IMM4 (val >> 2); 2295 break; 2296 case iw_L5I4X1_type: 2297 /* This argument is optional for push.n/pop.n, and defaults to 2298 zero if unspecified. */ 2299 if (token == NULL) 2300 return; 2301 2302 val = nios2_assemble_expression (token, insn, 2303 BFD_RELOC_NIOS2_R2_L5I4X1, 0); 2304 insn->constant_bits |= SET_IW_L5I4X1_IMM4 (val >> 2); 2305 break; 2306 default: 2307 bad_opcode (op); 2308 } 2309 } 2310 2311 /* 4-bit unsigned immediate with 1-bit shift. */ 2312 static void 2313 nios2_assemble_arg_X (const char *token, nios2_insn_infoS *insn) 2314 { 2315 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2316 unsigned int val; 2317 2318 switch (op->format) 2319 { 2320 case iw_T2I4_type: 2321 val = nios2_assemble_expression (token, insn, 2322 BFD_RELOC_NIOS2_R2_T2I4_1, 0); 2323 insn->constant_bits |= SET_IW_T2I4_IMM4 (val >> 1); 2324 break; 2325 default: 2326 bad_opcode (op); 2327 } 2328 } 2329 2330 /* 4-bit unsigned immediate without shift. */ 2331 static void 2332 nios2_assemble_arg_Y (const char *token, nios2_insn_infoS *insn) 2333 { 2334 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2335 unsigned int val; 2336 2337 switch (op->format) 2338 { 2339 case iw_T2I4_type: 2340 val = nios2_assemble_expression (token, insn, 2341 BFD_RELOC_NIOS2_R2_T2I4, 0); 2342 insn->constant_bits |= SET_IW_T2I4_IMM4 (val); 2343 break; 2344 default: 2345 bad_opcode (op); 2346 } 2347 } 2348 2349 2350 /* 16-bit signed immediate address offset. */ 2351 static void 2352 nios2_assemble_arg_o (const char *token, nios2_insn_infoS *insn) 2353 { 2354 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2355 unsigned int val; 2356 2357 switch (op->format) 2358 { 2359 case iw_i_type: 2360 val = nios2_assemble_expression (token, insn, 2361 BFD_RELOC_16_PCREL, 1); 2362 insn->constant_bits |= SET_IW_I_IMM16 (val); 2363 break; 2364 case iw_F2I16_type: 2365 val = nios2_assemble_expression (token, insn, 2366 BFD_RELOC_16_PCREL, 1); 2367 insn->constant_bits |= SET_IW_F2I16_IMM16 (val); 2368 break; 2369 default: 2370 bad_opcode (op); 2371 } 2372 } 2373 2374 /* 10-bit signed address offset with 1-bit shift. */ 2375 static void 2376 nios2_assemble_arg_O (const char *token, nios2_insn_infoS *insn) 2377 { 2378 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2379 unsigned int val; 2380 2381 switch (op->format) 2382 { 2383 case iw_I10_type: 2384 val = nios2_assemble_expression (token, insn, 2385 BFD_RELOC_NIOS2_R2_I10_1_PCREL, 1); 2386 insn->constant_bits |= SET_IW_I10_IMM10 (val >> 1); 2387 break; 2388 default: 2389 bad_opcode (op); 2390 } 2391 } 2392 2393 /* 7-bit signed address offset with 1-bit shift. */ 2394 static void 2395 nios2_assemble_arg_P (const char *token, nios2_insn_infoS *insn) 2396 { 2397 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2398 unsigned int val; 2399 2400 switch (op->format) 2401 { 2402 case iw_T1I7_type: 2403 val = nios2_assemble_expression (token, insn, 2404 BFD_RELOC_NIOS2_R2_T1I7_1_PCREL, 1); 2405 insn->constant_bits |= SET_IW_T1I7_IMM7 (val >> 1); 2406 break; 2407 default: 2408 bad_opcode (op); 2409 } 2410 } 2411 2412 /* 5-bit unsigned immediate. */ 2413 static void 2414 nios2_assemble_arg_j (const char *token, nios2_insn_infoS *insn) 2415 { 2416 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2417 unsigned int val; 2418 2419 switch (op->format) 2420 { 2421 case iw_r_type: 2422 val = nios2_assemble_expression (token, insn, 2423 BFD_RELOC_NIOS2_IMM5, 0); 2424 insn->constant_bits |= SET_IW_R_IMM5 (val); 2425 break; 2426 case iw_F3X6L5_type: 2427 if (op->match == MATCH_R2_ENI) 2428 /* Value must be constant 0 or 1. */ 2429 { 2430 val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0); 2431 if (val != 0 && val != 1) 2432 as_bad ("invalid eni argument %u", val); 2433 insn->insn_code |= SET_IW_F3X6L5_IMM5 (val); 2434 } 2435 else 2436 { 2437 val = nios2_assemble_expression (token, insn, 2438 BFD_RELOC_NIOS2_IMM5, 0); 2439 insn->constant_bits |= SET_IW_F3X6L5_IMM5 (val); 2440 } 2441 break; 2442 case iw_F2X6L10_type: 2443 /* Only constant expression without relocation permitted for 2444 bit position. */ 2445 val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0); 2446 if (val > 31) 2447 as_bad ("invalid bit position %u", val); 2448 insn->insn_code |= SET_IW_F2X6L10_MSB (val); 2449 break; 2450 case iw_X2L5_type: 2451 val = nios2_assemble_expression (token, insn, 2452 BFD_RELOC_NIOS2_R2_X2L5, 0); 2453 insn->constant_bits |= SET_IW_X2L5_IMM5 (val); 2454 break; 2455 default: 2456 bad_opcode (op); 2457 } 2458 } 2459 2460 /* Second 5-bit unsigned immediate field. */ 2461 static void 2462 nios2_assemble_arg_k (const char *token, nios2_insn_infoS *insn) 2463 { 2464 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2465 unsigned int val; 2466 2467 switch (op->format) 2468 { 2469 case iw_F2X6L10_type: 2470 /* Only constant expression without relocation permitted for 2471 bit position. */ 2472 val = nios2_assemble_expression (token, insn, 2473 BFD_RELOC_NONE, 0); 2474 if (val > 31) 2475 as_bad ("invalid bit position %u", val); 2476 else if (GET_IW_F2X6L10_MSB (insn->insn_code) < val) 2477 as_bad ("MSB must be greater than or equal to LSB"); 2478 insn->insn_code |= SET_IW_F2X6L10_LSB (val); 2479 break; 2480 default: 2481 bad_opcode (op); 2482 } 2483 } 2484 2485 /* 8-bit unsigned immediate. */ 2486 static void 2487 nios2_assemble_arg_l (const char *token, nios2_insn_infoS *insn) 2488 { 2489 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2490 unsigned int val; 2491 2492 switch (op->format) 2493 { 2494 case iw_custom_type: 2495 val = nios2_assemble_expression (token, insn, 2496 BFD_RELOC_NIOS2_IMM8, 0); 2497 insn->constant_bits |= SET_IW_CUSTOM_N (val); 2498 break; 2499 case iw_F3X8_type: 2500 val = nios2_assemble_expression (token, insn, 2501 BFD_RELOC_NIOS2_IMM8, 0); 2502 insn->constant_bits |= SET_IW_F3X8_N (val); 2503 break; 2504 default: 2505 bad_opcode (op); 2506 } 2507 } 2508 2509 /* 26-bit unsigned immediate. */ 2510 static void 2511 nios2_assemble_arg_m (const char *token, nios2_insn_infoS *insn) 2512 { 2513 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2514 unsigned int val; 2515 2516 switch (op->format) 2517 { 2518 case iw_j_type: 2519 val = nios2_assemble_expression (token, insn, 2520 (nios2_as_options.noat 2521 ? BFD_RELOC_NIOS2_CALL26_NOAT 2522 : BFD_RELOC_NIOS2_CALL26), 2523 0); 2524 insn->constant_bits |= SET_IW_J_IMM26 (val); 2525 break; 2526 case iw_L26_type: 2527 val = nios2_assemble_expression (token, insn, 2528 (nios2_as_options.noat 2529 ? BFD_RELOC_NIOS2_CALL26_NOAT 2530 : BFD_RELOC_NIOS2_CALL26), 2531 0); 2532 insn->constant_bits |= SET_IW_L26_IMM26 (val); 2533 break; 2534 default: 2535 bad_opcode (op); 2536 } 2537 } 2538 2539 /* 6-bit unsigned immediate with no shifting. */ 2540 static void 2541 nios2_assemble_arg_M (const char *token, nios2_insn_infoS *insn) 2542 { 2543 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2544 unsigned int val; 2545 2546 switch (op->format) 2547 { 2548 case iw_T1X1I6_type: 2549 val = nios2_assemble_expression (token, insn, 2550 BFD_RELOC_NIOS2_R2_T1X1I6, 0); 2551 insn->constant_bits |= SET_IW_T1X1I6_IMM6 (val); 2552 break; 2553 default: 2554 bad_opcode (op); 2555 } 2556 } 2557 2558 /* 6-bit unsigned immediate with 2-bit shift. */ 2559 static void 2560 nios2_assemble_arg_N (const char *token, nios2_insn_infoS *insn) 2561 { 2562 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2563 unsigned int val; 2564 2565 switch (op->format) 2566 { 2567 case iw_T1X1I6_type: 2568 val = nios2_assemble_expression (token, insn, 2569 BFD_RELOC_NIOS2_R2_T1X1I6_2, 0); 2570 insn->constant_bits |= SET_IW_T1X1I6_IMM6 (val >> 2); 2571 break; 2572 default: 2573 bad_opcode (op); 2574 } 2575 } 2576 2577 2578 /* Encoded enumeration for addi.n/subi.n. */ 2579 static void 2580 nios2_assemble_arg_e (const char *token, nios2_insn_infoS *insn) 2581 { 2582 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2583 unsigned int val; 2584 int i; 2585 2586 switch (op->format) 2587 { 2588 case iw_T2X1I3_type: 2589 val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0); 2590 for (i = 0; i < nios2_num_r2_asi_n_mappings; i++) 2591 if (val == nios2_r2_asi_n_mappings[i]) 2592 break; 2593 if (i == nios2_num_r2_asi_n_mappings) 2594 { 2595 as_bad (_("Invalid constant operand %s"), token); 2596 return; 2597 } 2598 insn->insn_code |= SET_IW_T2X1I3_IMM3 ((unsigned)i); 2599 break; 2600 default: 2601 bad_opcode (op); 2602 } 2603 } 2604 2605 /* Encoded enumeration for slli.n/srli.n. */ 2606 static void 2607 nios2_assemble_arg_f (const char *token, nios2_insn_infoS *insn) 2608 { 2609 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2610 unsigned int val; 2611 int i; 2612 2613 switch (op->format) 2614 { 2615 case iw_T2X1L3_type: 2616 val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0); 2617 for (i = 0; i < nios2_num_r2_shi_n_mappings; i++) 2618 if (val == nios2_r2_shi_n_mappings[i]) 2619 break; 2620 if (i == nios2_num_r2_shi_n_mappings) 2621 { 2622 as_bad (_("Invalid constant operand %s"), token); 2623 return; 2624 } 2625 insn->insn_code |= SET_IW_T2X1L3_SHAMT ((unsigned)i); 2626 break; 2627 default: 2628 bad_opcode (op); 2629 } 2630 } 2631 2632 /* Encoded enumeration for andi.n. */ 2633 static void 2634 nios2_assemble_arg_g (const char *token, nios2_insn_infoS *insn) 2635 { 2636 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2637 unsigned int val; 2638 int i; 2639 2640 switch (op->format) 2641 { 2642 case iw_T2I4_type: 2643 val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0); 2644 for (i = 0; i < nios2_num_r2_andi_n_mappings; i++) 2645 if (val == nios2_r2_andi_n_mappings[i]) 2646 break; 2647 if (i == nios2_num_r2_andi_n_mappings) 2648 { 2649 as_bad (_("Invalid constant operand %s"), token); 2650 return; 2651 } 2652 insn->insn_code |= SET_IW_T2I4_IMM4 ((unsigned)i); 2653 break; 2654 default: 2655 bad_opcode (op); 2656 } 2657 } 2658 2659 /* Encoded enumeration for movi.n. */ 2660 static void 2661 nios2_assemble_arg_h (const char *token, nios2_insn_infoS *insn) 2662 { 2663 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2664 unsigned int val; 2665 int i; 2666 2667 switch (op->format) 2668 { 2669 case iw_T1I7_type: 2670 val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0); 2671 i = (signed) val; 2672 if ((signed) i == -1) 2673 val = 127; 2674 else if (i == -2) 2675 val = 126; 2676 else if (i == 0xff) 2677 val = 125; 2678 else if (i < 0 || i > 125) 2679 { 2680 as_bad (_("Invalid constant operand %s"), token); 2681 return; 2682 } 2683 insn->insn_code |= SET_IW_T1I7_IMM7 (val); 2684 break; 2685 default: 2686 bad_opcode (op); 2687 } 2688 } 2689 2690 /* Encoded REGMASK for ldwm/stwm or push.n/pop.n. */ 2691 static void 2692 nios2_assemble_arg_R (const char *token, nios2_insn_infoS *insn) 2693 { 2694 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2695 unsigned long mask; 2696 char *buf = strdup (token); 2697 unsigned long reglist = nios2_parse_reglist (buf, op); 2698 free (buf); 2699 2700 if (reglist == 0) 2701 return; 2702 2703 switch (op->format) 2704 { 2705 case iw_F1X4L17_type: 2706 /* Encoding for ldwm/stwm. */ 2707 if (reglist & 0x00003ffc) 2708 mask = reglist >> 2; 2709 else 2710 { 2711 insn->insn_code |= SET_IW_F1X4L17_RS (1); 2712 mask = (reglist & 0x00ffc000) >> 14; 2713 if (reglist & (1 << 28)) 2714 mask |= 1 << 10; 2715 if (reglist & (1 << 31)) 2716 mask |= 1 << 11; 2717 } 2718 insn->insn_code |= SET_IW_F1X4L17_REGMASK (mask); 2719 break; 2720 2721 case iw_L5I4X1_type: 2722 /* Encoding for push.n/pop.n. */ 2723 if (reglist & (1 << 28)) 2724 insn->insn_code |= SET_IW_L5I4X1_FP (1); 2725 mask = reglist & 0x00ff0000; 2726 if (mask) 2727 { 2728 int i; 2729 2730 for (i = 0; i < nios2_num_r2_reg_range_mappings; i++) 2731 if (nios2_r2_reg_range_mappings[i] == mask) 2732 break; 2733 if (i == nios2_num_r2_reg_range_mappings) 2734 { 2735 as_bad ("invalid reglist"); 2736 return; 2737 } 2738 insn->insn_code |= SET_IW_L5I4X1_REGRANGE (i); 2739 insn->insn_code |= SET_IW_L5I4X1_CS (1); 2740 } 2741 break; 2742 2743 default: 2744 bad_opcode (op); 2745 } 2746 } 2747 2748 /* Base register for ldwm/stwm. */ 2749 static void 2750 nios2_assemble_arg_B (const char *token, nios2_insn_infoS *insn) 2751 { 2752 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2753 int direction, writeback, ret; 2754 char *str = strdup (token); 2755 struct nios2_reg *reg 2756 = nios2_parse_base_register (str, &direction, &writeback, &ret); 2757 2758 free (str); 2759 if (!reg) 2760 return; 2761 2762 switch (op->format) 2763 { 2764 case iw_F1X4L17_type: 2765 /* For ldwm, check to see if the base register is already inside the 2766 register list. */ 2767 if (op->match == MATCH_R2_LDWM 2768 && (nios2_reglist_mask & (1 << reg->index))) 2769 { 2770 as_bad ("invalid base register; %s is inside the reglist", reg->name); 2771 return; 2772 } 2773 2774 /* For stwm, ret option is not allowed. */ 2775 if (op->match == MATCH_R2_STWM && ret) 2776 { 2777 as_bad ("invalid option syntax"); 2778 return; 2779 } 2780 2781 /* Check that the direction matches the ordering of the reglist. */ 2782 if (nios2_reglist_dir && direction != nios2_reglist_dir) 2783 { 2784 as_bad ("reglist order does not match increment/decrement mode"); 2785 return; 2786 } 2787 2788 insn->insn_code |= SET_IW_F1X4L17_A (reg->index); 2789 if (direction > 0) 2790 insn->insn_code |= SET_IW_F1X4L17_ID (1); 2791 if (writeback) 2792 insn->insn_code |= SET_IW_F1X4L17_WB (1); 2793 if (ret) 2794 insn->insn_code |= SET_IW_F1X4L17_PC (1); 2795 break; 2796 2797 default: 2798 bad_opcode (op); 2799 } 2800 } 2801 2802 static void 2803 nios2_assemble_args (nios2_insn_infoS *insn) 2804 { 2805 const struct nios2_opcode *op = insn->insn_nios2_opcode; 2806 const char *argptr; 2807 unsigned int tokidx, ntok; 2808 2809 /* Make sure there are enough arguments. */ 2810 ntok = (op->pinfo & NIOS2_INSN_OPTARG) ? op->num_args - 1 : op->num_args; 2811 for (tokidx = 1; tokidx <= ntok; tokidx++) 2812 if (insn->insn_tokens[tokidx] == NULL) 2813 { 2814 as_bad ("missing argument"); 2815 return; 2816 } 2817 2818 for (argptr = op->args, tokidx = 1; 2819 *argptr && insn->insn_tokens[tokidx]; 2820 argptr++) 2821 switch (*argptr) 2822 { 2823 case ',': 2824 case '(': 2825 case ')': 2826 break; 2827 2828 case 'c': 2829 nios2_assemble_arg_c (insn->insn_tokens[tokidx++], insn); 2830 break; 2831 2832 case 'd': 2833 nios2_assemble_arg_d (insn->insn_tokens[tokidx++], insn); 2834 break; 2835 2836 case 's': 2837 nios2_assemble_arg_s (insn->insn_tokens[tokidx++], insn); 2838 break; 2839 2840 case 't': 2841 nios2_assemble_arg_t (insn->insn_tokens[tokidx++], insn); 2842 break; 2843 2844 case 'D': 2845 nios2_assemble_arg_D (insn->insn_tokens[tokidx++], insn); 2846 break; 2847 2848 case 'S': 2849 nios2_assemble_arg_S (insn->insn_tokens[tokidx++], insn); 2850 break; 2851 2852 case 'T': 2853 nios2_assemble_arg_T (insn->insn_tokens[tokidx++], insn); 2854 break; 2855 2856 case 'i': 2857 nios2_assemble_arg_i (insn->insn_tokens[tokidx++], insn); 2858 break; 2859 2860 case 'I': 2861 nios2_assemble_arg_I (insn->insn_tokens[tokidx++], insn); 2862 break; 2863 2864 case 'u': 2865 nios2_assemble_arg_u (insn->insn_tokens[tokidx++], insn); 2866 break; 2867 2868 case 'U': 2869 nios2_assemble_arg_U (insn->insn_tokens[tokidx++], insn); 2870 break; 2871 2872 case 'V': 2873 nios2_assemble_arg_V (insn->insn_tokens[tokidx++], insn); 2874 break; 2875 2876 case 'W': 2877 nios2_assemble_arg_W (insn->insn_tokens[tokidx++], insn); 2878 break; 2879 2880 case 'X': 2881 nios2_assemble_arg_X (insn->insn_tokens[tokidx++], insn); 2882 break; 2883 2884 case 'Y': 2885 nios2_assemble_arg_Y (insn->insn_tokens[tokidx++], insn); 2886 break; 2887 2888 case 'o': 2889 nios2_assemble_arg_o (insn->insn_tokens[tokidx++], insn); 2890 break; 2891 2892 case 'O': 2893 nios2_assemble_arg_O (insn->insn_tokens[tokidx++], insn); 2894 break; 2895 2896 case 'P': 2897 nios2_assemble_arg_P (insn->insn_tokens[tokidx++], insn); 2898 break; 2899 2900 case 'j': 2901 nios2_assemble_arg_j (insn->insn_tokens[tokidx++], insn); 2902 break; 2903 2904 case 'k': 2905 nios2_assemble_arg_k (insn->insn_tokens[tokidx++], insn); 2906 break; 2907 2908 case 'l': 2909 nios2_assemble_arg_l (insn->insn_tokens[tokidx++], insn); 2910 break; 2911 2912 case 'm': 2913 nios2_assemble_arg_m (insn->insn_tokens[tokidx++], insn); 2914 break; 2915 2916 case 'M': 2917 nios2_assemble_arg_M (insn->insn_tokens[tokidx++], insn); 2918 break; 2919 2920 case 'N': 2921 nios2_assemble_arg_N (insn->insn_tokens[tokidx++], insn); 2922 break; 2923 2924 case 'e': 2925 nios2_assemble_arg_e (insn->insn_tokens[tokidx++], insn); 2926 break; 2927 2928 case 'f': 2929 nios2_assemble_arg_f (insn->insn_tokens[tokidx++], insn); 2930 break; 2931 2932 case 'g': 2933 nios2_assemble_arg_g (insn->insn_tokens[tokidx++], insn); 2934 break; 2935 2936 case 'h': 2937 nios2_assemble_arg_h (insn->insn_tokens[tokidx++], insn); 2938 break; 2939 2940 case 'R': 2941 nios2_assemble_arg_R (insn->insn_tokens[tokidx++], insn); 2942 break; 2943 2944 case 'B': 2945 nios2_assemble_arg_B (insn->insn_tokens[tokidx++], insn); 2946 break; 2947 2948 default: 2949 bad_opcode (op); 2950 break; 2951 } 2952 2953 /* Perform argument checking. */ 2954 nios2_check_assembly (insn->insn_code | insn->constant_bits, 2955 insn->insn_tokens[tokidx]); 2956 } 2957 2958 2959 /* The function consume_arg takes a pointer into a string 2960 of instruction tokens (args) and a pointer into a string 2961 representing the expected sequence of tokens and separators. 2962 It checks whether the first argument in argstr is of the 2963 expected type, throwing an error if it is not, and returns 2964 the pointer argstr. */ 2965 static char * 2966 nios2_consume_arg (char *argstr, const char *parsestr) 2967 { 2968 char *temp; 2969 2970 switch (*parsestr) 2971 { 2972 case 'c': 2973 case 'd': 2974 case 's': 2975 case 't': 2976 case 'D': 2977 case 'S': 2978 case 'T': 2979 break; 2980 2981 case 'i': 2982 case 'u': 2983 if (*argstr == '%') 2984 { 2985 if (nios2_special_relocation_p (argstr)) 2986 { 2987 /* We zap the parentheses because we don't want them confused 2988 with separators. */ 2989 temp = strchr (argstr, '('); 2990 if (temp != NULL) 2991 *temp = ' '; 2992 temp = strchr (argstr, ')'); 2993 if (temp != NULL) 2994 *temp = ' '; 2995 } 2996 else 2997 as_bad (_("badly formed expression near %s"), argstr); 2998 } 2999 break; 3000 case 'm': 3001 case 'j': 3002 case 'k': 3003 case 'l': 3004 case 'I': 3005 case 'U': 3006 case 'V': 3007 case 'W': 3008 case 'X': 3009 case 'Y': 3010 case 'O': 3011 case 'P': 3012 case 'e': 3013 case 'f': 3014 case 'g': 3015 case 'h': 3016 case 'M': 3017 case 'N': 3018 3019 /* We can't have %hi, %lo or %hiadj here. */ 3020 if (*argstr == '%') 3021 as_bad (_("badly formed expression near %s"), argstr); 3022 break; 3023 3024 case 'R': 3025 /* Register list for ldwm/stwm or push.n/pop.n. Replace the commas 3026 in the list with spaces so we don't confuse them with separators. */ 3027 if (*argstr != '{') 3028 { 3029 as_bad ("missing '{' in register list"); 3030 break; 3031 } 3032 for (temp = argstr + 1; *temp; temp++) 3033 { 3034 if (*temp == '}') 3035 break; 3036 else if (*temp == ',') 3037 *temp = ' '; 3038 } 3039 if (!*temp) 3040 { 3041 as_bad ("missing '}' in register list"); 3042 break; 3043 } 3044 break; 3045 3046 case 'B': 3047 /* Base register and options for ldwm/stwm. This is the final argument 3048 and consumes the rest of the argument string; replace commas 3049 with spaces so that the token splitter doesn't think they are 3050 separate arguments. */ 3051 for (temp = argstr; *temp; temp++) 3052 if (*temp == ',') 3053 *temp = ' '; 3054 break; 3055 3056 case 'o': 3057 case 'E': 3058 break; 3059 default: 3060 BAD_CASE (*parsestr); 3061 break; 3062 } 3063 3064 return argstr; 3065 } 3066 3067 /* The function consume_separator takes a pointer into a string 3068 of instruction tokens (args) and a pointer into a string representing 3069 the expected sequence of tokens and separators. It finds the first 3070 instance of the character pointed to by separator in argstr, and 3071 returns a pointer to the next element of argstr, which is the 3072 following token in the sequence. */ 3073 static char * 3074 nios2_consume_separator (char *argstr, const char *separator) 3075 { 3076 char *p; 3077 3078 /* If we have a opcode reg, expr(reg) type instruction, and 3079 * we are separating the expr from the (reg), we find the last 3080 * (, just in case the expression has parentheses. */ 3081 3082 if (*separator == '(') 3083 p = strrchr (argstr, *separator); 3084 else 3085 p = strchr (argstr, *separator); 3086 3087 if (p != NULL) 3088 *p++ = 0; 3089 return p; 3090 } 3091 3092 /* The principal argument parsing function which takes a string argstr 3093 representing the instruction arguments for insn, and extracts the argument 3094 tokens matching parsestr into parsed_args. */ 3095 static void 3096 nios2_parse_args (nios2_insn_infoS *insn, char *argstr, 3097 const char *parsestr, char **parsed_args) 3098 { 3099 char *p; 3100 char *end = NULL; 3101 int i; 3102 p = argstr; 3103 i = 0; 3104 bfd_boolean terminate = FALSE; 3105 3106 /* This rest of this function is it too fragile and it mostly works, 3107 therefore special case this one. */ 3108 if (*parsestr == 0 && argstr != 0) 3109 { 3110 as_bad (_("too many arguments")); 3111 parsed_args[0] = NULL; 3112 return; 3113 } 3114 3115 while (p != NULL && !terminate && i < NIOS2_MAX_INSN_TOKENS) 3116 { 3117 parsed_args[i] = nios2_consume_arg (p, parsestr); 3118 ++parsestr; 3119 while (*parsestr == '(' || *parsestr == ')' || *parsestr == ',') 3120 { 3121 char *context = p; 3122 p = nios2_consume_separator (p, parsestr); 3123 /* Check for missing separators. */ 3124 if (!p && !(insn->insn_nios2_opcode->pinfo & NIOS2_INSN_OPTARG)) 3125 { 3126 as_bad (_("expecting %c near %s"), *parsestr, context); 3127 break; 3128 } 3129 ++parsestr; 3130 } 3131 3132 if (*parsestr == '\0') 3133 { 3134 /* Check that the argument string has no trailing arguments. */ 3135 end = strpbrk (p, ","); 3136 if (end != NULL) 3137 as_bad (_("too many arguments")); 3138 } 3139 3140 if (*parsestr == '\0' || (p != NULL && *p == '\0')) 3141 terminate = TRUE; 3142 ++i; 3143 } 3144 3145 parsed_args[i] = NULL; 3146 } 3147 3148 3149 3150 /** Support for pseudo-op parsing. These are macro-like opcodes that 3151 expand into real insns by suitable fiddling with the operands. */ 3152 3153 /* Append the string modifier to the string contained in the argument at 3154 parsed_args[ndx]. */ 3155 static void 3156 nios2_modify_arg (char **parsed_args, const char *modifier, 3157 int unused ATTRIBUTE_UNUSED, int ndx) 3158 { 3159 char *tmp = parsed_args[ndx]; 3160 3161 parsed_args[ndx] = concat (tmp, modifier, (char *) NULL); 3162 } 3163 3164 /* Modify parsed_args[ndx] by negating that argument. */ 3165 static void 3166 nios2_negate_arg (char **parsed_args, const char *modifier ATTRIBUTE_UNUSED, 3167 int unused ATTRIBUTE_UNUSED, int ndx) 3168 { 3169 char *tmp = parsed_args[ndx]; 3170 3171 parsed_args[ndx] = concat ("~(", tmp, ")+1", (char *) NULL); 3172 } 3173 3174 /* The function nios2_swap_args swaps the pointers at indices index_1 and 3175 index_2 in the array parsed_args[] - this is used for operand swapping 3176 for comparison operations. */ 3177 static void 3178 nios2_swap_args (char **parsed_args, const char *unused ATTRIBUTE_UNUSED, 3179 int index_1, int index_2) 3180 { 3181 char *tmp; 3182 gas_assert (index_1 < NIOS2_MAX_INSN_TOKENS 3183 && index_2 < NIOS2_MAX_INSN_TOKENS); 3184 tmp = parsed_args[index_1]; 3185 parsed_args[index_1] = parsed_args[index_2]; 3186 parsed_args[index_2] = tmp; 3187 } 3188 3189 /* This function appends the string appnd to the array of strings in 3190 parsed_args num times starting at index start in the array. */ 3191 static void 3192 nios2_append_arg (char **parsed_args, const char *appnd, int num, 3193 int start) 3194 { 3195 int i, count; 3196 char *tmp; 3197 3198 gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS); 3199 3200 if (nios2_mode == NIOS2_MODE_TEST) 3201 tmp = parsed_args[start]; 3202 else 3203 tmp = NULL; 3204 3205 for (i = start, count = num; count > 0; ++i, --count) 3206 parsed_args[i] = (char *) appnd; 3207 3208 gas_assert (i == (start + num)); 3209 parsed_args[i] = tmp; 3210 parsed_args[i + 1] = NULL; 3211 } 3212 3213 /* This function inserts the string insert num times in the array 3214 parsed_args, starting at the index start. */ 3215 static void 3216 nios2_insert_arg (char **parsed_args, const char *insert, int num, 3217 int start) 3218 { 3219 int i, count; 3220 3221 gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS); 3222 3223 /* Move the existing arguments up to create space. */ 3224 for (i = NIOS2_MAX_INSN_TOKENS; i - num >= start; --i) 3225 parsed_args[i] = parsed_args[i - num]; 3226 3227 for (i = start, count = num; count > 0; ++i, --count) 3228 parsed_args[i] = (char *) insert; 3229 } 3230 3231 /* Cleanup function to free malloc'ed arg strings. */ 3232 static void 3233 nios2_free_arg (char **parsed_args, int num ATTRIBUTE_UNUSED, int start) 3234 { 3235 if (parsed_args[start]) 3236 { 3237 free (parsed_args[start]); 3238 parsed_args[start] = NULL; 3239 } 3240 } 3241 3242 /* This function swaps the pseudo-op for a real op. */ 3243 static nios2_ps_insn_infoS* 3244 nios2_translate_pseudo_insn (nios2_insn_infoS *insn) 3245 { 3246 3247 const struct nios2_opcode *op = insn->insn_nios2_opcode; 3248 nios2_ps_insn_infoS *ps_insn; 3249 unsigned int tokidx, ntok; 3250 3251 /* Find which real insn the pseudo-op translates to and 3252 switch the insn_info ptr to point to it. */ 3253 ps_insn = nios2_ps_lookup (op->name); 3254 3255 if (ps_insn != NULL) 3256 { 3257 insn->insn_nios2_opcode = nios2_opcode_lookup (ps_insn->insn); 3258 insn->insn_tokens[0] = insn->insn_nios2_opcode->name; 3259 3260 /* Make sure there are enough arguments. */ 3261 ntok = ((op->pinfo & NIOS2_INSN_OPTARG) 3262 ? op->num_args - 1 : op->num_args); 3263 for (tokidx = 1; tokidx <= ntok; tokidx++) 3264 if (insn->insn_tokens[tokidx] == NULL) 3265 { 3266 as_bad ("missing argument"); 3267 return NULL; 3268 } 3269 3270 /* Modify the args so they work with the real insn. */ 3271 ps_insn->arg_modifer_func ((char **) insn->insn_tokens, 3272 ps_insn->arg_modifier, ps_insn->num, 3273 ps_insn->index); 3274 } 3275 else 3276 /* we cannot recover from this. */ 3277 as_fatal (_("unrecognized pseudo-instruction %s"), 3278 insn->insn_nios2_opcode->name); 3279 return ps_insn; 3280 } 3281 3282 /* Invoke the cleanup handler for pseudo-insn ps_insn on insn. */ 3283 static void 3284 nios2_cleanup_pseudo_insn (nios2_insn_infoS *insn, 3285 nios2_ps_insn_infoS *ps_insn) 3286 { 3287 if (ps_insn->arg_cleanup_func) 3288 (ps_insn->arg_cleanup_func) ((char **) insn->insn_tokens, 3289 ps_insn->num, ps_insn->index); 3290 } 3291 3292 const nios2_ps_insn_infoS nios2_ps_insn_info_structs[] = { 3293 /* pseudo-op, real-op, arg, arg_modifier_func, num, index, arg_cleanup_func */ 3294 {"mov", "add", nios2_append_arg, "zero", 1, 3, NULL}, 3295 {"movi", "addi", nios2_insert_arg, "zero", 1, 2, NULL}, 3296 {"movhi", "orhi", nios2_insert_arg, "zero", 1, 2, NULL}, 3297 {"movui", "ori", nios2_insert_arg, "zero", 1, 2, NULL}, 3298 {"movia", "orhi", nios2_insert_arg, "zero", 1, 2, NULL}, 3299 {"nop", "add", nios2_append_arg, "zero", 3, 1, NULL}, 3300 {"bgt", "blt", nios2_swap_args, "", 1, 2, NULL}, 3301 {"bgtu", "bltu", nios2_swap_args, "", 1, 2, NULL}, 3302 {"ble", "bge", nios2_swap_args, "", 1, 2, NULL}, 3303 {"bleu", "bgeu", nios2_swap_args, "", 1, 2, NULL}, 3304 {"cmpgt", "cmplt", nios2_swap_args, "", 2, 3, NULL}, 3305 {"cmpgtu", "cmpltu", nios2_swap_args, "", 2, 3, NULL}, 3306 {"cmple", "cmpge", nios2_swap_args, "", 2, 3, NULL}, 3307 {"cmpleu", "cmpgeu", nios2_swap_args, "", 2, 3, NULL}, 3308 {"cmpgti", "cmpgei", nios2_modify_arg, "+1", 0, 3, nios2_free_arg}, 3309 {"cmpgtui", "cmpgeui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg}, 3310 {"cmplei", "cmplti", nios2_modify_arg, "+1", 0, 3, nios2_free_arg}, 3311 {"cmpleui", "cmpltui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg}, 3312 {"subi", "addi", nios2_negate_arg, "", 0, 3, nios2_free_arg}, 3313 {"nop.n", "mov.n", nios2_append_arg, "zero", 2, 1, NULL} 3314 /* Add further pseudo-ops here. */ 3315 }; 3316 3317 #define NIOS2_NUM_PSEUDO_INSNS \ 3318 ((sizeof(nios2_ps_insn_info_structs)/ \ 3319 sizeof(nios2_ps_insn_info_structs[0]))) 3320 const int nios2_num_ps_insn_info_structs = NIOS2_NUM_PSEUDO_INSNS; 3321 3322 3323 /** Assembler output support. */ 3324 3325 /* Output a normal instruction. */ 3326 static void 3327 output_insn (nios2_insn_infoS *insn) 3328 { 3329 char *f; 3330 nios2_insn_relocS *reloc; 3331 f = frag_more (insn->insn_nios2_opcode->size); 3332 /* This allocates enough space for the instruction 3333 and puts it in the current frag. */ 3334 md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size); 3335 /* Emit debug info. */ 3336 dwarf2_emit_insn (insn->insn_nios2_opcode->size); 3337 /* Create any fixups to be acted on later. */ 3338 3339 for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next) 3340 fix_new_exp (frag_now, f - frag_now->fr_literal, 3341 insn->insn_nios2_opcode->size, 3342 &reloc->reloc_expression, reloc->reloc_pcrel, 3343 reloc->reloc_type); 3344 } 3345 3346 /* Output an unconditional branch. */ 3347 static void 3348 output_ubranch (nios2_insn_infoS *insn) 3349 { 3350 nios2_insn_relocS *reloc = insn->insn_reloc; 3351 3352 /* If the reloc is NULL, there was an error assembling the branch. */ 3353 if (reloc != NULL) 3354 { 3355 symbolS *symp = reloc->reloc_expression.X_add_symbol; 3356 offsetT offset = reloc->reloc_expression.X_add_number; 3357 char *f; 3358 bfd_boolean is_cdx = (insn->insn_nios2_opcode->size == 2); 3359 3360 /* Tag dwarf2 debug info to the address at the start of the insn. 3361 We must do it before frag_var() below closes off the frag. */ 3362 dwarf2_emit_insn (0); 3363 3364 /* We create a machine dependent frag which can grow 3365 to accommodate the largest possible instruction sequence 3366 this may generate. */ 3367 f = frag_var (rs_machine_dependent, 3368 UBRANCH_MAX_SIZE, insn->insn_nios2_opcode->size, 3369 (is_cdx ? CDX_UBRANCH_SUBTYPE (0) : UBRANCH_SUBTYPE (0)), 3370 symp, offset, NULL); 3371 3372 md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size); 3373 3374 /* We leave fixup generation to md_convert_frag. */ 3375 } 3376 } 3377 3378 /* Output a conditional branch. */ 3379 static void 3380 output_cbranch (nios2_insn_infoS *insn) 3381 { 3382 nios2_insn_relocS *reloc = insn->insn_reloc; 3383 3384 /* If the reloc is NULL, there was an error assembling the branch. */ 3385 if (reloc != NULL) 3386 { 3387 symbolS *symp = reloc->reloc_expression.X_add_symbol; 3388 offsetT offset = reloc->reloc_expression.X_add_number; 3389 char *f; 3390 bfd_boolean is_cdx = (insn->insn_nios2_opcode->size == 2); 3391 3392 /* Tag dwarf2 debug info to the address at the start of the insn. 3393 We must do it before frag_var() below closes off the frag. */ 3394 dwarf2_emit_insn (0); 3395 3396 /* We create a machine dependent frag which can grow 3397 to accommodate the largest possible instruction sequence 3398 this may generate. */ 3399 f = frag_var (rs_machine_dependent, 3400 CBRANCH_MAX_SIZE, insn->insn_nios2_opcode->size, 3401 (is_cdx ? CDX_CBRANCH_SUBTYPE (0) : CBRANCH_SUBTYPE (0)), 3402 symp, offset, NULL); 3403 3404 md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size); 3405 3406 /* We leave fixup generation to md_convert_frag. */ 3407 } 3408 } 3409 3410 /* Output a call sequence. Since calls are not pc-relative for NIOS2, 3411 but are page-relative, we cannot tell at any stage in assembly 3412 whether a call will be out of range since a section may be linked 3413 at any address. So if we are relaxing, we convert all call instructions 3414 to long call sequences, and rely on the linker to relax them back to 3415 short calls. */ 3416 static void 3417 output_call (nios2_insn_infoS *insn) 3418 { 3419 /* This allocates enough space for the instruction 3420 and puts it in the current frag. */ 3421 char *f = frag_more (12); 3422 nios2_insn_relocS *reloc = insn->insn_reloc; 3423 const struct nios2_opcode *op = insn->insn_nios2_opcode; 3424 3425 switch (op->format) 3426 { 3427 case iw_j_type: 3428 md_number_to_chars (f, 3429 (MATCH_R1_ORHI | SET_IW_I_B (AT_REGNUM) 3430 | SET_IW_I_A (0)), 3431 4); 3432 dwarf2_emit_insn (4); 3433 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, 3434 &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_HI16); 3435 md_number_to_chars (f + 4, 3436 (MATCH_R1_ORI | SET_IW_I_B (AT_REGNUM) 3437 | SET_IW_I_A (AT_REGNUM)), 3438 4); 3439 dwarf2_emit_insn (4); 3440 fix_new_exp (frag_now, f - frag_now->fr_literal + 4, 4, 3441 &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_LO16); 3442 md_number_to_chars (f + 8, MATCH_R1_CALLR | SET_IW_R_A (AT_REGNUM), 4); 3443 dwarf2_emit_insn (4); 3444 break; 3445 case iw_L26_type: 3446 md_number_to_chars (f, 3447 (MATCH_R2_ORHI | SET_IW_F2I16_B (AT_REGNUM) 3448 | SET_IW_F2I16_A (0)), 3449 4); 3450 dwarf2_emit_insn (4); 3451 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, 3452 &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_HI16); 3453 md_number_to_chars (f + 4, 3454 (MATCH_R2_ORI | SET_IW_F2I16_B (AT_REGNUM) 3455 | SET_IW_F2I16_A (AT_REGNUM)), 3456 4); 3457 dwarf2_emit_insn (4); 3458 fix_new_exp (frag_now, f - frag_now->fr_literal + 4, 4, 3459 &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_LO16); 3460 md_number_to_chars (f + 8, MATCH_R2_CALLR | SET_IW_F3X6L5_A (AT_REGNUM), 3461 4); 3462 dwarf2_emit_insn (4); 3463 break; 3464 default: 3465 bad_opcode (op); 3466 } 3467 } 3468 3469 /* Output a movhi/addi pair for the movia pseudo-op. */ 3470 static void 3471 output_movia (nios2_insn_infoS *insn) 3472 { 3473 /* This allocates enough space for the instruction 3474 and puts it in the current frag. */ 3475 char *f = frag_more (8); 3476 nios2_insn_relocS *reloc = insn->insn_reloc; 3477 unsigned long reg, code = 0; 3478 const struct nios2_opcode *op = insn->insn_nios2_opcode; 3479 3480 /* If the reloc is NULL, there was an error assembling the movia. */ 3481 if (reloc != NULL) 3482 { 3483 switch (op->format) 3484 { 3485 case iw_i_type: 3486 reg = GET_IW_I_B (insn->insn_code); 3487 code = MATCH_R1_ADDI | SET_IW_I_A (reg) | SET_IW_I_B (reg); 3488 break; 3489 case iw_F2I16_type: 3490 reg = GET_IW_F2I16_B (insn->insn_code); 3491 code = MATCH_R2_ADDI | SET_IW_F2I16_A (reg) | SET_IW_F2I16_B (reg); 3492 break; 3493 default: 3494 bad_opcode (op); 3495 } 3496 3497 md_number_to_chars (f, insn->insn_code, 4); 3498 dwarf2_emit_insn (4); 3499 fix_new (frag_now, f - frag_now->fr_literal, 4, 3500 reloc->reloc_expression.X_add_symbol, 3501 reloc->reloc_expression.X_add_number, 0, 3502 BFD_RELOC_NIOS2_HIADJ16); 3503 md_number_to_chars (f + 4, code, 4); 3504 dwarf2_emit_insn (4); 3505 fix_new (frag_now, f + 4 - frag_now->fr_literal, 4, 3506 reloc->reloc_expression.X_add_symbol, 3507 reloc->reloc_expression.X_add_number, 0, BFD_RELOC_NIOS2_LO16); 3508 } 3509 } 3510 3511 3512 3513 /** External interfaces. */ 3514 3515 /* Update the selected architecture based on ARCH, giving an error if 3516 ARCH is an invalid value. */ 3517 3518 static void 3519 nios2_use_arch (const char *arch) 3520 { 3521 if (strcmp (arch, "nios2") == 0 || strcmp (arch, "r1") == 0) 3522 { 3523 nios2_architecture |= EF_NIOS2_ARCH_R1; 3524 nios2_opcodes = (struct nios2_opcode *) nios2_r1_opcodes; 3525 nios2_num_opcodes = nios2_num_r1_opcodes; 3526 nop32 = nop_r1; 3527 nop16 = NULL; 3528 return; 3529 } 3530 else if (strcmp (arch, "r2") == 0) 3531 { 3532 nios2_architecture |= EF_NIOS2_ARCH_R2; 3533 nios2_opcodes = (struct nios2_opcode *) nios2_r2_opcodes; 3534 nios2_num_opcodes = nios2_num_r2_opcodes; 3535 nop32 = nop_r2; 3536 nop16 = nop_r2_cdx; 3537 return; 3538 } 3539 3540 as_bad (_("unknown architecture '%s'"), arch); 3541 } 3542 3543 /* The following functions are called by machine-independent parts of 3544 the assembler. */ 3545 int 3546 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED) 3547 { 3548 switch (c) 3549 { 3550 case 'r': 3551 /* Hidden option for self-test mode. */ 3552 nios2_mode = NIOS2_MODE_TEST; 3553 break; 3554 case OPTION_RELAX_ALL: 3555 nios2_as_options.relax = relax_all; 3556 break; 3557 case OPTION_NORELAX: 3558 nios2_as_options.relax = relax_none; 3559 break; 3560 case OPTION_RELAX_SECTION: 3561 nios2_as_options.relax = relax_section; 3562 break; 3563 case OPTION_EB: 3564 target_big_endian = 1; 3565 break; 3566 case OPTION_EL: 3567 target_big_endian = 0; 3568 break; 3569 case OPTION_MARCH: 3570 nios2_use_arch (arg); 3571 break; 3572 default: 3573 return 0; 3574 break; 3575 } 3576 3577 return 1; 3578 } 3579 3580 /* Implement TARGET_FORMAT. We can choose to be big-endian or 3581 little-endian at runtime based on a switch. */ 3582 const char * 3583 nios2_target_format (void) 3584 { 3585 return target_big_endian ? "elf32-bignios2" : "elf32-littlenios2"; 3586 } 3587 3588 /* Machine-dependent usage message. */ 3589 void 3590 md_show_usage (FILE *stream) 3591 { 3592 fprintf (stream, " NIOS2 options:\n" 3593 " -relax-all replace all branch and call " 3594 "instructions with jmp and callr sequences\n" 3595 " -relax-section replace identified out of range " 3596 "branches with jmp sequences (default)\n" 3597 " -no-relax do not replace any branches or calls\n" 3598 " -EB force big-endian byte ordering\n" 3599 " -EL force little-endian byte ordering\n" 3600 " -march=ARCH enable instructions from architecture ARCH\n"); 3601 } 3602 3603 3604 /* This function is called once, at assembler startup time. 3605 It should set up all the tables, etc. that the MD part of the 3606 assembler will need. */ 3607 void 3608 md_begin (void) 3609 { 3610 int i; 3611 const char *inserted; 3612 3613 switch (nios2_architecture) 3614 { 3615 default: 3616 case EF_NIOS2_ARCH_R1: 3617 bfd_default_set_arch_mach (stdoutput, bfd_arch_nios2, bfd_mach_nios2r1); 3618 break; 3619 case EF_NIOS2_ARCH_R2: 3620 if (target_big_endian) 3621 as_fatal (_("Big-endian R2 is not supported.")); 3622 bfd_default_set_arch_mach (stdoutput, bfd_arch_nios2, bfd_mach_nios2r2); 3623 break; 3624 } 3625 3626 /* Create and fill a hashtable for the Nios II opcodes, registers and 3627 arguments. */ 3628 nios2_opcode_hash = hash_new (); 3629 nios2_reg_hash = hash_new (); 3630 nios2_ps_hash = hash_new (); 3631 3632 for (i = 0; i < nios2_num_opcodes; ++i) 3633 { 3634 inserted 3635 = hash_insert (nios2_opcode_hash, nios2_opcodes[i].name, 3636 (PTR) & nios2_opcodes[i]); 3637 if (inserted != NULL) 3638 { 3639 fprintf (stderr, _("internal error: can't hash `%s': %s\n"), 3640 nios2_opcodes[i].name, inserted); 3641 /* Probably a memory allocation problem? Give up now. */ 3642 as_fatal (_("Broken assembler. No assembly attempted.")); 3643 } 3644 } 3645 3646 for (i = 0; i < nios2_num_regs; ++i) 3647 { 3648 inserted 3649 = hash_insert (nios2_reg_hash, nios2_regs[i].name, 3650 (PTR) & nios2_regs[i]); 3651 if (inserted != NULL) 3652 { 3653 fprintf (stderr, _("internal error: can't hash `%s': %s\n"), 3654 nios2_regs[i].name, inserted); 3655 /* Probably a memory allocation problem? Give up now. */ 3656 as_fatal (_("Broken assembler. No assembly attempted.")); 3657 } 3658 3659 } 3660 3661 for (i = 0; i < nios2_num_ps_insn_info_structs; ++i) 3662 { 3663 inserted 3664 = hash_insert (nios2_ps_hash, nios2_ps_insn_info_structs[i].pseudo_insn, 3665 (PTR) & nios2_ps_insn_info_structs[i]); 3666 if (inserted != NULL) 3667 { 3668 fprintf (stderr, _("internal error: can't hash `%s': %s\n"), 3669 nios2_ps_insn_info_structs[i].pseudo_insn, inserted); 3670 /* Probably a memory allocation problem? Give up now. */ 3671 as_fatal (_("Broken assembler. No assembly attempted.")); 3672 } 3673 } 3674 3675 /* Assembler option defaults. */ 3676 nios2_as_options.noat = FALSE; 3677 nios2_as_options.nobreak = FALSE; 3678 3679 /* Debug information is incompatible with relaxation. */ 3680 if (debug_type != DEBUG_UNSPECIFIED) 3681 nios2_as_options.relax = relax_none; 3682 3683 /* Initialize the alignment data. */ 3684 nios2_current_align_seg = now_seg; 3685 nios2_last_label = NULL; 3686 nios2_current_align = 0; 3687 nios2_min_align = 2; 3688 } 3689 3690 3691 /* Assembles a single line of Nios II assembly language. */ 3692 void 3693 md_assemble (char *op_str) 3694 { 3695 char *argstr; 3696 char *op_strdup = NULL; 3697 unsigned long saved_pinfo = 0; 3698 nios2_insn_infoS thisinsn; 3699 nios2_insn_infoS *insn = &thisinsn; 3700 bfd_boolean ps_error = FALSE; 3701 3702 /* Make sure we are aligned on an appropriate boundary. */ 3703 if (nios2_current_align < nios2_min_align) 3704 nios2_align (nios2_min_align, NULL, nios2_last_label); 3705 else if (nios2_current_align > nios2_min_align) 3706 nios2_current_align = nios2_min_align; 3707 nios2_last_label = NULL; 3708 3709 /* We don't want to clobber to op_str 3710 because we want to be able to use it in messages. */ 3711 op_strdup = strdup (op_str); 3712 insn->insn_tokens[0] = strtok (op_strdup, " "); 3713 argstr = strtok (NULL, ""); 3714 3715 /* Assemble the opcode. */ 3716 insn->insn_nios2_opcode = nios2_opcode_lookup (insn->insn_tokens[0]); 3717 insn->insn_reloc = NULL; 3718 3719 if (insn->insn_nios2_opcode != NULL) 3720 { 3721 nios2_ps_insn_infoS *ps_insn = NULL; 3722 3723 /* Note if we've seen a 16-bit instruction. */ 3724 if (insn->insn_nios2_opcode->size == 2) 3725 nios2_min_align = 1; 3726 3727 /* Set the opcode for the instruction. */ 3728 insn->insn_code = insn->insn_nios2_opcode->match; 3729 insn->constant_bits = 0; 3730 3731 /* Parse the arguments pointed to by argstr. */ 3732 if (nios2_mode == NIOS2_MODE_ASSEMBLE) 3733 nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args, 3734 (char **) &insn->insn_tokens[1]); 3735 else 3736 nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args_test, 3737 (char **) &insn->insn_tokens[1]); 3738 3739 /* We need to preserve the MOVIA macro as this is clobbered by 3740 translate_pseudo_insn. */ 3741 if (insn->insn_nios2_opcode->pinfo == NIOS2_INSN_MACRO_MOVIA) 3742 saved_pinfo = NIOS2_INSN_MACRO_MOVIA; 3743 /* If the instruction is an pseudo-instruction, we want to replace it 3744 with its real equivalent, and then continue. */ 3745 if ((insn->insn_nios2_opcode->pinfo & NIOS2_INSN_MACRO) 3746 == NIOS2_INSN_MACRO) 3747 { 3748 ps_insn = nios2_translate_pseudo_insn (insn); 3749 if (!ps_insn) 3750 ps_error = TRUE; 3751 } 3752 3753 /* If we found invalid pseudo-instruction syntax, the error's already 3754 been diagnosed in nios2_translate_pseudo_insn, so skip 3755 remaining processing. */ 3756 if (!ps_error) 3757 { 3758 /* Assemble the parsed arguments into the instruction word. */ 3759 nios2_assemble_args (insn); 3760 3761 /* Handle relaxation and other transformations. */ 3762 if (nios2_as_options.relax != relax_none 3763 && !nios2_as_options.noat 3764 && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_UBRANCH) 3765 output_ubranch (insn); 3766 else if (nios2_as_options.relax != relax_none 3767 && !nios2_as_options.noat 3768 && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CBRANCH) 3769 output_cbranch (insn); 3770 else if (nios2_as_options.relax == relax_all 3771 && !nios2_as_options.noat 3772 && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CALL 3773 && insn->insn_reloc 3774 && ((insn->insn_reloc->reloc_type 3775 == BFD_RELOC_NIOS2_CALL26) 3776 || (insn->insn_reloc->reloc_type 3777 == BFD_RELOC_NIOS2_CALL26_NOAT))) 3778 output_call (insn); 3779 else if (saved_pinfo == NIOS2_INSN_MACRO_MOVIA) 3780 output_movia (insn); 3781 else 3782 output_insn (insn); 3783 if (ps_insn) 3784 nios2_cleanup_pseudo_insn (insn, ps_insn); 3785 } 3786 } 3787 else 3788 /* Unrecognised instruction - error. */ 3789 as_bad (_("unrecognised instruction %s"), insn->insn_tokens[0]); 3790 3791 /* Don't leak memory. */ 3792 free (op_strdup); 3793 } 3794 3795 /* Round up section size. */ 3796 valueT 3797 md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT size) 3798 { 3799 /* I think byte alignment is fine here. */ 3800 return size; 3801 } 3802 3803 /* Implement TC_FORCE_RELOCATION. */ 3804 int 3805 nios2_force_relocation (fixS *fixp) 3806 { 3807 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT 3808 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY 3809 || fixp->fx_r_type == BFD_RELOC_NIOS2_ALIGN) 3810 return 1; 3811 3812 return generic_force_reloc (fixp); 3813 } 3814 3815 /* Implement tc_fix_adjustable. */ 3816 int 3817 nios2_fix_adjustable (fixS *fixp) 3818 { 3819 if (fixp->fx_addsy == NULL) 3820 return 1; 3821 3822 #ifdef OBJ_ELF 3823 /* Prevent all adjustments to global symbols. */ 3824 if (OUTPUT_FLAVOR == bfd_target_elf_flavour 3825 && (S_IS_EXTERNAL (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))) 3826 return 0; 3827 #endif 3828 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT 3829 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 3830 return 0; 3831 3832 /* Preserve relocations against symbols with function type. */ 3833 if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION) 3834 return 0; 3835 3836 /* Don't allow symbols to be discarded on GOT related relocs. */ 3837 if (fixp->fx_r_type == BFD_RELOC_NIOS2_GOT16 3838 || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL16 3839 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO 3840 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA 3841 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16 3842 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16 3843 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16 3844 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16 3845 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16 3846 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPMOD 3847 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL 3848 || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_TPREL 3849 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF 3850 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_LO 3851 || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_HA 3852 || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_LO 3853 || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_HA 3854 ) 3855 return 0; 3856 3857 return 1; 3858 } 3859 3860 /* Implement tc_frob_symbol. This is called in adjust_reloc_syms; 3861 it is used to remove *ABS* references from the symbol table. */ 3862 int 3863 nios2_frob_symbol (symbolS *symp) 3864 { 3865 if ((OUTPUT_FLAVOR == bfd_target_elf_flavour 3866 && symp == section_symbol (absolute_section)) 3867 || !S_IS_DEFINED (symp)) 3868 return 1; 3869 else 3870 return 0; 3871 } 3872 3873 /* The function tc_gen_reloc creates a relocation structure for the 3874 fixup fixp, and returns a pointer to it. This structure is passed 3875 to bfd_install_relocation so that it can be written to the object 3876 file for linking. */ 3877 arelent * 3878 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) 3879 { 3880 arelent *reloc = XNEW (arelent); 3881 reloc->sym_ptr_ptr = XNEW (asymbol *); 3882 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 3883 3884 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 3885 reloc->addend = fixp->fx_offset; /* fixp->fx_addnumber; */ 3886 3887 if (fixp->fx_pcrel) 3888 { 3889 switch (fixp->fx_r_type) 3890 { 3891 case BFD_RELOC_16: 3892 fixp->fx_r_type = BFD_RELOC_16_PCREL; 3893 break; 3894 case BFD_RELOC_NIOS2_LO16: 3895 fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_LO; 3896 break; 3897 case BFD_RELOC_NIOS2_HIADJ16: 3898 fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_HA; 3899 break; 3900 default: 3901 break; 3902 } 3903 } 3904 3905 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); 3906 if (reloc->howto == NULL) 3907 { 3908 as_bad_where (fixp->fx_file, fixp->fx_line, 3909 _("can't represent relocation type %s"), 3910 bfd_get_reloc_code_name (fixp->fx_r_type)); 3911 3912 /* Set howto to a garbage value so that we can keep going. */ 3913 reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32); 3914 gas_assert (reloc->howto != NULL); 3915 } 3916 return reloc; 3917 } 3918 3919 long 3920 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED) 3921 { 3922 return 0; 3923 } 3924 3925 /* Called just before the assembler exits. */ 3926 void 3927 md_end (void) 3928 { 3929 /* FIXME - not yet implemented */ 3930 } 3931 3932 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE. 3933 Otherwise we have no need to default values of symbols. */ 3934 symbolS * 3935 md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 3936 { 3937 #ifdef OBJ_ELF 3938 if (name[0] == '_' && name[1] == 'G' 3939 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0) 3940 { 3941 if (!GOT_symbol) 3942 { 3943 if (symbol_find (name)) 3944 as_bad ("GOT already in the symbol table"); 3945 3946 GOT_symbol = symbol_new (name, undefined_section, 3947 (valueT) 0, &zero_address_frag); 3948 } 3949 3950 return GOT_symbol; 3951 } 3952 #endif 3953 3954 return 0; 3955 } 3956 3957 /* Implement tc_frob_label. */ 3958 void 3959 nios2_frob_label (symbolS *lab) 3960 { 3961 /* Emit dwarf information. */ 3962 dwarf2_emit_label (lab); 3963 3964 /* Update the label's address with the current output pointer. */ 3965 symbol_set_frag (lab, frag_now); 3966 S_SET_VALUE (lab, (valueT) frag_now_fix ()); 3967 3968 /* Record this label for future adjustment after we find out what 3969 kind of data it references, and the required alignment therewith. */ 3970 nios2_last_label = lab; 3971 } 3972 3973 /* Implement md_cons_align. */ 3974 void 3975 nios2_cons_align (int size) 3976 { 3977 int log_size = 0; 3978 const char *pfill = NULL; 3979 3980 while ((size >>= 1) != 0) 3981 ++log_size; 3982 3983 if (subseg_text_p (now_seg)) 3984 pfill = (const char *) nop32; 3985 else 3986 pfill = NULL; 3987 3988 if (nios2_auto_align_on) 3989 nios2_align (log_size, pfill, NULL); 3990 3991 nios2_last_label = NULL; 3992 } 3993 3994 /* Map 's' to SHF_NIOS2_GPREL. */ 3995 /* This is from the Alpha code tc-alpha.c. */ 3996 int 3997 nios2_elf_section_letter (int letter, const char **ptr_msg) 3998 { 3999 if (letter == 's') 4000 return SHF_NIOS2_GPREL; 4001 4002 *ptr_msg = _("Bad .section directive: want a,s,w,x,M,S,G,T in string"); 4003 return -1; 4004 } 4005 4006 /* Map SHF_ALPHA_GPREL to SEC_SMALL_DATA. */ 4007 /* This is from the Alpha code tc-alpha.c. */ 4008 flagword 4009 nios2_elf_section_flags (flagword flags, int attr, int type ATTRIBUTE_UNUSED) 4010 { 4011 if (attr & SHF_NIOS2_GPREL) 4012 flags |= SEC_SMALL_DATA; 4013 return flags; 4014 } 4015 4016 /* Implement TC_PARSE_CONS_EXPRESSION to handle %tls_ldo(...) */ 4017 bfd_reloc_code_real_type 4018 nios2_cons (expressionS *exp, int size) 4019 { 4020 bfd_reloc_code_real_type nios2_tls_ldo_reloc = BFD_RELOC_NONE; 4021 4022 SKIP_WHITESPACE (); 4023 if (input_line_pointer[0] == '%') 4024 { 4025 if (strprefix (input_line_pointer + 1, "tls_ldo")) 4026 { 4027 if (size != 4) 4028 as_bad (_("Illegal operands: %%tls_ldo in %d-byte data field"), 4029 size); 4030 else 4031 { 4032 input_line_pointer += 8; 4033 nios2_tls_ldo_reloc = BFD_RELOC_NIOS2_TLS_DTPREL; 4034 } 4035 } 4036 if (nios2_tls_ldo_reloc != BFD_RELOC_NONE) 4037 { 4038 SKIP_WHITESPACE (); 4039 if (input_line_pointer[0] != '(') 4040 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()")); 4041 else 4042 { 4043 int c; 4044 char *end = ++input_line_pointer; 4045 int npar = 0; 4046 4047 for (c = *end; !is_end_of_line[c]; end++, c = *end) 4048 if (c == '(') 4049 npar++; 4050 else if (c == ')') 4051 { 4052 if (!npar) 4053 break; 4054 npar--; 4055 } 4056 4057 if (c != ')') 4058 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()")); 4059 else 4060 { 4061 *end = '\0'; 4062 expression (exp); 4063 *end = c; 4064 if (input_line_pointer != end) 4065 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()")); 4066 else 4067 { 4068 input_line_pointer++; 4069 SKIP_WHITESPACE (); 4070 c = *input_line_pointer; 4071 if (! is_end_of_line[c] && c != ',') 4072 as_bad (_("Illegal operands: garbage after %%tls_ldo()")); 4073 } 4074 } 4075 } 4076 } 4077 } 4078 if (nios2_tls_ldo_reloc == BFD_RELOC_NONE) 4079 expression (exp); 4080 return nios2_tls_ldo_reloc; 4081 } 4082 4083 /* Implement HANDLE_ALIGN. */ 4084 void 4085 nios2_handle_align (fragS *fragp) 4086 { 4087 /* If we are expecting to relax in the linker, then we must output a 4088 relocation to tell the linker we are aligning code. */ 4089 if (nios2_as_options.relax == relax_all 4090 && (fragp->fr_type == rs_align || fragp->fr_type == rs_align_code) 4091 && fragp->fr_address + fragp->fr_fix > 0 4092 && fragp->fr_offset > 1 4093 && now_seg != bss_section) 4094 fix_new (fragp, fragp->fr_fix, 0, &abs_symbol, fragp->fr_offset, 0, 4095 BFD_RELOC_NIOS2_ALIGN); 4096 } 4097 4098 /* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2 4099 register number. */ 4100 int 4101 nios2_regname_to_dw2regnum (char *regname) 4102 { 4103 struct nios2_reg *r = nios2_reg_lookup (regname); 4104 if (r == NULL) 4105 return -1; 4106 return r->index; 4107 } 4108 4109 /* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2 4110 unwind information for this procedure. */ 4111 void 4112 nios2_frame_initial_instructions (void) 4113 { 4114 cfi_add_CFA_def_cfa (27, 0); 4115 } 4116 4117 #ifdef OBJ_ELF 4118 /* Some special processing for a Nios II ELF file. */ 4119 4120 void 4121 nios2_elf_final_processing (void) 4122 { 4123 elf_elfheader (stdoutput)->e_flags = nios2_architecture; 4124 } 4125 #endif 4126