1/* tc-vax.c - vax-specific - 2 Copyright (C) 1987-2022 Free Software Foundation, Inc. 3 4 This file is part of GAS, the GNU Assembler. 5 6 GAS is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GAS is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GAS; see the file COPYING. If not, write to the Free 18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 19 02110-1301, USA. */ 20 21#include "as.h" 22 23#include "vax-inst.h" 24#include "obstack.h" /* For FRAG_APPEND_1_CHAR macro in "frags.h" */ 25#include "dw2gencfi.h" 26#include "subsegs.h" 27#include "safe-ctype.h" 28 29#ifdef OBJ_ELF 30#include "elf/vax.h" 31#endif 32 33/* These chars start a comment anywhere in a source file (except inside 34 another comment */ 35const char comment_chars[] = "#"; 36 37/* These chars only start a comment at the beginning of a line. */ 38/* Note that for the VAX the are the same as comment_chars above. */ 39const char line_comment_chars[] = "#"; 40 41const char line_separator_chars[] = ";"; 42 43/* Chars that can be used to separate mant from exp in floating point nums. */ 44const char EXP_CHARS[] = "eE"; 45 46/* Chars that mean this number is a floating point constant 47 as in 0f123.456 48 or 0H1.234E-12 (see exp chars above). */ 49const char FLT_CHARS[] = "dDfFgGhH"; 50 51/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be 52 changed in read.c . Ideally it shouldn't have to know about it at all, 53 but nothing is ideal around here. */ 54 55/* Hold details of an operand expression. */ 56static expressionS exp_of_operand[VIT_MAX_OPERANDS]; 57static segT seg_of_operand[VIT_MAX_OPERANDS]; 58 59/* A vax instruction after decoding. */ 60static struct vit v; 61 62/* Hold details of big operands. */ 63LITTLENUM_TYPE big_operand_bits[VIT_MAX_OPERANDS][SIZE_OF_LARGE_NUMBER]; 64FLONUM_TYPE float_operand[VIT_MAX_OPERANDS]; 65/* Above is made to point into big_operand_bits by md_begin(). */ 66 67#ifdef OBJ_ELF 68#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_" 69#define PROCEDURE_LINKAGE_TABLE_NAME "_PROCEDURE_LINKAGE_TABLE_" 70symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_". */ 71symbolS *PLT_symbol; /* Pre-defined "_PROCEDURE_LINKAGE_TABLE_". */ 72#endif 73 74int flag_hash_long_names; /* -+ */ 75int flag_one; /* -1 */ 76int flag_show_after_trunc; /* -H */ 77int flag_no_hash_mixed_case; /* -h NUM */ 78#ifdef OBJ_ELF 79int flag_want_pic; /* -k */ 80#endif 81 82/* For VAX, relative addresses of "just the right length" are easy. 83 The branch displacement is always the last operand, even in 84 synthetic instructions. 85 For VAX, we encode the relax_substateTs (in e.g. fr_substate) as: 86 87 4 3 2 1 0 bit number 88 ---/ /--+-------+-------+-------+-------+-------+ 89 | what state ? | how long ? | 90 ---/ /--+-------+-------+-------+-------+-------+ 91 92 The "how long" bits are 00=byte, 01=word, 10=long. 93 This is a Un*x convention. 94 Not all lengths are legit for a given value of (what state). 95 The "how long" refers merely to the displacement length. 96 The address usually has some constant bytes in it as well. 97 98 groups for VAX address relaxing. 99 100 1. "foo" pc-relative. 101 length of byte, word, long 102 103 2a. J<cond> where <cond> is a simple flag test. 104 length of byte, word, long. 105 VAX opcodes are: (Hex) 106 bneq/bnequ 12 107 beql/beqlu 13 108 bgtr 14 109 bleq 15 110 bgeq 18 111 blss 19 112 bgtru 1a 113 blequ 1b 114 bvc 1c 115 bvs 1d 116 bgequ/bcc 1e 117 blssu/bcs 1f 118 Always, you complement 0th bit to reverse condition. 119 Always, 1-byte opcode, then 1-byte displacement. 120 121 2b. J<cond> where cond tests a memory bit. 122 length of byte, word, long. 123 Vax opcodes are: (Hex) 124 bbs e0 125 bbc e1 126 bbss e2 127 bbcs e3 128 bbsc e4 129 bbcc e5 130 Always, you complement 0th bit to reverse condition. 131 Always, 1-byte opcode, longword-address, byte-address, 1-byte-displacement 132 133 2c. J<cond> where cond tests low-order memory bit 134 length of byte,word,long. 135 Vax opcodes are: (Hex) 136 blbs e8 137 blbc e9 138 Always, you complement 0th bit to reverse condition. 139 Always, 1-byte opcode, longword-address, 1-byte displacement. 140 141 3. Jbs/Jbr. 142 length of byte,word,long. 143 Vax opcodes are: (Hex) 144 bsbb 10 145 brb 11 146 These are like (2) but there is no condition to reverse. 147 Always, 1 byte opcode, then displacement/absolute. 148 149 4a. JacbX 150 length of word, long. 151 Vax opcodes are: (Hex) 152 acbw 3d 153 acbf 4f 154 acbd 6f 155 abcb 9d 156 acbl f1 157 acbg 4ffd 158 acbh 6ffd 159 Always, we cannot reverse the sense of the branch; we have a word 160 displacement. 161 The double-byte op-codes don't hurt: we never want to modify the 162 opcode, so we don't care how many bytes are between the opcode and 163 the operand. 164 165 4b. JXobXXX 166 length of long, long, byte. 167 Vax opcodes are: (Hex) 168 aoblss f2 169 aobleq f3 170 sobgeq f4 171 sobgtr f5 172 Always, we cannot reverse the sense of the branch; we have a byte 173 displacement. 174 175 The only time we need to modify the opcode is for class 2 instructions. 176 After relax() we may complement the lowest order bit of such instruction 177 to reverse sense of branch. 178 179 For class 2 instructions, we store context of "where is the opcode literal". 180 We can change an opcode's lowest order bit without breaking anything else. 181 182 We sometimes store context in the operand literal. This way we can figure out 183 after relax() what the original addressing mode was. */ 184 185/* These displacements are relative to the start address of the 186 displacement. The first letter is Byte, Word. 2nd letter is 187 Forward, Backward. */ 188#define BF (1+ 127) 189#define BB (1+-128) 190#define WF (2+ 32767) 191#define WB (2+-32768) 192/* Don't need LF, LB because they always reach. [They are coded as 0.] */ 193 194#define C(a,b) ENCODE_RELAX(a,b) 195/* This macro has no side-effects. */ 196#define ENCODE_RELAX(what,length) (((what) << 2) + (length)) 197#define RELAX_STATE(s) ((s) >> 2) 198#define RELAX_LENGTH(s) ((s) & 3) 199 200const relax_typeS md_relax_table[] = 201{ 202 {1, 1, 0, 0}, /* error sentinel 0,0 */ 203 {1, 1, 0, 0}, /* unused 0,1 */ 204 {1, 1, 0, 0}, /* unused 0,2 */ 205 {1, 1, 0, 0}, /* unused 0,3 */ 206 207 {BF + 1, BB + 1, 2, C (1, 1)},/* B^"foo" 1,0 */ 208 {WF + 1, WB + 1, 3, C (1, 2)},/* W^"foo" 1,1 */ 209 {0, 0, 5, 0}, /* L^"foo" 1,2 */ 210 {1, 1, 0, 0}, /* unused 1,3 */ 211 212 {BF, BB, 1, C (2, 1)}, /* b<cond> B^"foo" 2,0 */ 213 {WF + 2, WB + 2, 4, C (2, 2)},/* br.+? brw X 2,1 */ 214 {0, 0, 7, 0}, /* br.+? jmp X 2,2 */ 215 {1, 1, 0, 0}, /* unused 2,3 */ 216 217 {BF, BB, 1, C (3, 1)}, /* brb B^foo 3,0 */ 218 {WF, WB, 2, C (3, 2)}, /* brw W^foo 3,1 */ 219 {0, 0, 5, 0}, /* Jmp L^foo 3,2 */ 220 {1, 1, 0, 0}, /* unused 3,3 */ 221 222 {1, 1, 0, 0}, /* unused 4,0 */ 223 {WF, WB, 2, C (4, 2)}, /* acb_ ^Wfoo 4,1 */ 224 {0, 0, 10, 0}, /* acb_,br,jmp L^foo4,2 */ 225 {1, 1, 0, 0}, /* unused 4,3 */ 226 227 {BF, BB, 1, C (5, 1)}, /* Xob___,,foo 5,0 */ 228 {WF + 4, WB + 4, 6, C (5, 2)},/* Xob.+2,brb.+3,brw5,1 */ 229 {0, 0, 9, 0}, /* Xob.+2,brb.+6,jmp5,2 */ 230 {1, 1, 0, 0}, /* unused 5,3 */ 231}; 232 233#undef C 234#undef BF 235#undef BB 236#undef WF 237#undef WB 238 239void float_cons (int); 240int flonum_gen2vax (int, FLONUM_TYPE *, LITTLENUM_TYPE *); 241 242const pseudo_typeS md_pseudo_table[] = 243{ 244 {"dfloat", float_cons, 'd'}, 245 {"ffloat", float_cons, 'f'}, 246 {"gfloat", float_cons, 'g'}, 247 {"hfloat", float_cons, 'h'}, 248 {"d_floating", float_cons, 'd'}, 249 {"f_floating", float_cons, 'f'}, 250 {"g_floating", float_cons, 'g'}, 251 {"h_floating", float_cons, 'h'}, 252 {NULL, NULL, 0}, 253}; 254 255#define STATE_PC_RELATIVE (1) 256#define STATE_CONDITIONAL_BRANCH (2) 257#define STATE_ALWAYS_BRANCH (3) /* includes BSB... */ 258#define STATE_COMPLEX_BRANCH (4) 259#define STATE_COMPLEX_HOP (5) 260 261#define STATE_BYTE (0) 262#define STATE_WORD (1) 263#define STATE_LONG (2) 264#define STATE_UNDF (3) /* Symbol undefined in pass1. */ 265 266#define min(a, b) ((a) < (b) ? (a) : (b)) 267 268void 269md_number_to_chars (char con[], valueT value, int nbytes) 270{ 271 number_to_chars_littleendian (con, value, nbytes); 272} 273 274/* Fix up some data or instructions after we find out the value of a symbol 275 that they reference. */ 276 277void /* Knows about order of bytes in address. */ 278md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED) 279{ 280 valueT value = * valueP; 281 282 if (fixP->fx_subsy != (symbolS *) NULL) 283 as_bad_subtract (fixP); 284 285 if (fixP->fx_pcrel) 286 { 287 switch (fixP->fx_r_type) 288 { 289 case BFD_RELOC_32: 290 /* change the relocation type to 32 bit PC-relative */ 291 fixP->fx_r_type = BFD_RELOC_32_PCREL; 292 if (fixP->fx_addsy != NULL) 293 { 294 /* Hack around bfd_install_relocation brain damage. */ 295 value += fixP->fx_frag->fr_address + fixP->fx_where; 296 } 297 if (fixP->fx_addsy == abs_section_sym) 298 fixP->fx_done = 1; 299 break; 300 default: 301 break; 302 } 303 } 304 305 /* 306 * Common code for pc-relative and non-pc-relative cases 307 */ 308 if (fixP->fx_addsy == NULL) 309 fixP->fx_done = 1; 310 311 if (fixP->fx_done) 312 number_to_chars_littleendian (fixP->fx_where + fixP->fx_frag->fr_literal, 313 value, fixP->fx_size); 314 else 315 /* Initialise the part of an instruction frag covered by the 316 relocation. (Many occurrences of frag_more followed by fix_new 317 lack any init of the frag.) Since VAX uses RELA relocs the 318 value we write into this field doesn't really matter. */ 319 memset (fixP->fx_where + fixP->fx_frag->fr_literal, 0, fixP->fx_size); 320} 321 322/* Convert a number from VAX byte order (little endian) 323 into host byte order. 324 con is the buffer to convert, 325 nbytes is the length of the given buffer. */ 326static long 327md_chars_to_number (unsigned char con[], int nbytes) 328{ 329 long retval; 330 331 for (retval = 0, con += nbytes - 1; nbytes--; con--) 332 { 333 retval <<= BITS_PER_CHAR; 334 retval |= *con; 335 } 336 return retval; 337} 338 339/* Copy a bignum from in to out. 340 If the output is shorter than the input, copy lower-order 341 littlenums. Return 0 or the number of significant littlenums 342 dropped. Assumes littlenum arrays are densely packed: no unused 343 chars between the littlenums. Uses memcpy() to move littlenums, and 344 wants to know length (in chars) of the input bignum. */ 345 346static int 347bignum_copy (LITTLENUM_TYPE *in, 348 int in_length, /* in sizeof(littlenum)s */ 349 LITTLENUM_TYPE *out, 350 int out_length /* in sizeof(littlenum)s */) 351{ 352 int significant_littlenums_dropped; 353 354 if (out_length < in_length) 355 { 356 LITTLENUM_TYPE *p; /* -> most significant (non-zero) input 357 littlenum. */ 358 359 memcpy ((void *) out, (void *) in, 360 (unsigned int) out_length << LITTLENUM_SHIFT); 361 for (p = in + in_length - 1; p >= in; --p) 362 { 363 if (*p) 364 break; 365 } 366 significant_littlenums_dropped = p - in - in_length + 1; 367 368 if (significant_littlenums_dropped < 0) 369 significant_littlenums_dropped = 0; 370 } 371 else 372 { 373 memcpy ((char *) out, (char *) in, 374 (unsigned int) in_length << LITTLENUM_SHIFT); 375 376 if (out_length > in_length) 377 memset ((char *) (out + in_length), '\0', 378 (unsigned int) (out_length - in_length) << LITTLENUM_SHIFT); 379 380 significant_littlenums_dropped = 0; 381 } 382 383 return significant_littlenums_dropped; 384} 385 386/* md_estimate_size_before_relax(), called just before relax(). 387 Any symbol that is now undefined will not become defined. 388 Return the correct fr_subtype in the frag and the growth beyond 389 fr_fix. */ 390int 391md_estimate_size_before_relax (fragS *fragP, segT segment) 392{ 393 if (RELAX_LENGTH (fragP->fr_subtype) == STATE_UNDF) 394 { 395 if (S_GET_SEGMENT (fragP->fr_symbol) != segment 396#ifdef OBJ_ELF 397 || S_IS_WEAK (fragP->fr_symbol) 398 || S_IS_EXTERNAL (fragP->fr_symbol) 399#endif 400 ) 401 { 402 /* Non-relaxable cases. */ 403 int reloc_type = NO_RELOC; 404 char *p; 405 int old_fr_fix; 406 407 old_fr_fix = fragP->fr_fix; 408 p = &fragP->fr_literal[0] + old_fr_fix; 409#ifdef OBJ_ELF 410 /* If this is to an undefined symbol, then if it's an indirect 411 reference indicate that is can mutated into a GLOB_DAT or 412 JUMP_SLOT by the loader. We restrict ourselves to no offset 413 due to a limitation in the NetBSD linker. */ 414 415 if (GOT_symbol == NULL) 416 GOT_symbol = symbol_find (GLOBAL_OFFSET_TABLE_NAME); 417 if (PLT_symbol == NULL) 418 PLT_symbol = symbol_find (PROCEDURE_LINKAGE_TABLE_NAME); 419 if ((GOT_symbol == NULL || fragP->fr_symbol != GOT_symbol) 420 && (PLT_symbol == NULL || fragP->fr_symbol != PLT_symbol) 421 && fragP->fr_symbol != NULL 422 && flag_want_pic 423#ifdef OBJ_ELF 424 && ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol)) != STV_HIDDEN 425#endif 426 && (!S_IS_DEFINED (fragP->fr_symbol) 427 || S_IS_WEAK (fragP->fr_symbol) 428 || S_IS_EXTERNAL (fragP->fr_symbol))) 429 { 430 /* Indirect references cannot go through the GOT or PLT, 431 let's hope they'll become local in the final link. */ 432 if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol)) 433 != STV_DEFAULT) 434 || (p[0] & 0x10)) 435 reloc_type = BFD_RELOC_32_PCREL; 436 else if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS 437 || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG 438 || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB 439 || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP 440 || S_IS_FUNCTION (fragP->fr_symbol)) 441 reloc_type = BFD_RELOC_32_PLT_PCREL; 442 else 443 reloc_type = BFD_RELOC_32_GOT_PCREL; 444 } 445#endif 446 switch (RELAX_STATE (fragP->fr_subtype)) 447 { 448 case STATE_PC_RELATIVE: 449 p[0] |= VAX_PC_RELATIVE_MODE; /* Preserve @ bit. */ 450 fragP->fr_fix += 1 + 4; 451 fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol, 452 fragP->fr_offset, 1, reloc_type); 453 break; 454 455 case STATE_CONDITIONAL_BRANCH: 456 *fragP->fr_opcode ^= 1; /* Reverse sense of branch. */ 457 p[0] = 6; 458 p[1] = VAX_JMP; 459 p[2] = VAX_PC_RELATIVE_MODE; /* ...(PC) */ 460 fragP->fr_fix += 1 + 1 + 1 + 4; 461 fix_new (fragP, old_fr_fix + 3, 4, fragP->fr_symbol, 462 fragP->fr_offset, 1, NO_RELOC); 463 break; 464 465 case STATE_COMPLEX_BRANCH: 466 p[0] = 2; 467 p[1] = 0; 468 p[2] = VAX_BRB; 469 p[3] = 6; 470 p[4] = VAX_JMP; 471 p[5] = VAX_PC_RELATIVE_MODE; /* ...(pc) */ 472 fragP->fr_fix += 2 + 2 + 1 + 1 + 4; 473 fix_new (fragP, old_fr_fix + 6, 4, fragP->fr_symbol, 474 fragP->fr_offset, 1, NO_RELOC); 475 break; 476 477 case STATE_COMPLEX_HOP: 478 p[0] = 2; 479 p[1] = VAX_BRB; 480 p[2] = 6; 481 p[3] = VAX_JMP; 482 p[4] = VAX_PC_RELATIVE_MODE; /* ...(pc) */ 483 fragP->fr_fix += 1 + 2 + 1 + 1 + 4; 484 fix_new (fragP, old_fr_fix + 5, 4, fragP->fr_symbol, 485 fragP->fr_offset, 1, NO_RELOC); 486 break; 487 488 case STATE_ALWAYS_BRANCH: 489 *fragP->fr_opcode += VAX_WIDEN_LONG; 490 p[0] = VAX_PC_RELATIVE_MODE; /* ...(PC) */ 491 fragP->fr_fix += 1 + 4; 492 fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol, 493 fragP->fr_offset, 1, NO_RELOC); 494 break; 495 496 default: 497 abort (); 498 } 499 frag_wane (fragP); 500 501 /* Return the growth in the fixed part of the frag. */ 502 return fragP->fr_fix - old_fr_fix; 503 } 504 505 /* Relaxable cases. Set up the initial guess for the variable 506 part of the frag. */ 507 switch (RELAX_STATE (fragP->fr_subtype)) 508 { 509 case STATE_PC_RELATIVE: 510 fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE); 511 break; 512 case STATE_CONDITIONAL_BRANCH: 513 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE); 514 break; 515 case STATE_COMPLEX_BRANCH: 516 fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD); 517 break; 518 case STATE_COMPLEX_HOP: 519 fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE); 520 break; 521 case STATE_ALWAYS_BRANCH: 522 fragP->fr_subtype = ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE); 523 break; 524 } 525 } 526 527 if (fragP->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0])) 528 abort (); 529 530 /* Return the size of the variable part of the frag. */ 531 return md_relax_table[fragP->fr_subtype].rlx_length; 532} 533 534/* Called after relax() is finished. 535 In: Address of frag. 536 fr_type == rs_machine_dependent. 537 fr_subtype is what the address relaxed to. 538 539 Out: Any fixSs and constants are set up. 540 Caller will turn frag into a ".space 0". */ 541void 542md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, 543 segT seg ATTRIBUTE_UNUSED, 544 fragS *fragP) 545{ 546 char *addressP; /* -> _var to change. */ 547 char *opcodeP; /* -> opcode char(s) to change. */ 548 short int extension = 0; /* Size of relaxed address. */ 549 /* Added to fr_fix: incl. ALL var chars. */ 550 symbolS *symbolP; 551 long where; 552 553 know (fragP->fr_type == rs_machine_dependent); 554 where = fragP->fr_fix; 555 addressP = &fragP->fr_literal[0] + where; 556 opcodeP = fragP->fr_opcode; 557 symbolP = fragP->fr_symbol; 558 know (symbolP); 559 560 switch (fragP->fr_subtype) 561 { 562 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE): 563 know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */ 564 addressP[0] |= 0xAF; /* Byte displacement. */ 565 fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol, 566 fragP->fr_offset, 1, NO_RELOC); 567 extension = 2; 568 break; 569 570 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD): 571 know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */ 572 addressP[0] |= 0xCF; /* Word displacement. */ 573 fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol, 574 fragP->fr_offset, 1, NO_RELOC); 575 extension = 3; 576 break; 577 578 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_LONG): 579 know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */ 580 addressP[0] |= 0xEF; /* Long word displacement. */ 581 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol, 582 fragP->fr_offset, 1, NO_RELOC); 583 extension = 5; 584 break; 585 586 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE): 587 fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol, 588 fragP->fr_offset, 1, NO_RELOC); 589 extension = 1; 590 break; 591 592 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD): 593 opcodeP[0] ^= 1; /* Reverse sense of test. */ 594 addressP[0] = 3; 595 addressP[1] = VAX_BRW; 596 fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol, 597 fragP->fr_offset, 1, NO_RELOC); 598 extension = 4; 599 break; 600 601 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_LONG): 602 opcodeP[0] ^= 1; /* Reverse sense of test. */ 603 addressP[0] = 6; 604 addressP[1] = VAX_JMP; 605 addressP[2] = VAX_PC_RELATIVE_MODE; 606 fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol, 607 fragP->fr_offset, 1, NO_RELOC); 608 extension = 7; 609 break; 610 611 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE): 612 fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol, 613 fragP->fr_offset, 1, NO_RELOC); 614 extension = 1; 615 break; 616 617 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_WORD): 618 opcodeP[0] += VAX_WIDEN_WORD; /* brb -> brw, bsbb -> bsbw */ 619 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset, 620 1, NO_RELOC); 621 extension = 2; 622 break; 623 624 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_LONG): 625 opcodeP[0] += VAX_WIDEN_LONG; /* brb -> jmp, bsbb -> jsb */ 626 addressP[0] = VAX_PC_RELATIVE_MODE; 627 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol, 628 fragP->fr_offset, 1, NO_RELOC); 629 extension = 5; 630 break; 631 632 case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD): 633 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, 634 fragP->fr_offset, 1, NO_RELOC); 635 extension = 2; 636 break; 637 638 case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_LONG): 639 addressP[0] = 2; 640 addressP[1] = 0; 641 addressP[2] = VAX_BRB; 642 addressP[3] = 6; 643 addressP[4] = VAX_JMP; 644 addressP[5] = VAX_PC_RELATIVE_MODE; 645 fix_new (fragP, fragP->fr_fix + 6, 4, fragP->fr_symbol, 646 fragP->fr_offset, 1, NO_RELOC); 647 extension = 10; 648 break; 649 650 case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE): 651 fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol, 652 fragP->fr_offset, 1, NO_RELOC); 653 extension = 1; 654 break; 655 656 case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_WORD): 657 addressP[0] = 2; 658 addressP[1] = VAX_BRB; 659 addressP[2] = 3; 660 addressP[3] = VAX_BRW; 661 fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol, 662 fragP->fr_offset, 1, NO_RELOC); 663 extension = 6; 664 break; 665 666 case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_LONG): 667 addressP[0] = 2; 668 addressP[1] = VAX_BRB; 669 addressP[2] = 6; 670 addressP[3] = VAX_JMP; 671 addressP[4] = VAX_PC_RELATIVE_MODE; 672 fix_new (fragP, fragP->fr_fix + 5, 4, fragP->fr_symbol, 673 fragP->fr_offset, 1, NO_RELOC); 674 extension = 9; 675 break; 676 677 default: 678 BAD_CASE (fragP->fr_subtype); 679 break; 680 } 681 fragP->fr_fix += extension; 682} 683 684/* Translate internal format of relocation info into target format. 685 686 On vax: first 4 bytes are normal unsigned long, next three bytes 687 are symbolnum, least sig. byte first. Last byte is broken up with 688 the upper nibble as nuthin, bit 3 as extern, bits 2 & 1 as length, and 689 bit 0 as pcrel. */ 690#ifdef comment 691void 692md_ri_to_chars (char *the_bytes, struct reloc_info_generic ri) 693{ 694 /* This is easy. */ 695 md_number_to_chars (the_bytes, ri.r_address, sizeof (ri.r_address)); 696 /* Now the fun stuff. */ 697 the_bytes[6] = (ri.r_symbolnum >> 16) & 0x0ff; 698 the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff; 699 the_bytes[4] = ri.r_symbolnum & 0x0ff; 700 the_bytes[7] = (((ri.r_extern << 3) & 0x08) | ((ri.r_length << 1) & 0x06) 701 | ((ri.r_pcrel << 0) & 0x01)) & 0x0F; 702} 703 704#endif /* comment */ 705 706/* BUGS, GRIPES, APOLOGIA, etc. 707 708 The opcode table 'votstrs' needs to be sorted on opcode frequency. 709 That is, AFTER we hash it with hash_...(), we want most-used opcodes 710 to come out of the hash table faster. 711 712 I am sorry to inflict yet another VAX assembler on the world, but 713 RMS says we must do everything from scratch, to prevent pin-heads 714 restricting this software. 715 716 This is a vaguely modular set of routines in C to parse VAX 717 assembly code using DEC mnemonics. It is NOT un*x specific. 718 719 The idea here is that the assembler has taken care of all: 720 labels 721 macros 722 listing 723 pseudo-ops 724 line continuation 725 comments 726 condensing any whitespace down to exactly one space 727 and all we have to do is parse 1 line into a vax instruction 728 partially formed. We will accept a line, and deliver: 729 an error message (hopefully empty) 730 a skeleton VAX instruction (tree structure) 731 textual pointers to all the operand expressions 732 a warning message that notes a silly operand (hopefully empty) 733 734 E D I T H I S T O R Y 735 736 17may86 Dean Elsner. Bug if line ends immediately after opcode. 737 30apr86 Dean Elsner. New vip_op() uses arg block so change call. 738 6jan86 Dean Elsner. Crock vip_begin() to call vip_op_defaults(). 739 2jan86 Dean Elsner. Invent synthetic opcodes. 740 Widen vax_opcodeT to 32 bits. Use a bit for VIT_OPCODE_SYNTHETIC, 741 which means this is not a real opcode, it is like a macro; it will 742 be relax()ed into 1 or more instructions. 743 Use another bit for VIT_OPCODE_SPECIAL if the op-code is not optimised 744 like a regular branch instruction. Option added to vip_begin(): 745 exclude synthetic opcodes. Invent synthetic_votstrs[]. 746 31dec85 Dean Elsner. Invent vit_opcode_nbytes. 747 Also make vit_opcode into a char[]. We now have n-byte vax opcodes, 748 so caller's don't have to know the difference between a 1-byte & a 749 2-byte op-code. Still need vax_opcodeT concept, so we know how 750 big an object must be to hold an op.code. 751 30dec85 Dean Elsner. Widen typedef vax_opcodeT in "vax-inst.h" 752 because vax opcodes may be 16 bits. Our crufty C compiler was 753 happily initialising 8-bit vot_codes with 16-bit numbers! 754 (Wouldn't the 'phone company like to compress data so easily!) 755 29dec85 Dean Elsner. New static table vax_operand_width_size[]. 756 Invented so we know hw many bytes a "I^#42" needs in its immediate 757 operand. Revised struct vop in "vax-inst.h": explicitly include 758 byte length of each operand, and it's letter-code datum type. 759 17nov85 Dean Elsner. Name Change. 760 Due to ar(1) truncating names, we learned the hard way that 761 "vax-inst-parse.c" -> "vax-inst-parse." dropping the "o" off 762 the archived object name. SO... we shortened the name of this 763 source file, and changed the makefile. */ 764 765/* Handle of the OPCODE hash table. */ 766static htab_t op_hash; 767 768/* In: 1 character, from "bdfghloqpw" being the data-type of an operand 769 of a vax instruction. 770 771 Out: the length of an operand of that type, in bytes. 772 Special branch operands types "-?!" have length 0. */ 773 774static const short int vax_operand_width_size[256] = 775{ 776 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 778 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 779 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 780 0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16, /* ..b.d.fgh...l..o */ 781 0, 8, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* .q.....w........ */ 782 0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16, /* ..b.d.fgh...l..o */ 783 0, 8, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* .q.....w........ */ 784 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 785 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 786 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 787 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 788 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 789 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 790 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 791 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 792}; 793 794/* This perversion encodes all the vax opcodes as a bunch of strings. 795 RMS says we should build our hash-table at run-time. Hmm. 796 Please would someone arrange these in decreasing frequency of opcode? 797 Because of the way hash_...() works, the most frequently used opcode 798 should be textually first and so on. 799 800 Input for this table was 'vax.opcodes', awk(1)ed by 'vax.opcodes.c.awk' . 801 So change 'vax.opcodes', then re-generate this table. */ 802 803#include "opcode/vax.h" 804 805/* This is a table of optional op-codes. All of them represent 806 'synthetic' instructions that seem popular. 807 808 Here we make some pseudo op-codes. Every code has a bit set to say 809 it is synthetic. This lets you catch them if you want to 810 ban these opcodes. They are mnemonics for "elastic" instructions 811 that are supposed to assemble into the fewest bytes needed to do a 812 branch, or to do a conditional branch, or whatever. 813 814 The opcode is in the usual place [low-order n*8 bits]. This means 815 that if you mask off the bucky bits, the usual rules apply about 816 how long the opcode is. 817 818 All VAX branch displacements come at the end of the instruction. 819 For simple branches (1-byte opcode + 1-byte displacement) the last 820 operand is coded 'b?' where the "data type" '?' is a clue that we 821 may reverse the sense of the branch (complement lowest order bit) 822 and branch around a jump. This is by far the most common case. 823 That is why the VIT_OPCODE_SYNTHETIC bit is set: it says this is 824 a 0-byte op-code followed by 2 or more bytes of operand address. 825 826 If the op-code has VIT_OPCODE_SPECIAL set, then we have a more unusual 827 case. 828 829 For JBSB & JBR the treatment is the similar, except (1) we have a 'bw' 830 option before (2) we can directly JSB/JMP because there is no condition. 831 These operands have 'b-' as their access/data type. 832 833 That leaves a bunch of random opcodes: JACBx, JxOBxxx. In these 834 cases, we do the same idea. JACBxxx are all marked with a 'b!' 835 JAOBxxx & JSOBxxx are marked with a 'b:'. */ 836#if (VIT_OPCODE_SYNTHETIC != 0x80000000) 837#error "You have just broken the encoding below, which assumes the sign bit means 'I am an imaginary instruction'." 838#endif 839 840#if (VIT_OPCODE_SPECIAL != 0x40000000) 841#error "You have just broken the encoding below, which assumes the 0x40 M bit means 'I am not to be "optimised" the way normal branches are'." 842#endif 843 844static const struct vot 845 synthetic_votstrs[] = 846{ 847 {"jbsb", {"b-", 0xC0000010}}, /* BSD 4.2 */ 848/* jsb used already */ 849 {"jbr", {"b-", 0xC0000011}}, /* BSD 4.2 */ 850 {"jr", {"b-", 0xC0000011}}, /* consistent */ 851 {"jneq", {"b?", 0x80000012}}, 852 {"jnequ", {"b?", 0x80000012}}, 853 {"jeql", {"b?", 0x80000013}}, 854 {"jeqlu", {"b?", 0x80000013}}, 855 {"jgtr", {"b?", 0x80000014}}, 856 {"jleq", {"b?", 0x80000015}}, 857/* un-used opcodes here */ 858 {"jgeq", {"b?", 0x80000018}}, 859 {"jlss", {"b?", 0x80000019}}, 860 {"jgtru", {"b?", 0x8000001a}}, 861 {"jlequ", {"b?", 0x8000001b}}, 862 {"jvc", {"b?", 0x8000001c}}, 863 {"jvs", {"b?", 0x8000001d}}, 864 {"jgequ", {"b?", 0x8000001e}}, 865 {"jcc", {"b?", 0x8000001e}}, 866 {"jlssu", {"b?", 0x8000001f}}, 867 {"jcs", {"b?", 0x8000001f}}, 868 869 {"jacbw", {"rwrwmwb!", 0xC000003d}}, 870 {"jacbf", {"rfrfmfb!", 0xC000004f}}, 871 {"jacbd", {"rdrdmdb!", 0xC000006f}}, 872 {"jacbb", {"rbrbmbb!", 0xC000009d}}, 873 {"jacbl", {"rlrlmlb!", 0xC00000f1}}, 874 {"jacbg", {"rgrgmgb!", 0xC0004ffd}}, 875 {"jacbh", {"rhrhmhb!", 0xC0006ffd}}, 876 877 {"jbs", {"rlvbb?", 0x800000e0}}, 878 {"jbc", {"rlvbb?", 0x800000e1}}, 879 {"jbss", {"rlvbb?", 0x800000e2}}, 880 {"jbcs", {"rlvbb?", 0x800000e3}}, 881 {"jbsc", {"rlvbb?", 0x800000e4}}, 882 {"jbcc", {"rlvbb?", 0x800000e5}}, 883 {"jbssi", {"rlvbb?", 0x800000e6}}, 884 {"jbcci", {"rlvbb?", 0x800000e7}}, 885 {"jlbs", {"rlb?", 0x800000e8}}, 886 {"jlbc", {"rlb?", 0x800000e9}}, 887 888 {"jaoblss", {"rlmlb:", 0xC00000f2}}, 889 {"jaobleq", {"rlmlb:", 0xC00000f3}}, 890 {"jsobgeq", {"mlb:", 0xC00000f4}}, 891 {"jsobgtr", {"mlb:", 0xC00000f5}}, 892 893/* CASEx has no branch addresses in our conception of it. */ 894/* You should use ".word ..." statements after the "case ...". */ 895 896 {"", {"", 0}} /* Empty is end sentinel. */ 897}; 898 899/* Because this module is useful for both VMS and UN*X style assemblers 900 and because of the variety of UN*X assemblers we must recognise 901 the different conventions for assembler operand notation. For example 902 VMS says "#42" for immediate mode, while most UN*X say "$42". 903 We permit arbitrary sets of (single) characters to represent the 904 3 concepts that DEC writes '#', '@', '^'. */ 905 906/* Character tests. */ 907#define VIP_IMMEDIATE 01 /* Character is like DEC # */ 908#define VIP_INDIRECT 02 /* Char is like DEC @ */ 909#define VIP_DISPLEN 04 /* Char is like DEC ^ */ 910 911#define IMMEDIATEP(c) (vip_metacharacters [(c) & 0xff] & VIP_IMMEDIATE) 912#define INDIRECTP(c) (vip_metacharacters [(c) & 0xff] & VIP_INDIRECT) 913#define DISPLENP(c) (vip_metacharacters [(c) & 0xff] & VIP_DISPLEN) 914 915/* We assume 8 bits per byte. Use vip_op_defaults() to set these up BEFORE we 916 are ever called. */ 917 918#if defined(CONST_TABLE) 919#define _ 0, 920#define I VIP_IMMEDIATE, 921#define S VIP_INDIRECT, 922#define D VIP_DISPLEN, 923static const char 924vip_metacharacters[256] = 925{ 926 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /* ^@ ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O*/ 927 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /* ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */ 928 _ _ _ _ I _ _ _ _ _ S _ _ _ _ _ /* sp ! " # $ % & ' ( ) * + , - . / */ 929 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*0 1 2 3 4 5 6 7 8 9 : ; < = > ?*/ 930 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*@ A B C D E F G H I J K L M N O*/ 931 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*P Q R S T U V W X Y Z [ \ ] ^ _*/ 932 D _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*` a b c d e f g h i j k l m n o*/ 933 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*p q r s t u v w x y z { | } ~ ^?*/ 934 935 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 936 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 937 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 938 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 939 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 940 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 941 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 942 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 943}; 944#undef _ 945#undef I 946#undef S 947#undef D 948 949#else 950 951static char vip_metacharacters[256]; 952 953static void 954vip_op_1 (int bit, const char *syms) 955{ 956 unsigned char t; 957 958 while ((t = *syms++) != 0) 959 vip_metacharacters[t] |= bit; 960} 961 962/* Can be called any time. More arguments may appear in future. */ 963static void 964vip_op_defaults (const char *immediate, const char *indirect, const char *displen) 965{ 966 vip_op_1 (VIP_IMMEDIATE, immediate); 967 vip_op_1 (VIP_INDIRECT, indirect); 968 vip_op_1 (VIP_DISPLEN, displen); 969} 970 971#endif 972 973/* Call me once before you decode any lines. 974 I decode votstrs into a hash table at op_hash (which I create). 975 I return an error text or null. 976 If you want, I will include the 'synthetic' jXXX instructions in the 977 instruction table. 978 You must nominate metacharacters for eg DEC's "#", "@", "^". */ 979 980static void 981vip_begin (int synthetic_too, /* 1 means include jXXX op-codes. */ 982 const char *immediate, 983 const char *indirect, 984 const char *displen) 985{ 986 const struct vot *vP; /* scan votstrs */ 987 988 op_hash = str_htab_create (); 989 990 for (vP = votstrs; *vP->vot_name; vP++) 991 if (str_hash_insert (op_hash, vP->vot_name, &vP->vot_detail, 0) != NULL) 992 as_fatal (_("duplicate %s"), vP->vot_name); 993 994 if (synthetic_too) 995 for (vP = synthetic_votstrs; *vP->vot_name; vP++) 996 if (str_hash_insert (op_hash, vP->vot_name, &vP->vot_detail, 0) != NULL) 997 as_fatal (_("duplicate %s"), vP->vot_name); 998 999#ifndef CONST_TABLE 1000 vip_op_defaults (immediate, indirect, displen); 1001#endif 1002} 1003 1004/* Take 3 char.s, the last of which may be `\0` (non-existent) 1005 and return the VAX register number that they represent. 1006 1007 Return -1 if they don't form a register name. Good names return 1008 a number from 0:15 inclusive. 1009 1010 Case is not important in a name. 1011 1012 Register names understood are: 1013 1014 R0 1015 R1 1016 R2 1017 R3 1018 R4 1019 R5 1020 R6 1021 R7 1022 R8 1023 R9 1024 R10 1025 R11 1026 R12 AP 1027 R13 FP 1028 R14 SP 1029 R15 PC */ 1030 1031#define AP 12 1032#define FP 13 1033#define SP 14 1034#define PC 15 1035 1036/* Returns the register number of something like '%r15' or 'ap', supplied 1037 in four single chars. Returns -1 if the register isn't recognized, 1038 0..15 otherwise. */ 1039static int 1040vax_reg_parse (char c1, char c2, char c3, char c4) 1041{ 1042 int retval = -1; 1043 1044#ifdef OBJ_ELF 1045 if (c1 != '%') /* Register prefixes are mandatory for ELF. */ 1046 return retval; 1047 c1 = c2; 1048 c2 = c3; 1049 c3 = c4; 1050#endif 1051#ifdef OBJ_VMS 1052 if (c4 != 0) /* Register prefixes are not allowed under VMS. */ 1053 return retval; 1054#endif 1055#ifdef OBJ_AOUT 1056 if (c1 == '%') /* Register prefixes are optional under a.out. */ 1057 { 1058 c1 = c2; 1059 c2 = c3; 1060 c3 = c4; 1061 } 1062 else if (c3 && c4) /* Can't be 4 characters long. */ 1063 return retval; 1064#endif 1065 1066 c1 = TOLOWER (c1); 1067 c2 = TOLOWER (c2); 1068 if (ISDIGIT (c2) && c1 == 'r') 1069 { 1070 retval = c2 - '0'; 1071 if (ISDIGIT (c3)) 1072 { 1073 retval = retval * 10 + c3 - '0'; 1074 retval = (retval > 15) ? -1 : retval; 1075 /* clamp the register value to 1 hex digit */ 1076 } 1077 else if (c3) 1078 retval = -1; /* c3 must be '\0' or a digit. */ 1079 } 1080 else if (c3) /* There are no three letter regs. */ 1081 retval = -1; 1082 else if (c2 == 'p') 1083 { 1084 switch (c1) 1085 { 1086 case 's': 1087 retval = SP; 1088 break; 1089 case 'f': 1090 retval = FP; 1091 break; 1092 case 'a': 1093 retval = AP; 1094 break; 1095 default: 1096 retval = -1; 1097 } 1098 } 1099 else if (c1 == 'p' && c2 == 'c') 1100 retval = PC; 1101 else 1102 retval = -1; 1103 return retval; 1104} 1105 1106#ifdef OBJ_AOUT 1107#ifndef BFD_ASSEMBLER 1108void 1109tc_aout_fix_to_chars (where, fixP, segment_address_in_file) 1110 char *where; 1111 fixS *fixP; 1112 relax_addressT segment_address_in_file; 1113{ 1114 /* 1115 * In: length of relocation (or of address) in chars: 1, 2 or 4. 1116 * Out: GNU LD relocation length code: 0, 1, or 2. 1117 */ 1118 1119 static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2}; 1120 int r_symbolnum; 1121 int r_flags; 1122 1123 know (fixP->fx_addsy != NULL); 1124 1125 md_number_to_chars (where, 1126 fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file, 1127 4); 1128 1129 r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy) 1130 ? S_GET_TYPE (fixP->fx_addsy) 1131 : fixP->fx_addsy->sy_number); 1132 r_flags = (fixP->fx_pcrel ? 1 : 0) 1133 | (!S_IS_DEFINED (fixP->fx_addsy) ? 8 : 0) /* extern */ 1134 | ((nbytes_r_length[fixP->fx_size] & 3) << 1); 1135 1136 switch (fixP->fx_r_type) { 1137 case NO_RELOC: 1138 break; 1139 case NO_RELOC2: 1140 if (r_flags & 8) 1141 r_flags |= 0x80; /* setting the copy bit */ 1142 /* says we can convert */ 1143 /* to gotslot if needed */ 1144 break; 1145 case RELOC_32: 1146 if (flag_want_pic && S_IS_EXTERNAL(fixP->fx_addsy)) { 1147 r_symbolnum = fixP->fx_addsy->sy_number; 1148 r_flags |= 8; /* set extern bit */ 1149 } 1150 break; 1151 case RELOC_JMP_SLOT: 1152 if (flag_want_pic) { 1153 r_flags |= 0x20; /* set jmptable */ 1154 r_flags &= ~0x08; /* clear extern bit */ 1155 } 1156 break; 1157 case RELOC_JMP_TBL: 1158 if (flag_want_pic) { 1159 r_flags |= 0x20; /* set jmptable */ 1160 r_flags |= 0x08; /* set extern bit */ 1161 } 1162 break; 1163 case RELOC_GLOB_DAT: 1164 if (flag_want_pic) { 1165 r_flags |= 0x10; /* set baserel bit */ 1166 r_symbolnum = fixP->fx_addsy->sy_number; 1167 if (S_IS_EXTERNAL(fixP->fx_addsy)) 1168 r_flags |= 8; /* set extern bit */ 1169 } 1170 break; 1171 } 1172 1173 where[4] = (r_symbolnum >> 0) & 0xff; 1174 where[5] = (r_symbolnum >> 8) & 0xff; 1175 where[6] = (r_symbolnum >> 16) & 0xff; 1176 where[7] = r_flags; 1177} 1178#endif /* !BFD_ASSEMBLER */ 1179#endif /* OBJ_AOUT */ 1180 1181/* Parse a vax operand in DEC assembler notation. 1182 For speed, expect a string of whitespace to be reduced to a single ' '. 1183 This is the case for GNU AS, and is easy for other DEC-compatible 1184 assemblers. 1185 1186 Knowledge about DEC VAX assembler operand notation lives here. 1187 This doesn't even know what a register name is, except it believes 1188 all register names are 2 or 3 characters, and lets vax_reg_parse() say 1189 what number each name represents. 1190 It does, however, know that PC, SP etc are special registers so it can 1191 detect addressing modes that are silly for those registers. 1192 1193 Where possible, it delivers 1 fatal or 1 warning message if the operand 1194 is suspect. Exactly what we test for is still evolving. 1195 1196 --- 1197 Arg block. 1198 1199 There were a number of 'mismatched argument type' bugs to vip_op. 1200 The most general solution is to typedef each (of many) arguments. 1201 We used instead a typedef'd argument block. This is less modular 1202 than using separate return pointers for each result, but runs faster 1203 on most engines, and seems to keep programmers happy. It will have 1204 to be done properly if we ever want to use vip_op as a general-purpose 1205 module (it was designed to be). 1206 1207 G^ 1208 1209 Doesn't support DEC "G^" format operands. These always take 5 bytes 1210 to express, and code as modes 8F or 9F. Reason: "G^" deprives you of 1211 optimising to (say) a "B^" if you are lucky in the way you link. 1212 When someone builds a linker smart enough to convert "G^" to "B^", "W^" 1213 whenever possible, then we should implement it. 1214 If there is some other use for "G^", feel free to code it in! 1215 1216 speed 1217 1218 If I nested if()s more, I could avoid testing (*err) which would save 1219 time, space and page faults. I didn't nest all those if()s for clarity 1220 and because I think the mode testing can be re-arranged 1st to test the 1221 commoner constructs 1st. Does anybody have statistics on this? 1222 1223 error messages 1224 1225 In future, we should be able to 'compose' error messages in a scratch area 1226 and give the user MUCH more informative error messages. Although this takes 1227 a little more code at run-time, it will make this module much more self- 1228 documenting. As an example of what sucks now: most error messages have 1229 hardwired into them the DEC VAX metacharacters "#^@" which are nothing like 1230 the Un*x characters "$`*", that most users will expect from this AS. 1231 1232 ---- 1233 1234 The input is a string, ending with '\0'. 1235 1236 We also require a 'hint' of what kind of operand is expected: so 1237 we can remind caller not to write into literals for instance. 1238 1239 The output is a skeletal instruction. 1240 1241 The algorithm has two parts. 1242 1. extract the syntactic features (parse off all the @^#-()+[] mode crud); 1243 2. express the @^#-()+[] as some parameters suited to further analysis. 1244 1245 2nd step is where we detect the googles of possible invalid combinations 1246 a human (or compiler) might write. Note that if we do a half-way 1247 decent assembler, we don't know how long to make (eg) displacement 1248 fields when we first meet them (because they may not have defined values). 1249 So we must wait until we know how many bits are needed for each address, 1250 then we can know both length and opcodes of instructions. 1251 For reason(s) above, we will pass to our caller a 'broken' instruction 1252 of these major components, from which our caller can generate instructions: 1253 - displacement length I^ S^ L^ B^ W^ unspecified 1254 - mode (many) 1255 - register R0-R15 or absent 1256 - index register R0-R15 or absent 1257 - expression text what we don't parse 1258 - error text(s) why we couldn't understand the operand 1259 1260 ---- 1261 1262 To decode output of this, test errtxt. If errtxt[0] == '\0', then 1263 we had no errors that prevented parsing. Also, if we ever report 1264 an internal bug, errtxt[0] is set non-zero. So one test tells you 1265 if the other outputs are to be taken seriously. 1266 1267 ---- 1268 1269 Dec defines the semantics of address modes (and values) 1270 by a two-letter code, explained here. 1271 1272 letter 1: access type 1273 1274 a address calculation - no data access, registers forbidden 1275 b branch displacement 1276 m read - let go of bus - write back "modify" 1277 r read 1278 v bit field address: like 'a' but registers are OK 1279 w write 1280 space no operator (eg ".long foo") [our convention] 1281 1282 letter 2: data type (i.e. width, alignment) 1283 1284 b byte 1285 d double precision floating point (D format) 1286 f single precision floating point (F format) 1287 g G format floating 1288 h H format floating 1289 l longword 1290 o octaword 1291 q quadword 1292 w word 1293 ? simple synthetic branch operand 1294 - unconditional synthetic JSB/JSR operand 1295 ! complex synthetic branch operand 1296 1297 The '-?!' letter 2's are not for external consumption. They are used 1298 for various assemblers. Generally, all unknown widths are assumed 0. 1299 We don't limit your choice of width character. 1300 1301 DEC operands are hard work to parse. For example, '@' as the first 1302 character means indirect (deferred) mode but elsewhere it is a shift 1303 operator. 1304 The long-winded explanation of how this is supposed to work is 1305 cancelled. Read a DEC vax manual. 1306 We try hard not to parse anything that MIGHT be part of the expression 1307 buried in that syntax. For example if we see @...(Rn) we don't check 1308 for '-' before the '(' because mode @-(Rn) does not exist. 1309 1310 After parsing we have: 1311 1312 at 1 if leading '@' (or Un*x '*') 1313 len takes one value from " bilsw". eg B^ -> 'b'. 1314 hash 1 if leading '#' (or Un*x '$') 1315 expr_begin, expr_end the expression we did not parse 1316 even though we don't interpret it, we make use 1317 of its presence or absence. 1318 sign -1: -(Rn) 0: absent +1: (Rn)+ 1319 paren 1 if () are around register 1320 reg major register number 0:15 -1 means absent 1321 ndx index register number 0:15 -1 means absent 1322 1323 Again, I dare not explain it: just trace ALL the code! 1324 1325 Summary of vip_op outputs. 1326 1327 mode reg len ndx 1328 (Rn) => @Rn 1329 {@}Rn 5+@ n ' ' optional 1330 branch operand 0 -1 ' ' -1 1331 S^#foo 0 -1 's' -1 1332 -(Rn) 7 n ' ' optional 1333 {@}(Rn)+ 8+@ n ' ' optional 1334 {@}#foo, no S^ 8+@ PC " i" optional 1335 {@}{q^}{(Rn)} 10+@+q option " bwl" optional */ 1336 1337/* Dissect user-input 'optext' (which is something like "@B^foo@bar(AP)[FP]:") 1338 using the vop in vopP. vopP's vop_access and vop_width. We fill _ndx, _reg, 1339 _mode, _short, _warn, _error, _expr_begin, _expr_end and _nbytes. */ 1340 1341static void 1342vip_op (char *optext, struct vop *vopP) 1343{ 1344 /* Track operand text forward. */ 1345 char *p; 1346 /* Track operand text backward. */ 1347 char *q; 1348 /* 1 if leading '@' ('*') seen. */ 1349 int at; 1350 /* one of " bilsw" */ 1351 char len; 1352 /* 1 if leading '#' ('$') seen. */ 1353 int hash; 1354 /* -1, 0 or +1. */ 1355 int sign = 0; 1356 /* 1 if () surround register. */ 1357 int paren = 0; 1358 /* Register number, -1:absent. */ 1359 int reg = 0; 1360 /* Index register number -1:absent. */ 1361 int ndx = 0; 1362 /* Report illegal operand, ""==OK. */ 1363 /* " " is a FAKE error: means we won. */ 1364 /* ANY err that begins with ' ' is a fake. */ 1365 /* " " is converted to "" before return. */ 1366 const char *err; 1367 /* Warn about weird modes pf address. */ 1368 const char *wrn; 1369 /* Preserve q in case we backup. */ 1370 char *oldq = NULL; 1371 /* Build up 4-bit operand mode here. */ 1372 /* Note: index mode is in ndx, this is. */ 1373 /* The major mode of operand address. */ 1374 int mode = 0; 1375 /* Notice how we move wrong-arg-type bugs INSIDE this module: if we 1376 get the types wrong below, we lose at compile time rather than at 1377 lint or run time. */ 1378 char access_mode; /* vop_access. */ 1379 1380 access_mode = vopP->vop_access; 1381 /* None of our code bugs (yet), no user text errors, no warnings 1382 even. */ 1383 err = wrn = 0; 1384 1385 p = optext; 1386 1387 if (*p == ' ') /* Expect all whitespace reduced to ' '. */ 1388 p++; /* skip over whitespace */ 1389 1390 if ((at = INDIRECTP (*p)) != 0) 1391 { /* 1 if *p=='@'(or '*' for Un*x) */ 1392 p++; /* at is determined */ 1393 if (*p == ' ') /* Expect all whitespace reduced to ' '. */ 1394 p++; /* skip over whitespace */ 1395 } 1396 1397 /* This code is subtle. It tries to detect all legal (letter)'^' 1398 but it doesn't waste time explicitly testing for premature '\0' because 1399 this case is rejected as a mismatch against either (letter) or '^'. */ 1400 { 1401 char c; 1402 1403 c = *p; 1404 c = TOLOWER (c); 1405 if (DISPLENP (p[1]) && strchr ("bilws", len = c)) 1406 p += 2; /* Skip (letter) '^'. */ 1407 else /* No (letter) '^' seen. */ 1408 len = ' '; /* Len is determined. */ 1409 } 1410 1411 if (*p == ' ') /* Expect all whitespace reduced to ' '. */ 1412 p++; 1413 1414 if ((hash = IMMEDIATEP (*p)) != 0) /* 1 if *p=='#' ('$' for Un*x) */ 1415 p++; /* Hash is determined. */ 1416 1417 /* p points to what may be the beginning of an expression. 1418 We have peeled off the front all that is peelable. 1419 We know at, len, hash. 1420 1421 Lets point q at the end of the text and parse that (backwards). */ 1422 1423 for (q = p; *q; q++) 1424 ; 1425 q--; /* Now q points at last char of text. */ 1426 1427 if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */ 1428 q--; 1429 1430 /* Reverse over whitespace, but don't. */ 1431 /* Run back over *p. */ 1432 1433 /* As a matter of policy here, we look for [Rn], although both Rn and S^# 1434 forbid [Rn]. This is because it is easy, and because only a sick 1435 cyborg would have [...] trailing an expression in a VAX-like assembler. 1436 A meticulous parser would first check for Rn followed by '(' or '[' 1437 and not parse a trailing ']' if it found another. We just ban expressions 1438 ending in ']'. */ 1439 if (*q == ']') 1440 { 1441 while (q >= p && *q != '[') 1442 q--; 1443 /* Either q<p or we got matching '['. */ 1444 if (q < p) 1445 err = _("no '[' to match ']'"); 1446 else 1447 { 1448 /* Confusers like "[]" will eventually lose with a bad register 1449 * name error. So again we don't need to check for early '\0'. */ 1450 if (q[3] == ']') 1451 ndx = vax_reg_parse (q[1], q[2], 0, 0); 1452 else if (q[4] == ']') 1453 ndx = vax_reg_parse (q[1], q[2], q[3], 0); 1454 else if (q[5] == ']') 1455 ndx = vax_reg_parse (q[1], q[2], q[3], q[4]); 1456 else 1457 ndx = -1; 1458 /* Since we saw a ']' we will demand a register name in the []. 1459 * If luser hasn't given us one: be rude. */ 1460 if (ndx < 0) 1461 err = _("bad register in []"); 1462 else if (ndx == PC) 1463 err = _("[PC] index banned"); 1464 else 1465 /* Point q just before "[...]". */ 1466 q--; 1467 } 1468 } 1469 else 1470 /* No ']', so no iNDeX register. */ 1471 ndx = -1; 1472 1473 /* If err = "..." then we lost: run away. 1474 Otherwise ndx == -1 if there was no "[...]". 1475 Otherwise, ndx is index register number, and q points before "[...]". */ 1476 1477 if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */ 1478 q--; 1479 /* Reverse over whitespace, but don't. */ 1480 /* Run back over *p. */ 1481 if (!err || !*err) 1482 { 1483 /* no ()+ or -() seen yet */ 1484 sign = 0; 1485 1486 if (q > p + 3 && *q == '+' && q[-1] == ')') 1487 { 1488 sign = 1; /* we saw a ")+" */ 1489 q--; /* q points to ')' */ 1490 } 1491 1492 if (*q == ')' && q > p + 2) 1493 { 1494 paren = 1; /* assume we have "(...)" */ 1495 while (q >= p && *q != '(') 1496 q--; 1497 /* either q<p or we got matching '(' */ 1498 if (q < p) 1499 err = _("no '(' to match ')'"); 1500 else 1501 { 1502 /* Confusers like "()" will eventually lose with a bad register 1503 name error. So again we don't need to check for early '\0'. */ 1504 if (q[3] == ')') 1505 reg = vax_reg_parse (q[1], q[2], 0, 0); 1506 else if (q[4] == ')') 1507 reg = vax_reg_parse (q[1], q[2], q[3], 0); 1508 else if (q[5] == ')') 1509 reg = vax_reg_parse (q[1], q[2], q[3], q[4]); 1510 else 1511 reg = -1; 1512 /* Since we saw a ')' we will demand a register name in the ')'. 1513 This is nasty: why can't our hypothetical assembler permit 1514 parenthesised expressions? BECAUSE I AM LAZY! That is why. 1515 Abuse luser if we didn't spy a register name. */ 1516 if (reg < 0) 1517 { 1518 /* JF allow parenthesized expressions. I hope this works. */ 1519 paren = 0; 1520 while (*q != ')') 1521 q++; 1522 /* err = "unknown register in ()"; */ 1523 } 1524 else 1525 q--; /* point just before '(' of "(...)" */ 1526 /* If err == "..." then we lost. Run away. 1527 Otherwise if reg >= 0 then we saw (Rn). */ 1528 } 1529 /* If err == "..." then we lost. 1530 Otherwise paren==1 and reg = register in "()". */ 1531 } 1532 else 1533 paren = 0; 1534 /* If err == "..." then we lost. 1535 Otherwise, q points just before "(Rn)", if any. 1536 If there was a "(...)" then paren==1, and reg is the register. */ 1537 1538 /* We should only seek '-' of "-(...)" if: 1539 we saw "(...)" paren == 1 1540 we have no errors so far ! *err 1541 we did not see '+' of "(...)+" sign < 1 1542 We don't check len. We want a specific error message later if 1543 user tries "x^...-(Rn)". This is a feature not a bug. */ 1544 if (!err || !*err) 1545 { 1546 if (paren && sign < 1)/* !sign is adequate test */ 1547 { 1548 if (*q == '-') 1549 { 1550 sign = -1; 1551 q--; 1552 } 1553 } 1554 /* We have back-tracked over most 1555 of the crud at the end of an operand. 1556 Unless err, we know: sign, paren. If paren, we know reg. 1557 The last case is of an expression "Rn". 1558 This is worth hunting for if !err, !paren. 1559 We wouldn't be here if err. 1560 We remember to save q, in case we didn't want "Rn" anyway. */ 1561 if (!paren) 1562 { 1563 if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */ 1564 q--; 1565 /* Reverse over whitespace, but don't. */ 1566 /* Run back over *p. */ 1567 /* Room for Rn or Rnn (include prefix) exactly? */ 1568 if (q > p && q < p + 4) 1569 reg = vax_reg_parse (p[0], p[1], 1570 q < p + 2 ? 0 : p[2], 1571 q < p + 3 ? 0 : p[3]); 1572 else 1573 reg = -1; /* Always comes here if no register at all. */ 1574 /* Here with a definitive reg value. */ 1575 if (reg >= 0) 1576 { 1577 oldq = q; 1578 q = p - 1; 1579 } 1580 } 1581 } 1582 } 1583 /* have reg. -1:absent; else 0:15. */ 1584 1585 /* We have: err, at, len, hash, ndx, sign, paren, reg. 1586 Also, any remaining expression is from *p through *q inclusive. 1587 Should there be no expression, q==p-1. So expression length = q-p+1. 1588 This completes the first part: parsing the operand text. */ 1589 1590 /* We now want to boil the data down, checking consistency on the way. 1591 We want: len, mode, reg, ndx, err, p, q, wrn, bug. 1592 We will deliver a 4-bit reg, and a 4-bit mode. */ 1593 1594 /* Case of branch operand. Different. No L^B^W^I^S^ allowed for instance. 1595 1596 in: at ? 1597 len ? 1598 hash ? 1599 p:q ? 1600 sign ? 1601 paren ? 1602 reg ? 1603 ndx ? 1604 1605 out: mode 0 1606 reg -1 1607 len ' ' 1608 p:q whatever was input 1609 ndx -1 1610 err " " or error message, and other outputs trashed. */ 1611 /* Branch operands have restricted forms. */ 1612 if ((!err || !*err) && access_mode == 'b') 1613 { 1614 if (at || hash || sign || paren || ndx >= 0 || reg >= 0 || len != ' ') 1615 err = _("invalid branch operand"); 1616 else 1617 err = " "; 1618 } 1619 1620 /* Since nobody seems to use it: comment this 'feature'(?) out for now. */ 1621#ifdef NEVER 1622 /* Case of stand-alone operand. e.g. ".long foo" 1623 1624 in: at ? 1625 len ? 1626 hash ? 1627 p:q ? 1628 sign ? 1629 paren ? 1630 reg ? 1631 ndx ? 1632 1633 out: mode 0 1634 reg -1 1635 len ' ' 1636 p:q whatever was input 1637 ndx -1 1638 err " " or error message, and other outputs trashed. */ 1639 if ((!err || !*err) && access_mode == ' ') 1640 { 1641 if (at) 1642 err = _("address prohibits @"); 1643 else if (hash) 1644 err = _("address prohibits #"); 1645 else if (sign) 1646 { 1647 if (sign < 0) 1648 err = _("address prohibits -()"); 1649 else 1650 err = _("address prohibits ()+"); 1651 } 1652 else if (paren) 1653 err = _("address prohibits ()"); 1654 else if (ndx >= 0) 1655 err = _("address prohibits []"); 1656 else if (reg >= 0) 1657 err = _("address prohibits register"); 1658 else if (len != ' ') 1659 err = _("address prohibits displacement length specifier"); 1660 else 1661 { 1662 err = " "; /* succeed */ 1663 mode = 0; 1664 } 1665 } 1666#endif 1667 1668 /* Case of S^#. 1669 1670 in: at 0 1671 len 's' definition 1672 hash 1 demand 1673 p:q demand not empty 1674 sign 0 by paren==0 1675 paren 0 by "()" scan logic because "S^" seen 1676 reg -1 or nn by mistake 1677 ndx -1 1678 1679 out: mode 0 1680 reg -1 1681 len 's' 1682 exp 1683 ndx -1 */ 1684 if ((!err || !*err) && len == 's') 1685 { 1686 if (!hash || paren || at || ndx >= 0) 1687 err = _("invalid operand of S^#"); 1688 else 1689 { 1690 if (reg >= 0) 1691 { 1692 /* Darn! we saw S^#Rnn ! put the Rnn back in 1693 expression. KLUDGE! Use oldq so we don't 1694 need to know exact length of reg name. */ 1695 q = oldq; 1696 reg = 0; 1697 } 1698 /* We have all the expression we will ever get. */ 1699 if (p > q) 1700 err = _("S^# needs expression"); 1701 else if (access_mode == 'r') 1702 { 1703 err = " "; /* WIN! */ 1704 mode = 0; 1705 } 1706 else 1707 err = _("S^# may only read-access"); 1708 } 1709 } 1710 1711 /* Case of -(Rn), which is weird case. 1712 1713 in: at 0 1714 len ' 1715 hash 0 1716 p:q q<p 1717 sign -1 by definition 1718 paren 1 by definition 1719 reg present by definition 1720 ndx optional 1721 1722 out: mode 7 1723 reg present 1724 len ' ' 1725 exp "" enforce empty expression 1726 ndx optional warn if same as reg. */ 1727 if ((!err || !*err) && sign < 0) 1728 { 1729 if (len != ' ' || hash || at || p <= q) 1730 err = _("invalid operand of -()"); 1731 else 1732 { 1733 err = " "; /* win */ 1734 mode = 7; 1735 if (reg == PC) 1736 wrn = _("-(PC) unpredictable"); 1737 else if (reg == ndx) 1738 wrn = _("[]index same as -()register: unpredictable"); 1739 } 1740 } 1741 1742 /* We convert "(Rn)" to "@Rn" for our convenience. 1743 (I hope this is convenient: has someone got a better way to parse this?) 1744 A side-effect of this is that "@Rn" is a valid operand. */ 1745 if (paren && !sign && !hash && !at && len == ' ' && p > q) 1746 { 1747 at = 1; 1748 paren = 0; 1749 } 1750 1751 /* Case of (Rn)+, which is slightly different. 1752 1753 in: at 1754 len ' ' 1755 hash 0 1756 p:q q<p 1757 sign +1 by definition 1758 paren 1 by definition 1759 reg present by definition 1760 ndx optional 1761 1762 out: mode 8+@ 1763 reg present 1764 len ' ' 1765 exp "" enforce empty expression 1766 ndx optional warn if same as reg. */ 1767 if ((!err || !*err) && sign > 0) 1768 { 1769 if (len != ' ' || hash || p <= q) 1770 err = _("invalid operand of ()+"); 1771 else 1772 { 1773 err = " "; /* win */ 1774 mode = 8 + (at ? 1 : 0); 1775 if (reg == PC) 1776 wrn = _("(PC)+ unpredictable"); 1777 else if (reg == ndx) 1778 wrn = _("[]index same as ()+register: unpredictable"); 1779 } 1780 } 1781 1782 /* Case of #, without S^. 1783 1784 in: at 1785 len ' ' or 'i' 1786 hash 1 by definition 1787 p:q 1788 sign 0 1789 paren 0 1790 reg absent 1791 ndx optional 1792 1793 out: mode 8+@ 1794 reg PC 1795 len ' ' or 'i' 1796 exp 1797 ndx optional. */ 1798 if ((!err || !*err) && hash) 1799 { 1800 if (len != 'i' && len != ' ') 1801 err = _("# conflicts length"); 1802 else if (paren) 1803 err = _("# bars register"); 1804 else 1805 { 1806 if (reg >= 0) 1807 { 1808 /* Darn! we saw #Rnn! Put the Rnn back into the expression. 1809 By using oldq, we don't need to know how long Rnn was. 1810 KLUDGE! */ 1811 q = oldq; 1812 reg = -1; /* No register any more. */ 1813 } 1814 err = " "; /* Win. */ 1815 1816 /* JF a bugfix, I think! */ 1817 if (at && access_mode == 'a') 1818 vopP->vop_nbytes = 4; 1819 1820 mode = (at ? 9 : 8); 1821 reg = PC; 1822 if ((access_mode == 'm' || access_mode == 'w') && !at) 1823 wrn = _("writing or modifying # is unpredictable"); 1824 } 1825 } 1826 /* If !*err, then sign == 0 1827 hash == 0 */ 1828 1829 /* Case of Rn. We separate this one because it has a few special 1830 errors the remaining modes lack. 1831 1832 in: at optional 1833 len ' ' 1834 hash 0 by program logic 1835 p:q empty 1836 sign 0 by program logic 1837 paren 0 by definition 1838 reg present by definition 1839 ndx optional 1840 1841 out: mode 5+@ 1842 reg present 1843 len ' ' enforce no length 1844 exp "" enforce empty expression 1845 ndx optional warn if same as reg. */ 1846 if ((!err || !*err) && !paren && reg >= 0) 1847 { 1848 if (len != ' ') 1849 err = _("length not needed"); 1850 else if (at) 1851 { 1852 err = " "; /* win */ 1853 mode = 6; /* @Rn */ 1854 } 1855 else if (ndx >= 0) 1856 err = _("can't []index a register, because it has no address"); 1857 else if (access_mode == 'a') 1858 err = _("a register has no address"); 1859 else 1860 { 1861 /* Idea here is to detect from length of datum 1862 and from register number if we will touch PC. 1863 Warn if we do. 1864 vop_nbytes is number of bytes in operand. 1865 Compute highest byte affected, compare to PC0. */ 1866 if ((vopP->vop_nbytes + reg * 4) > 60) 1867 wrn = _("PC part of operand unpredictable"); 1868 err = " "; /* win */ 1869 mode = 5; /* Rn */ 1870 } 1871 } 1872 /* If !*err, sign == 0 1873 hash == 0 1874 paren == 1 OR reg==-1 */ 1875 1876 /* Rest of cases fit into one bunch. 1877 1878 in: at optional 1879 len ' ' or 'b' or 'w' or 'l' 1880 hash 0 by program logic 1881 p:q expected (empty is not an error) 1882 sign 0 by program logic 1883 paren optional 1884 reg optional 1885 ndx optional 1886 1887 out: mode 10 + @ + len 1888 reg optional 1889 len ' ' or 'b' or 'w' or 'l' 1890 exp maybe empty 1891 ndx optional warn if same as reg. */ 1892 if (!err || !*err) 1893 { 1894 err = " "; /* win (always) */ 1895 mode = 10 + (at ? 1 : 0); 1896 switch (len) 1897 { 1898 case 'l': 1899 mode += 2; 1900 /* Fall through. */ 1901 case 'w': 1902 mode += 2; 1903 /* Fall through. */ 1904 case ' ': /* Assumed B^ until our caller changes it. */ 1905 case 'b': 1906 break; 1907 } 1908 } 1909 1910 /* here with completely specified mode 1911 len 1912 reg 1913 expression p,q 1914 ndx. */ 1915 1916 if (*err == ' ') 1917 err = 0; /* " " is no longer an error. */ 1918 1919 vopP->vop_mode = mode; 1920 vopP->vop_reg = reg; 1921 vopP->vop_short = len; 1922 vopP->vop_expr_begin = p; 1923 vopP->vop_expr_end = q; 1924 vopP->vop_ndx = ndx; 1925 vopP->vop_error = err; 1926 vopP->vop_warn = wrn; 1927} 1928 1929/* This converts a string into a vax instruction. 1930 The string must be a bare single instruction in dec-vax (with BSD4 frobs) 1931 format. 1932 It provides some error messages: at most one fatal error message (which 1933 stops the scan) and at most one warning message for each operand. 1934 The vax instruction is returned in exploded form, since we have no 1935 knowledge of how you parse (or evaluate) your expressions. 1936 We do however strip off and decode addressing modes and operation 1937 mnemonic. 1938 1939 The exploded instruction is returned to a struct vit of your choice. 1940 #include "vax-inst.h" to know what a struct vit is. 1941 1942 This function's value is a string. If it is not "" then an internal 1943 logic error was found: read this code to assign meaning to the string. 1944 No argument string should generate such an error string: 1945 it means a bug in our code, not in the user's text. 1946 1947 You MUST have called vip_begin() once before using this function. */ 1948 1949static void 1950vip (struct vit *vitP, /* We build an exploded instruction here. */ 1951 char *instring) /* Text of a vax instruction: we modify. */ 1952{ 1953 /* How to bit-encode this opcode. */ 1954 struct vot_wot *vwP; 1955 /* 1/skip whitespace.2/scan vot_how */ 1956 char *p; 1957 char *q; 1958 /* counts number of operands seen */ 1959 unsigned char count; 1960 /* scan operands in struct vit */ 1961 struct vop *operandp; 1962 /* error over all operands */ 1963 const char *alloperr; 1964 /* Remember char, (we clobber it with '\0' temporarily). */ 1965 char c; 1966 /* Op-code of this instruction. */ 1967 vax_opcodeT oc; 1968 1969 if (*instring == ' ') 1970 ++instring; 1971 1972 /* MUST end in end-of-string or exactly 1 space. */ 1973 for (p = instring; *p && *p != ' '; p++) 1974 ; 1975 1976 /* Scanned up to end of operation-code. */ 1977 /* Operation-code is ended with whitespace. */ 1978 if (p - instring == 0) 1979 { 1980 vitP->vit_error = _("No operator"); 1981 count = 0; 1982 memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode)); 1983 } 1984 else 1985 { 1986 c = *p; 1987 *p = '\0'; 1988 /* Here with instring pointing to what better be an op-name, and p 1989 pointing to character just past that. 1990 We trust instring points to an op-name, with no whitespace. */ 1991 vwP = (struct vot_wot *) str_hash_find (op_hash, instring); 1992 /* Restore char after op-code. */ 1993 *p = c; 1994 if (vwP == 0) 1995 { 1996 vitP->vit_error = _("Unknown operator"); 1997 count = 0; 1998 memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode)); 1999 } 2000 else 2001 { 2002 /* We found a match! So let's pick up as many operands as the 2003 instruction wants, and even gripe if there are too many. 2004 We expect comma to separate each operand. 2005 We let instring track the text, while p tracks a part of the 2006 struct vot. */ 2007 const char *howp; 2008 /* The lines below know about 2-byte opcodes starting FD,FE or FF. 2009 They also understand synthetic opcodes. Note: 2010 we return 32 bits of opcode, including bucky bits, BUT 2011 an opcode length is either 8 or 16 bits for vit_opcode_nbytes. */ 2012 oc = vwP->vot_code; /* The op-code. */ 2013 vitP->vit_opcode_nbytes = (oc & 0xFF) >= 0xFD ? 2 : 1; 2014 md_number_to_chars (vitP->vit_opcode, oc, 4); 2015 count = 0; /* No operands seen yet. */ 2016 instring = p; /* Point just past operation code. */ 2017 alloperr = ""; 2018 for (howp = vwP->vot_how, operandp = vitP->vit_operand; 2019 !(alloperr && *alloperr) && *howp; 2020 operandp++, howp += 2) 2021 { 2022 /* Here to parse one operand. Leave instring pointing just 2023 past any one ',' that marks the end of this operand. */ 2024 if (!howp[1]) 2025 as_fatal (_("odd number of bytes in operand description")); 2026 else if (*instring) 2027 { 2028 for (q = instring; (c = *q) && c != ','; q++) 2029 ; 2030 /* Q points to ',' or '\0' that ends argument. C is that 2031 character. */ 2032 *q = 0; 2033 operandp->vop_width = howp[1]; 2034 operandp->vop_nbytes = vax_operand_width_size[(unsigned) howp[1]]; 2035 operandp->vop_access = howp[0]; 2036 vip_op (instring, operandp); 2037 *q = c; /* Restore input text. */ 2038 if (operandp->vop_error) 2039 alloperr = _("Bad operand"); 2040 instring = q + (c ? 1 : 0); /* Next operand (if any). */ 2041 count++; /* Won another argument, may have an operr. */ 2042 } 2043 else 2044 alloperr = _("Not enough operands"); 2045 } 2046 if (!*alloperr) 2047 { 2048 if (*instring == ' ') 2049 instring++; 2050 if (*instring) 2051 alloperr = _("Too many operands"); 2052 } 2053 vitP->vit_error = alloperr; 2054 } 2055 } 2056 vitP->vit_operands = count; 2057} 2058 2059#ifdef test 2060 2061/* Test program for above. */ 2062 2063struct vit myvit; /* Build an exploded vax instruction here. */ 2064char answer[100]; /* Human types a line of vax assembler here. */ 2065char *mybug; /* "" or an internal logic diagnostic. */ 2066int mycount; /* Number of operands. */ 2067struct vop *myvop; /* Scan operands from myvit. */ 2068int mysynth; /* 1 means want synthetic opcodes. */ 2069char my_immediate[200]; 2070char my_indirect[200]; 2071char my_displen[200]; 2072 2073int 2074main (void) 2075{ 2076 char *p; 2077 2078 printf ("0 means no synthetic instructions. "); 2079 printf ("Value for vip_begin? "); 2080 gets (answer); 2081 sscanf (answer, "%d", &mysynth); 2082 printf ("Synthetic opcodes %s be included.\n", mysynth ? "will" : "will not"); 2083 printf ("enter immediate symbols eg enter # "); 2084 gets (my_immediate); 2085 printf ("enter indirect symbols eg enter @ "); 2086 gets (my_indirect); 2087 printf ("enter displen symbols eg enter ^ "); 2088 gets (my_displen); 2089 2090 vip_begin (mysynth, my_immediate, my_indirect, my_displen) 2091 2092 printf ("An empty input line will quit you from the vax instruction parser\n"); 2093 for (;;) 2094 { 2095 printf ("vax instruction: "); 2096 fflush (stdout); 2097 gets (answer); 2098 if (!*answer) 2099 break; /* Out of for each input text loop. */ 2100 2101 vip (& myvit, answer); 2102 if (*myvit.vit_error) 2103 printf ("ERR:\"%s\"\n", myvit.vit_error); 2104 2105 printf ("opcode="); 2106 for (mycount = myvit.vit_opcode_nbytes, p = myvit.vit_opcode; 2107 mycount; 2108 mycount--, p++) 2109 printf ("%02x ", *p & 0xFF); 2110 2111 printf (" operand count=%d.\n", mycount = myvit.vit_operands); 2112 for (myvop = myvit.vit_operand; mycount; mycount--, myvop++) 2113 { 2114 printf ("mode=%xx reg=%xx ndx=%xx len='%c'=%c%c%d. expr=\"", 2115 myvop->vop_mode, myvop->vop_reg, myvop->vop_ndx, 2116 myvop->vop_short, myvop->vop_access, myvop->vop_width, 2117 myvop->vop_nbytes); 2118 for (p = myvop->vop_expr_begin; p <= myvop->vop_expr_end; p++) 2119 putchar (*p); 2120 2121 printf ("\"\n"); 2122 if (myvop->vop_error) 2123 printf (" err:\"%s\"\n", myvop->vop_error); 2124 2125 if (myvop->vop_warn) 2126 printf (" wrn:\"%s\"\n", myvop->vop_warn); 2127 } 2128 } 2129 vip_end (); 2130 exit (EXIT_SUCCESS); 2131} 2132 2133#endif 2134 2135#ifdef TEST /* #Define to use this testbed. */ 2136 2137/* Follows a test program for this function. 2138 We declare arrays non-local in case some of our tiny-minded machines 2139 default to small stacks. Also, helps with some debuggers. */ 2140 2141char answer[100]; /* Human types into here. */ 2142char *p; /* */ 2143char *myerr; 2144char *mywrn; 2145char *mybug; 2146char myaccess; 2147char mywidth; 2148char mymode; 2149char myreg; 2150char mylen; 2151char *myleft; 2152char *myright; 2153char myndx; 2154int my_operand_length; 2155char my_immediate[200]; 2156char my_indirect[200]; 2157char my_displen[200]; 2158 2159int 2160main (void) 2161{ 2162 printf ("enter immediate symbols eg enter # "); 2163 gets (my_immediate); 2164 printf ("enter indirect symbols eg enter @ "); 2165 gets (my_indirect); 2166 printf ("enter displen symbols eg enter ^ "); 2167 gets (my_displen); 2168 vip_op_defaults (my_immediate, my_indirect, my_displen); 2169 2170 for (;;) 2171 { 2172 printf ("access,width (eg 'ab' or 'wh') [empty line to quit] : "); 2173 fflush (stdout); 2174 gets (answer); 2175 if (!answer[0]) 2176 exit (EXIT_SUCCESS); 2177 myaccess = answer[0]; 2178 mywidth = answer[1]; 2179 switch (mywidth) 2180 { 2181 case 'b': 2182 my_operand_length = 1; 2183 break; 2184 case 'd': 2185 my_operand_length = 8; 2186 break; 2187 case 'f': 2188 my_operand_length = 4; 2189 break; 2190 case 'g': 2191 my_operand_length = 16; 2192 break; 2193 case 'h': 2194 my_operand_length = 32; 2195 break; 2196 case 'l': 2197 my_operand_length = 4; 2198 break; 2199 case 'o': 2200 my_operand_length = 16; 2201 break; 2202 case 'q': 2203 my_operand_length = 8; 2204 break; 2205 case 'w': 2206 my_operand_length = 2; 2207 break; 2208 case '!': 2209 case '?': 2210 case '-': 2211 my_operand_length = 0; 2212 break; 2213 2214 default: 2215 my_operand_length = 2; 2216 printf ("I don't understand access width %c\n", mywidth); 2217 break; 2218 } 2219 printf ("VAX assembler instruction operand: "); 2220 fflush (stdout); 2221 gets (answer); 2222 mybug = vip_op (answer, myaccess, mywidth, my_operand_length, 2223 &mymode, &myreg, &mylen, &myleft, &myright, &myndx, 2224 &myerr, &mywrn); 2225 if (*myerr) 2226 { 2227 printf ("error: \"%s\"\n", myerr); 2228 if (*mybug) 2229 printf (" bug: \"%s\"\n", mybug); 2230 } 2231 else 2232 { 2233 if (*mywrn) 2234 printf ("warning: \"%s\"\n", mywrn); 2235 mumble ("mode", mymode); 2236 mumble ("register", myreg); 2237 mumble ("index", myndx); 2238 printf ("width:'%c' ", mylen); 2239 printf ("expression: \""); 2240 while (myleft <= myright) 2241 putchar (*myleft++); 2242 printf ("\"\n"); 2243 } 2244 } 2245} 2246 2247void 2248mumble (char *text, int value) 2249{ 2250 printf ("%s:", text); 2251 if (value >= 0) 2252 printf ("%xx", value); 2253 else 2254 printf ("ABSENT"); 2255 printf (" "); 2256} 2257 2258#endif 2259 2260int md_short_jump_size = 3; 2261int md_long_jump_size = 6; 2262 2263void 2264md_create_short_jump (char *ptr, 2265 addressT from_addr, 2266 addressT to_addr ATTRIBUTE_UNUSED, 2267 fragS *frag ATTRIBUTE_UNUSED, 2268 symbolS *to_symbol ATTRIBUTE_UNUSED) 2269{ 2270 valueT offset; 2271 2272 /* This former calculation was off by two: 2273 offset = to_addr - (from_addr + 1); 2274 We need to account for the one byte instruction and also its 2275 two byte operand. */ 2276 offset = to_addr - (from_addr + 1 + 2); 2277 *ptr++ = VAX_BRW; /* Branch with word (16 bit) offset. */ 2278 md_number_to_chars (ptr, offset, 2); 2279} 2280 2281void 2282md_create_long_jump (char *ptr, 2283 addressT from_addr, 2284 addressT to_addr, 2285 fragS *frag ATTRIBUTE_UNUSED, 2286 symbolS *to_symbol ATTRIBUTE_UNUSED) 2287{ 2288 valueT offset; 2289 2290 /* Account for 1 byte instruction, 1 byte of address specifier and 2291 4 bytes of offset from PC. */ 2292 offset = to_addr - (from_addr + 1 + 1 + 4); 2293 *ptr++ = VAX_JMP; 2294 *ptr++ = VAX_PC_RELATIVE_MODE; 2295 md_number_to_chars (ptr, offset, 4); 2296} 2297 2298#ifdef OBJ_VMS 2299const char *md_shortopts = "d:STt:V+1h:Hv::"; 2300#elif defined(OBJ_ELF) 2301const char *md_shortopts = "d:STt:VkKQ:"; 2302#else 2303const char *md_shortopts = "d:STt:V"; 2304#endif 2305struct option md_longopts[] = 2306{ 2307#ifdef OBJ_ELF 2308#define OPTION_PIC (OPTION_MD_BASE) 2309 { "pic", no_argument, NULL, OPTION_PIC }, 2310#endif 2311 { NULL, no_argument, NULL, 0 } 2312}; 2313size_t md_longopts_size = sizeof (md_longopts); 2314 2315int 2316md_parse_option (int c, const char *arg) 2317{ 2318 switch (c) 2319 { 2320 case 'S': 2321 as_warn (_("SYMBOL TABLE not implemented")); 2322 break; 2323 2324 case 'T': 2325 as_warn (_("TOKEN TRACE not implemented")); 2326 break; 2327 2328 case 'd': 2329 as_warn (_("Displacement length %s ignored!"), arg); 2330 break; 2331 2332 case 't': 2333 as_warn (_("I don't need or use temp. file \"%s\"."), arg); 2334 break; 2335 2336 case 'V': 2337 as_warn (_("I don't use an interpass file! -V ignored")); 2338 break; 2339 2340#ifdef OBJ_VMS 2341 case '+': /* For g++. Hash any name > 31 chars long. */ 2342 flag_hash_long_names = 1; 2343 break; 2344 2345 case '1': /* For backward compatibility. */ 2346 flag_one = 1; 2347 break; 2348 2349 case 'H': /* Show new symbol after hash truncation. */ 2350 flag_show_after_trunc = 1; 2351 break; 2352 2353 case 'h': /* No hashing of mixed-case names. */ 2354 { 2355 extern char vms_name_mapping; 2356 vms_name_mapping = atoi (arg); 2357 flag_no_hash_mixed_case = 1; 2358 } 2359 break; 2360 2361 case 'v': 2362 { 2363 extern char *compiler_version_string; 2364 2365 if (!arg || !*arg || access (arg, 0) == 0) 2366 return 0; /* Have caller show the assembler version. */ 2367 compiler_version_string = arg; 2368 } 2369 break; 2370#endif 2371 2372#ifdef OBJ_ELF 2373 case OPTION_PIC: 2374 case 'k': 2375 flag_want_pic = 1; 2376 break; /* -pic, Position Independent Code. */ 2377 2378 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment 2379 section should be emitted or not. FIXME: Not implemented. */ 2380 case 'Q': 2381 break; 2382#endif 2383 2384 default: 2385 return 0; 2386 } 2387 2388 return 1; 2389} 2390 2391void 2392md_show_usage (FILE *stream) 2393{ 2394 fprintf (stream, _("\ 2395VAX options:\n\ 2396-d LENGTH ignored\n\ 2397-J ignored\n\ 2398-S ignored\n\ 2399-t FILE ignored\n\ 2400-T ignored\n\ 2401-V ignored\n")); 2402#ifdef OBJ_VMS 2403 fprintf (stream, _("\ 2404VMS options:\n\ 2405-+ hash encode names longer than 31 characters\n\ 2406-1 `const' handling compatible with gcc 1.x\n\ 2407-H show new symbol after hash truncation\n\ 2408-h NUM don't hash mixed-case names, and adjust case:\n\ 2409 0 = upper, 2 = lower, 3 = preserve case\n\ 2410-v\"VERSION\" code being assembled was produced by compiler \"VERSION\"\n")); 2411#endif 2412} 2413 2414/* We have no need to default values of symbols. */ 2415 2416symbolS * 2417md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 2418{ 2419 return NULL; 2420} 2421 2422/* Round up a section size to the appropriate boundary. */ 2423valueT 2424md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size) 2425{ 2426 /* Byte alignment is fine */ 2427 return size; 2428} 2429 2430/* Exactly what point is a PC-relative offset relative TO? 2431 On the vax, they're relative to the address of the offset, plus 2432 its size. */ 2433long 2434md_pcrel_from (fixS *fixP) 2435{ 2436 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address; 2437} 2438 2439arelent * 2440tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) 2441{ 2442 arelent *reloc; 2443 bfd_reloc_code_real_type code; 2444 2445 if (fixp->fx_tcbit) 2446 abort (); 2447 2448 if (fixp->fx_r_type != NO_RELOC) 2449 { 2450 code = fixp->fx_r_type; 2451 2452 if (fixp->fx_pcrel) 2453 { 2454 switch (code) 2455 { 2456 case BFD_RELOC_8_PCREL: 2457 case BFD_RELOC_16_PCREL: 2458 case BFD_RELOC_32_PCREL: 2459#ifdef OBJ_ELF 2460 case BFD_RELOC_8_GOT_PCREL: 2461 case BFD_RELOC_16_GOT_PCREL: 2462 case BFD_RELOC_32_GOT_PCREL: 2463 case BFD_RELOC_8_PLT_PCREL: 2464 case BFD_RELOC_16_PLT_PCREL: 2465 case BFD_RELOC_32_PLT_PCREL: 2466#endif 2467 break; 2468 default: 2469 as_bad_where (fixp->fx_file, fixp->fx_line, 2470 _("Cannot make %s relocation PC relative"), 2471 bfd_get_reloc_code_name (code)); 2472 } 2473 } 2474 } 2475 else 2476 { 2477#define F(SZ,PCREL) (((SZ) << 1) + (PCREL)) 2478 switch (F (fixp->fx_size, fixp->fx_pcrel)) 2479 { 2480#define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break 2481 MAP (1, 0, BFD_RELOC_8); 2482 MAP (2, 0, BFD_RELOC_16); 2483 MAP (4, 0, BFD_RELOC_32); 2484 MAP (1, 1, BFD_RELOC_8_PCREL); 2485 MAP (2, 1, BFD_RELOC_16_PCREL); 2486 MAP (4, 1, BFD_RELOC_32_PCREL); 2487 default: 2488 abort (); 2489 } 2490 } 2491#undef F 2492#undef MAP 2493 2494 reloc = XNEW (arelent); 2495 reloc->sym_ptr_ptr = XNEW (asymbol *); 2496 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 2497 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 2498#ifndef OBJ_ELF 2499 if (fixp->fx_pcrel) 2500 reloc->addend = fixp->fx_addnumber; 2501 else 2502 reloc->addend = 0; 2503#else 2504 reloc->addend = fixp->fx_offset; 2505#endif 2506 2507 reloc->howto = bfd_reloc_type_lookup (stdoutput, code); 2508 gas_assert (reloc->howto != 0); 2509 2510 return reloc; 2511} 2512 2513/* vax:md_assemble() emit frags for 1 instruction given in textual form. */ 2514void 2515md_assemble (char *instruction_string) 2516{ 2517 /* Non-zero if operand expression's segment is not known yet. */ 2518 int is_undefined; 2519 /* Non-zero if operand expression's segment is absolute. */ 2520 int is_absolute; 2521 int length_code; 2522 char *p; 2523 /* An operand. Scans all operands. */ 2524 struct vop *operandP; 2525 char *save_input_line_pointer; 2526 /* What used to live after an expression. */ 2527 char c_save; 2528 /* 1: instruction_string bad for all passes. */ 2529 int goofed; 2530 /* Points to slot just after last operand. */ 2531 struct vop *end_operandP; 2532 /* Points to expression values for this operand. */ 2533 expressionS *expP; 2534 segT *segP; 2535 2536 /* These refer to an instruction operand expression. */ 2537 /* Target segment of the address. */ 2538 segT to_seg; 2539 valueT this_add_number; 2540 /* Positive (minuend) symbol. */ 2541 symbolS *this_add_symbol; 2542 /* As a number. */ 2543 long opcode_as_number; 2544 /* Least significant byte 1st. */ 2545 char *opcode_as_chars; 2546 /* As an array of characters. */ 2547 /* Least significant byte 1st */ 2548 char *opcode_low_byteP; 2549 /* length (bytes) meant by vop_short. */ 2550 int length; 2551 /* 0, or 1 if '@' is in addressing mode. */ 2552 int at; 2553 /* From vop_nbytes: vax_operand_width (in bytes) */ 2554 int nbytes; 2555 FLONUM_TYPE *floatP; 2556 LITTLENUM_TYPE literal_float[8]; 2557 /* Big enough for any floating point literal. */ 2558 2559 vip (&v, instruction_string); 2560 2561 /* Now we try to find as many as_warn()s as we can. If we do any as_warn()s 2562 then goofed=1. Notice that we don't make any frags yet. 2563 Should goofed be 1, then this instruction will wedge in any pass, 2564 and we can safely flush it, without causing interpass symbol phase 2565 errors. That is, without changing label values in different passes. */ 2566 if ((goofed = (*v.vit_error)) != 0) 2567 { 2568 as_fatal (_("Ignoring statement due to \"%s\""), v.vit_error); 2569 } 2570 /* We need to use expression() and friends, which require us to diddle 2571 input_line_pointer. So we save it and restore it later. */ 2572 save_input_line_pointer = input_line_pointer; 2573 for (operandP = v.vit_operand, 2574 expP = exp_of_operand, 2575 segP = seg_of_operand, 2576 floatP = float_operand, 2577 end_operandP = v.vit_operand + v.vit_operands; 2578 2579 operandP < end_operandP; 2580 2581 operandP++, expP++, segP++, floatP++) 2582 { 2583 if (operandP->vop_error) 2584 { 2585 as_fatal (_("Aborting because statement has \"%s\""), operandP->vop_error); 2586 goofed = 1; 2587 } 2588 else 2589 { 2590 /* Statement has no syntax goofs: let's sniff the expression. */ 2591 int can_be_short = 0; /* 1 if a bignum can be reduced to a short literal. */ 2592 2593 input_line_pointer = operandP->vop_expr_begin; 2594 c_save = operandP->vop_expr_end[1]; 2595 operandP->vop_expr_end[1] = '\0'; 2596 /* If to_seg == SEG_PASS1, expression() will have set need_pass_2 = 1. */ 2597 *segP = expression (expP); 2598 switch (expP->X_op) 2599 { 2600 case O_absent: 2601 /* for BSD4.2 compatibility, missing expression is absolute 0 */ 2602 expP->X_op = O_constant; 2603 expP->X_add_number = 0; 2604 /* For SEG_ABSOLUTE, we shouldn't need to set X_op_symbol, 2605 X_add_symbol to any particular value. But, we will program 2606 defensively. Since this situation occurs rarely so it costs 2607 us little to do, and stops Dean worrying about the origin of 2608 random bits in expressionS's. */ 2609 expP->X_add_symbol = NULL; 2610 expP->X_op_symbol = NULL; 2611 break; 2612 2613 case O_symbol: 2614 case O_constant: 2615 break; 2616 2617 default: 2618 /* Major bug. We can't handle the case of a 2619 SEG_OP expression in a VIT_OPCODE_SYNTHETIC 2620 variable-length instruction. 2621 We don't have a frag type that is smart enough to 2622 relax a SEG_OP, and so we just force all 2623 SEG_OPs to behave like SEG_PASS1s. 2624 Clearly, if there is a demand we can invent a new or 2625 modified frag type and then coding up a frag for this 2626 case will be easy. SEG_OP was invented for the 2627 .words after a CASE opcode, and was never intended for 2628 instruction operands. */ 2629 need_pass_2 = 1; 2630 as_fatal (_("Can't relocate expression")); 2631 break; 2632 2633 case O_big: 2634 /* Preserve the bits. */ 2635 if (expP->X_add_number > 0) 2636 { 2637 bignum_copy (generic_bignum, expP->X_add_number, 2638 floatP->low, SIZE_OF_LARGE_NUMBER); 2639 } 2640 else 2641 { 2642 know (expP->X_add_number < 0); 2643 flonum_copy (&generic_floating_point_number, 2644 floatP); 2645 if (strchr ("s i", operandP->vop_short)) 2646 { 2647 /* Could possibly become S^# */ 2648 flonum_gen2vax (-expP->X_add_number, floatP, literal_float); 2649 switch (-expP->X_add_number) 2650 { 2651 case 'f': 2652 can_be_short = 2653 (literal_float[0] & 0xFC0F) == 0x4000 2654 && literal_float[1] == 0; 2655 break; 2656 2657 case 'd': 2658 can_be_short = 2659 (literal_float[0] & 0xFC0F) == 0x4000 2660 && literal_float[1] == 0 2661 && literal_float[2] == 0 2662 && literal_float[3] == 0; 2663 break; 2664 2665 case 'g': 2666 can_be_short = 2667 (literal_float[0] & 0xFF81) == 0x4000 2668 && literal_float[1] == 0 2669 && literal_float[2] == 0 2670 && literal_float[3] == 0; 2671 break; 2672 2673 case 'h': 2674 can_be_short = ((literal_float[0] & 0xFFF8) == 0x4000 2675 && (literal_float[1] & 0xE000) == 0 2676 && literal_float[2] == 0 2677 && literal_float[3] == 0 2678 && literal_float[4] == 0 2679 && literal_float[5] == 0 2680 && literal_float[6] == 0 2681 && literal_float[7] == 0); 2682 break; 2683 2684 default: 2685 BAD_CASE (-expP->X_add_number); 2686 break; 2687 } 2688 } 2689 } 2690 2691 if (operandP->vop_short == 's' 2692 || operandP->vop_short == 'i' 2693 || (operandP->vop_short == ' ' 2694 && operandP->vop_reg == 0xF 2695 && (operandP->vop_mode & 0xE) == 0x8)) 2696 { 2697 /* Saw a '#'. */ 2698 if (operandP->vop_short == ' ') 2699 { 2700 /* We must chose S^ or I^. */ 2701 if (expP->X_add_number > 0) 2702 { 2703 /* Bignum: Short literal impossible. */ 2704 operandP->vop_short = 'i'; 2705 operandP->vop_mode = 8; 2706 operandP->vop_reg = 0xF; /* VAX PC. */ 2707 } 2708 else 2709 { 2710 /* Flonum: Try to do it. */ 2711 if (can_be_short) 2712 { 2713 operandP->vop_short = 's'; 2714 operandP->vop_mode = 0; 2715 operandP->vop_ndx = -1; 2716 operandP->vop_reg = -1; 2717 expP->X_op = O_constant; 2718 } 2719 else 2720 { 2721 operandP->vop_short = 'i'; 2722 operandP->vop_mode = 8; 2723 operandP->vop_reg = 0xF; /* VAX PC */ 2724 } 2725 } /* bignum or flonum ? */ 2726 } /* if #, but no S^ or I^ seen. */ 2727 /* No more ' ' case: either 's' or 'i'. */ 2728 if (operandP->vop_short == 's') 2729 { 2730 /* Wants to be a short literal. */ 2731 if (expP->X_add_number > 0) 2732 { 2733 as_warn (_("Bignum not permitted in short literal. Immediate mode assumed.")); 2734 operandP->vop_short = 'i'; 2735 operandP->vop_mode = 8; 2736 operandP->vop_reg = 0xF; /* VAX PC. */ 2737 } 2738 else 2739 { 2740 if (!can_be_short) 2741 { 2742 as_warn (_("Can't do flonum short literal: immediate mode used.")); 2743 operandP->vop_short = 'i'; 2744 operandP->vop_mode = 8; 2745 operandP->vop_reg = 0xF; /* VAX PC. */ 2746 } 2747 else 2748 { 2749 /* Encode short literal now. */ 2750 int temp = 0; 2751 2752 switch (-expP->X_add_number) 2753 { 2754 case 'f': 2755 case 'd': 2756 temp = literal_float[0] >> 4; 2757 break; 2758 2759 case 'g': 2760 temp = literal_float[0] >> 1; 2761 break; 2762 2763 case 'h': 2764 temp = ((literal_float[0] << 3) & 070) 2765 | ((literal_float[1] >> 13) & 07); 2766 break; 2767 2768 default: 2769 BAD_CASE (-expP->X_add_number); 2770 break; 2771 } 2772 2773 floatP->low[0] = temp & 077; 2774 floatP->low[1] = 0; 2775 } 2776 } 2777 } 2778 else 2779 { 2780 /* I^# seen: set it up if float. */ 2781 if (expP->X_add_number < 0) 2782 { 2783 memcpy (floatP->low, literal_float, sizeof (literal_float)); 2784 } 2785 } /* if S^# seen. */ 2786 } 2787 else 2788 { 2789 as_warn (_("A bignum/flonum may not be a displacement: 0x%lx used"), 2790 (expP->X_add_number = 0x80000000L)); 2791 /* Chosen so luser gets the most offset bits to patch later. */ 2792 } 2793 expP->X_add_number = floatP->low[0] 2794 | ((LITTLENUM_MASK & (floatP->low[1])) << LITTLENUM_NUMBER_OF_BITS); 2795 2796 /* For the O_big case we have: 2797 If vop_short == 's' then a short floating literal is in the 2798 lowest 6 bits of floatP -> low [0], which is 2799 big_operand_bits [---] [0]. 2800 If vop_short == 'i' then the appropriate number of elements 2801 of big_operand_bits [---] [...] are set up with the correct 2802 bits. 2803 Also, just in case width is byte word or long, we copy the lowest 2804 32 bits of the number to X_add_number. */ 2805 break; 2806 } 2807 if (input_line_pointer != operandP->vop_expr_end + 1) 2808 { 2809 as_fatal ("Junk at end of expression \"%s\"", input_line_pointer); 2810 goofed = 1; 2811 } 2812 operandP->vop_expr_end[1] = c_save; 2813 } 2814 } 2815 2816 input_line_pointer = save_input_line_pointer; 2817 2818 if (need_pass_2 || goofed) 2819 return; 2820 2821 dwarf2_emit_insn (0); 2822 /* Emit op-code. */ 2823 /* Remember where it is, in case we want to modify the op-code later. */ 2824 opcode_low_byteP = frag_more (v.vit_opcode_nbytes); 2825 memcpy (opcode_low_byteP, v.vit_opcode, v.vit_opcode_nbytes); 2826 opcode_as_chars = v.vit_opcode; 2827 opcode_as_number = md_chars_to_number ((unsigned char *) opcode_as_chars, 4); 2828 for (operandP = v.vit_operand, 2829 expP = exp_of_operand, 2830 segP = seg_of_operand, 2831 floatP = float_operand, 2832 end_operandP = v.vit_operand + v.vit_operands; 2833 2834 operandP < end_operandP; 2835 2836 operandP++, 2837 floatP++, 2838 segP++, 2839 expP++) 2840 { 2841 if (operandP->vop_ndx >= 0) 2842 { 2843 /* Indexed addressing byte. */ 2844 /* Legality of indexed mode already checked: it is OK. */ 2845 FRAG_APPEND_1_CHAR (0x40 + operandP->vop_ndx); 2846 } /* if(vop_ndx>=0) */ 2847 2848 /* Here to make main operand frag(s). */ 2849 this_add_number = expP->X_add_number; 2850 this_add_symbol = expP->X_add_symbol; 2851 to_seg = *segP; 2852 is_undefined = (to_seg == undefined_section); 2853 is_absolute = (to_seg == absolute_section); 2854 at = operandP->vop_mode & 1; 2855 length = (operandP->vop_short == 'b' 2856 ? 1 : (operandP->vop_short == 'w' 2857 ? 2 : (operandP->vop_short == 'l' 2858 ? 4 : 0))); 2859 nbytes = operandP->vop_nbytes; 2860 if (operandP->vop_access == 'b') 2861 { 2862 if (to_seg == now_seg || is_undefined) 2863 { 2864 /* If is_undefined, then it might BECOME now_seg. */ 2865 if (nbytes) 2866 { 2867 p = frag_more (nbytes); 2868 fix_new (frag_now, p - frag_now->fr_literal, nbytes, 2869 this_add_symbol, this_add_number, 1, NO_RELOC); 2870 } 2871 else 2872 { 2873 /* to_seg==now_seg || to_seg == SEG_UNKNOWN */ 2874 /* nbytes==0 */ 2875 length_code = is_undefined ? STATE_UNDF : STATE_BYTE; 2876 if (opcode_as_number & VIT_OPCODE_SPECIAL) 2877 { 2878 if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP) 2879 { 2880 /* br or jsb */ 2881 frag_var (rs_machine_dependent, 5, 1, 2882 ENCODE_RELAX (STATE_ALWAYS_BRANCH, length_code), 2883 this_add_symbol, this_add_number, 2884 opcode_low_byteP); 2885 } 2886 else 2887 { 2888 if (operandP->vop_width == VAX_WIDTH_WORD_JUMP) 2889 { 2890 length_code = STATE_WORD; 2891 /* JF: There is no state_byte for this one! */ 2892 frag_var (rs_machine_dependent, 10, 2, 2893 ENCODE_RELAX (STATE_COMPLEX_BRANCH, length_code), 2894 this_add_symbol, this_add_number, 2895 opcode_low_byteP); 2896 } 2897 else 2898 { 2899 know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP); 2900 frag_var (rs_machine_dependent, 9, 1, 2901 ENCODE_RELAX (STATE_COMPLEX_HOP, length_code), 2902 this_add_symbol, this_add_number, 2903 opcode_low_byteP); 2904 } 2905 } 2906 } 2907 else 2908 { 2909 know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP); 2910 frag_var (rs_machine_dependent, 7, 1, 2911 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, length_code), 2912 this_add_symbol, this_add_number, 2913 opcode_low_byteP); 2914 } 2915 } 2916 } 2917 else 2918 { 2919 /* to_seg != now_seg && to_seg != SEG_UNKNOWN */ 2920 /* --- SEG FLOAT MAY APPEAR HERE --- */ 2921 if (is_absolute) 2922 { 2923 if (nbytes) 2924 { 2925 know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC)); 2926 p = frag_more (nbytes); 2927 /* Conventional relocation. */ 2928 fix_new (frag_now, p - frag_now->fr_literal, nbytes, 2929 section_symbol (absolute_section), 2930 this_add_number, 1, NO_RELOC); 2931 } 2932 else 2933 { 2934 know (opcode_as_number & VIT_OPCODE_SYNTHETIC); 2935 if (opcode_as_number & VIT_OPCODE_SPECIAL) 2936 { 2937 if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP) 2938 { 2939 /* br or jsb */ 2940 *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG; 2941 know (opcode_as_chars[1] == 0); 2942 p = frag_more (5); 2943 p[0] = VAX_ABSOLUTE_MODE; /* @#... */ 2944 md_number_to_chars (p + 1, this_add_number, 4); 2945 /* Now (eg) JMP @#foo or JSB @#foo. */ 2946 } 2947 else 2948 { 2949 if (operandP->vop_width == VAX_WIDTH_WORD_JUMP) 2950 { 2951 p = frag_more (10); 2952 p[0] = 2; 2953 p[1] = 0; 2954 p[2] = VAX_BRB; 2955 p[3] = 6; 2956 p[4] = VAX_JMP; 2957 p[5] = VAX_ABSOLUTE_MODE; /* @#... */ 2958 md_number_to_chars (p + 6, this_add_number, 4); 2959 /* Now (eg) ACBx 1f 2960 BRB 2f 2961 1: JMP @#foo 2962 2: */ 2963 } 2964 else 2965 { 2966 know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP); 2967 p = frag_more (9); 2968 p[0] = 2; 2969 p[1] = VAX_BRB; 2970 p[2] = 6; 2971 p[3] = VAX_JMP; 2972 p[4] = VAX_ABSOLUTE_MODE; /* @#... */ 2973 md_number_to_chars (p + 5, this_add_number, 4); 2974 /* Now (eg) xOBxxx 1f 2975 BRB 2f 2976 1: JMP @#foo 2977 2: */ 2978 } 2979 } 2980 } 2981 else 2982 { 2983 /* b<cond> */ 2984 *opcode_low_byteP ^= 1; 2985 /* To reverse the condition in a VAX branch, 2986 complement the lowest order bit. */ 2987 p = frag_more (7); 2988 p[0] = 6; 2989 p[1] = VAX_JMP; 2990 p[2] = VAX_ABSOLUTE_MODE; /* @#... */ 2991 md_number_to_chars (p + 3, this_add_number, 4); 2992 /* Now (eg) BLEQ 1f 2993 JMP @#foo 2994 1: */ 2995 } 2996 } 2997 } 2998 else 2999 { 3000 /* to_seg != now_seg && !is_undefinfed && !is_absolute */ 3001 if (nbytes > 0) 3002 { 3003 /* Pc-relative. Conventional relocation. */ 3004 know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC)); 3005 p = frag_more (nbytes); 3006 fix_new (frag_now, p - frag_now->fr_literal, nbytes, 3007 section_symbol (absolute_section), 3008 this_add_number, 1, NO_RELOC); 3009 } 3010 else 3011 { 3012 know (opcode_as_number & VIT_OPCODE_SYNTHETIC); 3013 if (opcode_as_number & VIT_OPCODE_SPECIAL) 3014 { 3015 if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP) 3016 { 3017 /* br or jsb */ 3018 know (opcode_as_chars[1] == 0); 3019 *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG; 3020 p = frag_more (5); 3021 p[0] = VAX_PC_RELATIVE_MODE; 3022 fix_new (frag_now, 3023 p + 1 - frag_now->fr_literal, 4, 3024 this_add_symbol, 3025 this_add_number, 1, NO_RELOC); 3026 /* Now eg JMP foo or JSB foo. */ 3027 } 3028 else 3029 { 3030 if (operandP->vop_width == VAX_WIDTH_WORD_JUMP) 3031 { 3032 p = frag_more (10); 3033 p[0] = 0; 3034 p[1] = 2; 3035 p[2] = VAX_BRB; 3036 p[3] = 6; 3037 p[4] = VAX_JMP; 3038 p[5] = VAX_PC_RELATIVE_MODE; 3039 fix_new (frag_now, 3040 p + 6 - frag_now->fr_literal, 4, 3041 this_add_symbol, 3042 this_add_number, 1, NO_RELOC); 3043 /* Now (eg) ACBx 1f 3044 BRB 2f 3045 1: JMP foo 3046 2: */ 3047 } 3048 else 3049 { 3050 know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP); 3051 p = frag_more (10); 3052 p[0] = 2; 3053 p[1] = VAX_BRB; 3054 p[2] = 6; 3055 p[3] = VAX_JMP; 3056 p[4] = VAX_PC_RELATIVE_MODE; 3057 fix_new (frag_now, 3058 p + 5 - frag_now->fr_literal, 3059 4, this_add_symbol, 3060 this_add_number, 1, NO_RELOC); 3061 /* Now (eg) xOBxxx 1f 3062 BRB 2f 3063 1: JMP foo 3064 2: */ 3065 } 3066 } 3067 } 3068 else 3069 { 3070 know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP); 3071 *opcode_low_byteP ^= 1; /* Reverse branch condition. */ 3072 p = frag_more (7); 3073 p[0] = 6; 3074 p[1] = VAX_JMP; 3075 p[2] = VAX_PC_RELATIVE_MODE; 3076 fix_new (frag_now, p + 3 - frag_now->fr_literal, 3077 4, this_add_symbol, 3078 this_add_number, 1, NO_RELOC); 3079 } 3080 } 3081 } 3082 } 3083 } 3084 else 3085 { 3086 /* So it is ordinary operand. */ 3087 know (operandP->vop_access != 'b'); 3088 /* ' ' target-independent: elsewhere. */ 3089 know (operandP->vop_access != ' '); 3090 know (operandP->vop_access == 'a' 3091 || operandP->vop_access == 'm' 3092 || operandP->vop_access == 'r' 3093 || operandP->vop_access == 'v' 3094 || operandP->vop_access == 'w'); 3095 if (operandP->vop_short == 's') 3096 { 3097 if (is_absolute) 3098 { 3099 if (this_add_number >= 64) 3100 { 3101 as_warn (_("Short literal overflow(%ld.), immediate mode assumed."), 3102 (long) this_add_number); 3103 operandP->vop_short = 'i'; 3104 operandP->vop_mode = 8; 3105 operandP->vop_reg = 0xF; 3106 } 3107 } 3108 else 3109 { 3110 as_warn (_("Forced short literal to immediate mode. now_seg=%s to_seg=%s"), 3111 segment_name (now_seg), segment_name (to_seg)); 3112 operandP->vop_short = 'i'; 3113 operandP->vop_mode = 8; 3114 operandP->vop_reg = 0xF; 3115 } 3116 } 3117 if (operandP->vop_reg >= 0 && (operandP->vop_mode < 8 3118 || (operandP->vop_reg != 0xF && operandP->vop_mode < 10))) 3119 { 3120 /* One byte operand. */ 3121 know (operandP->vop_mode > 3); 3122 FRAG_APPEND_1_CHAR (operandP->vop_mode << 4 | operandP->vop_reg); 3123 /* All 1-bytes except S^# happen here. */ 3124 } 3125 else 3126 { 3127 /* {@}{q^}foo{(Rn)} or S^#foo */ 3128 if (operandP->vop_reg == -1 && operandP->vop_short != 's') 3129 { 3130 /* "{@}{q^}foo" */ 3131 if (to_seg == now_seg) 3132 { 3133 if (length == 0) 3134 { 3135 know (operandP->vop_short == ' '); 3136 length_code = STATE_BYTE; 3137#ifdef OBJ_ELF 3138 if (S_IS_EXTERNAL (this_add_symbol) 3139 || S_IS_WEAK (this_add_symbol)) 3140 length_code = STATE_UNDF; 3141#endif 3142 p = frag_var (rs_machine_dependent, 10, 2, 3143 ENCODE_RELAX (STATE_PC_RELATIVE, length_code), 3144 this_add_symbol, this_add_number, 3145 opcode_low_byteP); 3146 know (operandP->vop_mode == 10 + at); 3147 *p = at << 4; 3148 /* At is the only context we need to carry 3149 to other side of relax() process. Must 3150 be in the correct bit position of VAX 3151 operand spec. byte. */ 3152 } 3153 else 3154 { 3155 know (length); 3156 know (operandP->vop_short != ' '); 3157 p = frag_more (length + 1); 3158 p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4); 3159 fix_new (frag_now, p + 1 - frag_now->fr_literal, 3160 length, this_add_symbol, 3161 this_add_number, 1, NO_RELOC); 3162 } 3163 } 3164 else 3165 { 3166 /* to_seg != now_seg */ 3167 if (this_add_symbol == NULL) 3168 { 3169 know (is_absolute); 3170 /* Do @#foo: simpler relocation than foo-.(pc) anyway. */ 3171 p = frag_more (5); 3172 p[0] = VAX_ABSOLUTE_MODE; /* @#... */ 3173 md_number_to_chars (p + 1, this_add_number, 4); 3174 if (length && length != 4) 3175 as_warn (_("Length specification ignored. Address mode 9F used")); 3176 } 3177 else 3178 { 3179 /* {@}{q^}other_seg */ 3180 know ((length == 0 && operandP->vop_short == ' ') 3181 || (length > 0 && operandP->vop_short != ' ')); 3182 if (is_undefined 3183#ifdef OBJ_ELF 3184 || S_IS_WEAK(this_add_symbol) 3185 || S_IS_EXTERNAL(this_add_symbol) 3186#endif 3187 ) 3188 { 3189 switch (length) 3190 { 3191 default: length_code = STATE_UNDF; break; 3192 case 1: length_code = STATE_BYTE; break; 3193 case 2: length_code = STATE_WORD; break; 3194 case 4: length_code = STATE_LONG; break; 3195 } 3196 /* We have a SEG_UNKNOWN symbol. It might 3197 turn out to be in the same segment as 3198 the instruction, permitting relaxation. */ 3199 p = frag_var (rs_machine_dependent, 5, 2, 3200 ENCODE_RELAX (STATE_PC_RELATIVE, length_code), 3201 this_add_symbol, this_add_number, 3202 opcode_low_byteP); 3203 p[0] = at << 4; 3204 } 3205 else 3206 { 3207 if (length == 0) 3208 { 3209 know (operandP->vop_short == ' '); 3210 length = 4; /* Longest possible. */ 3211 } 3212 p = frag_more (length + 1); 3213 p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4); 3214 md_number_to_chars (p + 1, this_add_number, length); 3215 fix_new (frag_now, 3216 p + 1 - frag_now->fr_literal, 3217 length, this_add_symbol, 3218 this_add_number, 1, NO_RELOC); 3219 } 3220 } 3221 } 3222 } 3223 else 3224 { 3225 /* {@}{q^}foo(Rn) or S^# or I^# or # */ 3226 if (operandP->vop_mode < 0xA) 3227 { 3228 /* # or S^# or I^# */ 3229 if (operandP->vop_access == 'v' 3230 || operandP->vop_access == 'a') 3231 { 3232 if (operandP->vop_access == 'v') 3233 as_warn (_("Invalid operand: immediate value used as base address.")); 3234 else 3235 as_warn (_("Invalid operand: immediate value used as address.")); 3236 /* gcc 2.6.3 is known to generate these in at least 3237 one case. */ 3238 } 3239 if (length == 0 3240 && is_absolute && (expP->X_op != O_big) 3241 && operandP->vop_mode == 8 /* No '@'. */ 3242 && this_add_number < 64) 3243 { 3244 operandP->vop_short = 's'; 3245 } 3246 if (operandP->vop_short == 's') 3247 { 3248 FRAG_APPEND_1_CHAR (this_add_number); 3249 } 3250 else 3251 { 3252 /* I^#... */ 3253 know (nbytes); 3254 p = frag_more (nbytes + 1); 3255 know (operandP->vop_reg == 0xF); 3256#ifdef OBJ_ELF 3257 if (flag_want_pic && operandP->vop_mode == 8 3258 && this_add_symbol != NULL) 3259 { 3260 as_warn (_("Symbol '%s' used as immediate operand in PIC mode."), 3261 S_GET_NAME (this_add_symbol)); 3262 } 3263#endif 3264 p[0] = (operandP->vop_mode << 4) | 0xF; 3265 if ((is_absolute) && (expP->X_op != O_big)) 3266 { 3267 /* If nbytes > 4, then we are scrod. We 3268 don't know if the high order bytes 3269 are to be 0xFF or 0x00. BSD4.2 & RMS 3270 say use 0x00. OK --- but this 3271 assembler needs ANOTHER rewrite to 3272 cope properly with this bug. */ 3273 md_number_to_chars (p + 1, this_add_number, 3274 min (sizeof (valueT), 3275 (size_t) nbytes)); 3276 if ((size_t) nbytes > sizeof (valueT)) 3277 memset (p + 1 + sizeof (valueT), 3278 '\0', nbytes - sizeof (valueT)); 3279 } 3280 else 3281 { 3282 if (expP->X_op == O_big) 3283 { 3284 /* Problem here is to get the bytes 3285 in the right order. We stored 3286 our constant as LITTLENUMs, not 3287 bytes. */ 3288 LITTLENUM_TYPE *lP; 3289 3290 lP = floatP->low; 3291 if (nbytes & 1) 3292 { 3293 know (nbytes == 1); 3294 p[1] = *lP; 3295 } 3296 else 3297 { 3298 for (p++; nbytes; nbytes -= 2, p += 2, lP++) 3299 md_number_to_chars (p, *lP, 2); 3300 } 3301 } 3302 else 3303 { 3304 fix_new (frag_now, p + 1 - frag_now->fr_literal, 3305 nbytes, this_add_symbol, 3306 this_add_number, 0, NO_RELOC); 3307 } 3308 } 3309 } 3310 } 3311 else 3312 { 3313 /* {@}{q^}foo(Rn) */ 3314 know ((length == 0 && operandP->vop_short == ' ') 3315 || (length > 0 && operandP->vop_short != ' ')); 3316 if (length == 0) 3317 { 3318 if (is_absolute) 3319 { 3320 long test; 3321 3322 test = this_add_number; 3323 3324 if (test < 0) 3325 test = ~test; 3326 3327 length = test & 0xffff8000 ? 4 3328 : test & 0xffffff80 ? 2 3329 : 1; 3330 } 3331 else 3332 { 3333 length = 4; 3334 } 3335 } 3336#ifdef OBJ_ELF 3337 if (flag_want_pic && this_add_symbol != NULL) 3338 { 3339 as_warn (_("Symbol '%s' used as displacement in PIC mode."), 3340 S_GET_NAME (this_add_symbol)); 3341 } 3342#endif 3343 p = frag_more (1 + length); 3344 know (operandP->vop_reg != 0xf); 3345 know (operandP->vop_reg >= 0); 3346 p[0] = operandP->vop_reg 3347 | ((at | "?\12\14?\16"[length]) << 4); 3348 if (is_absolute) 3349 { 3350 md_number_to_chars (p + 1, this_add_number, length); 3351 } 3352 else 3353 { 3354 fix_new (frag_now, p + 1 - frag_now->fr_literal, 3355 length, this_add_symbol, 3356 this_add_number, 0, NO_RELOC); 3357 } 3358 } 3359 } 3360 } 3361 } 3362 } 3363} 3364 3365void 3366md_begin (void) 3367{ 3368 FLONUM_TYPE *fP; 3369 int i; 3370 3371 vip_begin (1, "$", "*", "`"); 3372 3373 for (i = 0, fP = float_operand; 3374 fP < float_operand + VIT_MAX_OPERANDS; 3375 i++, fP++) 3376 { 3377 fP->low = &big_operand_bits[i][0]; 3378 fP->high = &big_operand_bits[i][SIZE_OF_LARGE_NUMBER - 1]; 3379 } 3380} 3381 3382bfd_reloc_code_real_type 3383vax_cons (expressionS *exp, int size) 3384{ 3385 char *save; 3386 const char *vax_cons_special_reloc; 3387 3388 SKIP_WHITESPACE (); 3389 vax_cons_special_reloc = NULL; 3390 save = input_line_pointer; 3391 if (input_line_pointer[0] == '%') 3392 { 3393 if (startswith (input_line_pointer + 1, "pcrel")) 3394 { 3395 input_line_pointer += 6; 3396 vax_cons_special_reloc = "pcrel"; 3397 } 3398 if (vax_cons_special_reloc) 3399 { 3400 int bad = 0; 3401 3402 switch (size) 3403 { 3404 case 1: 3405 if (*input_line_pointer != '8') 3406 bad = 1; 3407 input_line_pointer--; 3408 break; 3409 case 2: 3410 if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6') 3411 bad = 1; 3412 break; 3413 case 4: 3414 if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2') 3415 bad = 1; 3416 break; 3417 default: 3418 bad = 1; 3419 break; 3420 } 3421 3422 if (bad) 3423 { 3424 as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"), 3425 vax_cons_special_reloc, size * 8, size); 3426 } 3427 else 3428 { 3429 input_line_pointer += 2; 3430 if (*input_line_pointer != '(') 3431 { 3432 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"), 3433 vax_cons_special_reloc, size * 8); 3434 bad = 1; 3435 } 3436 } 3437 3438 if (bad) 3439 { 3440 input_line_pointer = save; 3441 vax_cons_special_reloc = NULL; 3442 } 3443 else 3444 { 3445 int c; 3446 char *end = ++input_line_pointer; 3447 int npar = 0; 3448 3449 while (! is_end_of_line[(c = *end)]) 3450 { 3451 if (c == '(') 3452 npar++; 3453 else if (c == ')') 3454 { 3455 if (!npar) 3456 break; 3457 npar--; 3458 } 3459 end++; 3460 } 3461 3462 if (c != ')') 3463 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"), 3464 vax_cons_special_reloc, size * 8); 3465 else 3466 { 3467 *end = '\0'; 3468 expression (exp); 3469 *end = c; 3470 if (input_line_pointer != end) 3471 { 3472 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"), 3473 vax_cons_special_reloc, size * 8); 3474 } 3475 else 3476 { 3477 input_line_pointer++; 3478 SKIP_WHITESPACE (); 3479 c = *input_line_pointer; 3480 if (! is_end_of_line[c] && c != ',') 3481 as_bad (_("Illegal operands: garbage after %%r_%s%d()"), 3482 vax_cons_special_reloc, size * 8); 3483 } 3484 } 3485 } 3486 } 3487 } 3488 if (vax_cons_special_reloc == NULL) 3489 expression (exp); 3490 else 3491 switch (size) 3492 { 3493 case 1: return BFD_RELOC_8_PCREL; 3494 case 2: return BFD_RELOC_16_PCREL; 3495 case 4: return BFD_RELOC_32_PCREL; 3496 } 3497 return NO_RELOC; 3498} 3499 3500/* This is called by emit_expr via TC_CONS_FIX_NEW when creating a 3501 reloc for a cons. */ 3502 3503void 3504vax_cons_fix_new (fragS *frag, int where, unsigned int nbytes, expressionS *exp, 3505 bfd_reloc_code_real_type r) 3506{ 3507 int pcrel; 3508 // fix PC relative frags too ... 3509 switch (r) 3510 { 3511 case BFD_RELOC_8_PCREL: 3512 case BFD_RELOC_16_PCREL: 3513 case BFD_RELOC_32_PCREL: 3514 pcrel = 1; 3515 /* 3516 * Displacement mode addressing (of which PC relative is one 3517 * type) uses the updated contents of the register as the base 3518 * address. VARM, Leonard 1987, pp34 3519 */ 3520 switch (exp->X_op) 3521 { 3522 case O_constant: 3523 case O_symbol: 3524 exp->X_add_number += nbytes; 3525 break; 3526 } 3527 break; 3528 case NO_RELOC: 3529 r = (nbytes == 1 ? BFD_RELOC_8 3530 : nbytes == 2 ? BFD_RELOC_16 3531 : BFD_RELOC_32); 3532 pcrel = 0; 3533 break; 3534 default: 3535 pcrel = 0; 3536 break; 3537 } 3538 3539 fix_new_exp (frag, where, (int) nbytes, exp, pcrel, r); 3540} 3541 3542const char * 3543md_atof (int type, char * litP, int * sizeP) 3544{ 3545 return vax_md_atof (type, litP, sizeP); 3546} 3547 3548void 3549vax_cfi_frame_initial_instructions (void) 3550{ 3551 cfi_add_CFA_def_cfa (14, 0); 3552} 3553 3554int 3555tc_vax_regname_to_dw2regnum (char *regname) 3556{ 3557 unsigned int i; 3558 static const struct { char *name; int dw2regnum; } regnames[] = 3559 { 3560 { "r0", 0 }, { "r1", 1 }, { "r2", 2 }, { "r3", 3 }, 3561 { "r4", 4 }, { "r5", 5 }, { "r6", 6 }, { "r7", 7 }, 3562 { "r8", 8 }, { "r9", 9 }, { "r10", 10 }, { "r11", 11 }, 3563 { "ap", 12 }, { "fp", 13 }, { "sp", 14 }, { "pc", 15 }, 3564 { "psw", 16 }, 3565 }; 3566 3567 for (i = 0; i < ARRAY_SIZE (regnames); ++i) 3568 if (strcmp (regnames[i].name, regname) == 0) 3569 return regnames[i].dw2regnum; 3570 3571 return -1; 3572} 3573 3574void 3575vax_cfi_emit_pcrel_expr (expressionS *expP, unsigned int nbytes) 3576{ 3577 expressionS tmp = *expP; 3578 3579 tmp.X_op = O_subtract; 3580 tmp.X_op_symbol = symbol_temp_new_now (); 3581 expP = &tmp; 3582 expP->X_add_number += nbytes; 3583 emit_expr (expP, nbytes); 3584} 3585