1 /* ns32k.c -- Assemble on the National Semiconductor 32k series 2 Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 3 2001, 2002, 2003, 2005 4 Free Software Foundation, Inc. 5 6 This file is part of GAS, the GNU Assembler. 7 8 GAS is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2, or (at your option) 11 any later version. 12 13 GAS is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GAS; see the file COPYING. If not, write to the Free 20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 21 02110-1301, USA. */ 22 23 /*#define SHOW_NUM 1*//* Uncomment for debugging. */ 24 25 #include <stdio.h> 26 27 #include "as.h" 28 #include "opcode/ns32k.h" 29 30 #include "obstack.h" 31 32 /* Macros. */ 33 #define IIF_ENTRIES 13 /* Number of entries in iif. */ 34 #define PRIVATE_SIZE 256 /* Size of my garbage memory. */ 35 #define MAX_ARGS 4 36 #define DEFAULT -1 /* addr_mode returns this value when 37 plain constant or label is 38 encountered. */ 39 40 #define IIF(ptr,a1,c1,e1,g1,i1,k1,m1,o1,q1,s1,u1) \ 41 iif.iifP[ptr].type = a1; \ 42 iif.iifP[ptr].size = c1; \ 43 iif.iifP[ptr].object = e1; \ 44 iif.iifP[ptr].object_adjust = g1; \ 45 iif.iifP[ptr].pcrel = i1; \ 46 iif.iifP[ptr].pcrel_adjust = k1; \ 47 iif.iifP[ptr].im_disp = m1; \ 48 iif.iifP[ptr].relax_substate = o1; \ 49 iif.iifP[ptr].bit_fixP = q1; \ 50 iif.iifP[ptr].addr_mode = s1; \ 51 iif.iifP[ptr].bsr = u1; 52 53 #ifdef SEQUENT_COMPATABILITY 54 #define LINE_COMMENT_CHARS "|" 55 #define ABSOLUTE_PREFIX '@' 56 #define IMMEDIATE_PREFIX '#' 57 #endif 58 59 #ifndef LINE_COMMENT_CHARS 60 #define LINE_COMMENT_CHARS "#" 61 #endif 62 63 const char comment_chars[] = "#"; 64 const char line_comment_chars[] = LINE_COMMENT_CHARS; 65 const char line_separator_chars[] = ";"; 66 static int default_disp_size = 4; /* Displacement size for external refs. */ 67 68 #if !defined(ABSOLUTE_PREFIX) && !defined(IMMEDIATE_PREFIX) 69 #define ABSOLUTE_PREFIX '@' /* One or the other MUST be defined. */ 70 #endif 71 72 struct addr_mode 73 { 74 signed char mode; /* Addressing mode of operand (0-31). */ 75 signed char scaled_mode; /* Mode combined with scaled mode. */ 76 char scaled_reg; /* Register used in scaled+1 (1-8). */ 77 char float_flag; /* Set if R0..R7 was F0..F7 ie a 78 floating-point-register. */ 79 char am_size; /* Estimated max size of general addr-mode 80 parts. */ 81 char im_disp; /* If im_disp==1 we have a displacement. */ 82 char pcrel; /* 1 if pcrel, this is really redundant info. */ 83 char disp_suffix[2]; /* Length of displacement(s), 0=undefined. */ 84 char *disp[2]; /* Pointer(s) at displacement(s) 85 or immediates(s) (ascii). */ 86 char index_byte; /* Index byte. */ 87 }; 88 typedef struct addr_mode addr_modeS; 89 90 char *freeptr, *freeptr_static; /* Points at some number of free bytes. */ 91 struct hash_control *inst_hash_handle; 92 93 struct ns32k_opcode *desc; /* Pointer at description of instruction. */ 94 addr_modeS addr_modeP; 95 const char EXP_CHARS[] = "eE"; 96 const char FLT_CHARS[] = "fd"; /* We don't want to support lowercase, 97 do we? */ 98 99 /* UPPERCASE denotes live names when an instruction is built, IIF is 100 used as an intermediate form to store the actual parts of the 101 instruction. A ns32k machine instruction can be divided into a 102 couple of sub PARTs. When an instruction is assembled the 103 appropriate PART get an assignment. When an IIF has been completed 104 it is converted to a FRAGment as specified in AS.H. */ 105 106 /* Internal structs. */ 107 struct ns32k_option 108 { 109 char *pattern; 110 unsigned long or; 111 unsigned long and; 112 }; 113 114 typedef struct 115 { 116 int type; /* How to interpret object. */ 117 int size; /* Estimated max size of object. */ 118 unsigned long object; /* Binary data. */ 119 int object_adjust; /* Number added to object. */ 120 int pcrel; /* True if object is pcrel. */ 121 int pcrel_adjust; /* Length in bytes from the instruction 122 start to the displacement. */ 123 int im_disp; /* True if the object is a displacement. */ 124 relax_substateT relax_substate;/*Initial relaxsubstate. */ 125 bit_fixS *bit_fixP; /* Pointer at bit_fix struct. */ 126 int addr_mode; /* What addrmode do we associate with this 127 iif-entry. */ 128 char bsr; /* Sequent hack. */ 129 } iif_entryT; /* Internal Instruction Format. */ 130 131 struct int_ins_form 132 { 133 int instr_size; /* Max size of instruction in bytes. */ 134 iif_entryT iifP[IIF_ENTRIES + 1]; 135 }; 136 137 struct int_ins_form iif; 138 expressionS exprP; 139 char *input_line_pointer; 140 141 /* Description of the PARTs in IIF 142 object[n]: 143 0 total length in bytes of entries in iif 144 1 opcode 145 2 index_byte_a 146 3 index_byte_b 147 4 disp_a_1 148 5 disp_a_2 149 6 disp_b_1 150 7 disp_b_2 151 8 imm_a 152 9 imm_b 153 10 implied1 154 11 implied2 155 156 For every entry there is a datalength in bytes. This is stored in size[n]. 157 0, the objectlength is not explicitly given by the instruction 158 and the operand is undefined. This is a case for relaxation. 159 Reserve 4 bytes for the final object. 160 161 1, the entry contains one byte 162 2, the entry contains two bytes 163 3, the entry contains three bytes 164 4, the entry contains four bytes 165 etc 166 167 Furthermore, every entry has a data type identifier in type[n]. 168 169 0, the entry is void, ignore it. 170 1, the entry is a binary number. 171 2, the entry is a pointer at an expression. 172 Where expression may be as simple as a single '1', 173 and as complicated as foo-bar+12, 174 foo and bar may be undefined but suffixed by :{b|w|d} to 175 control the length of the object. 176 177 3, the entry is a pointer at a bignum struct 178 179 The low-order-byte corresponds to low physical memory. 180 Obviously a FRAGment must be created for each valid disp in PART whose 181 datalength is undefined (to bad) . 182 The case where just the expression is undefined is less severe and is 183 handled by fix. Here the number of bytes in the objectfile is known. 184 With this representation we simplify the assembly and separates the 185 machine dependent/independent parts in a more clean way (said OE). */ 186 187 struct ns32k_option opt1[] = /* restore, exit. */ 188 { 189 {"r0", 0x80, 0xff}, 190 {"r1", 0x40, 0xff}, 191 {"r2", 0x20, 0xff}, 192 {"r3", 0x10, 0xff}, 193 {"r4", 0x08, 0xff}, 194 {"r5", 0x04, 0xff}, 195 {"r6", 0x02, 0xff}, 196 {"r7", 0x01, 0xff}, 197 {0, 0x00, 0xff} 198 }; 199 struct ns32k_option opt2[] = /* save, enter. */ 200 { 201 {"r0", 0x01, 0xff}, 202 {"r1", 0x02, 0xff}, 203 {"r2", 0x04, 0xff}, 204 {"r3", 0x08, 0xff}, 205 {"r4", 0x10, 0xff}, 206 {"r5", 0x20, 0xff}, 207 {"r6", 0x40, 0xff}, 208 {"r7", 0x80, 0xff}, 209 {0, 0x00, 0xff} 210 }; 211 struct ns32k_option opt3[] = /* setcfg. */ 212 { 213 {"c", 0x8, 0xff}, 214 {"m", 0x4, 0xff}, 215 {"f", 0x2, 0xff}, 216 {"i", 0x1, 0xff}, 217 {0, 0x0, 0xff} 218 }; 219 struct ns32k_option opt4[] = /* cinv. */ 220 { 221 {"a", 0x4, 0xff}, 222 {"i", 0x2, 0xff}, 223 {"d", 0x1, 0xff}, 224 {0, 0x0, 0xff} 225 }; 226 struct ns32k_option opt5[] = /* String inst. */ 227 { 228 {"b", 0x2, 0xff}, 229 {"u", 0xc, 0xff}, 230 {"w", 0x4, 0xff}, 231 {0, 0x0, 0xff} 232 }; 233 struct ns32k_option opt6[] = /* Plain reg ext,cvtp etc. */ 234 { 235 {"r0", 0x00, 0xff}, 236 {"r1", 0x01, 0xff}, 237 {"r2", 0x02, 0xff}, 238 {"r3", 0x03, 0xff}, 239 {"r4", 0x04, 0xff}, 240 {"r5", 0x05, 0xff}, 241 {"r6", 0x06, 0xff}, 242 {"r7", 0x07, 0xff}, 243 {0, 0x00, 0xff} 244 }; 245 246 #if !defined(NS32032) && !defined(NS32532) 247 #define NS32532 248 #endif 249 250 struct ns32k_option cpureg_532[] = /* lpr spr. */ 251 { 252 {"us", 0x0, 0xff}, 253 {"dcr", 0x1, 0xff}, 254 {"bpc", 0x2, 0xff}, 255 {"dsr", 0x3, 0xff}, 256 {"car", 0x4, 0xff}, 257 {"fp", 0x8, 0xff}, 258 {"sp", 0x9, 0xff}, 259 {"sb", 0xa, 0xff}, 260 {"usp", 0xb, 0xff}, 261 {"cfg", 0xc, 0xff}, 262 {"psr", 0xd, 0xff}, 263 {"intbase", 0xe, 0xff}, 264 {"mod", 0xf, 0xff}, 265 {0, 0x00, 0xff} 266 }; 267 struct ns32k_option mmureg_532[] = /* lmr smr. */ 268 { 269 {"mcr", 0x9, 0xff}, 270 {"msr", 0xa, 0xff}, 271 {"tear", 0xb, 0xff}, 272 {"ptb0", 0xc, 0xff}, 273 {"ptb1", 0xd, 0xff}, 274 {"ivar0", 0xe, 0xff}, 275 {"ivar1", 0xf, 0xff}, 276 {0, 0x0, 0xff} 277 }; 278 279 struct ns32k_option cpureg_032[] = /* lpr spr. */ 280 { 281 {"upsr", 0x0, 0xff}, 282 {"fp", 0x8, 0xff}, 283 {"sp", 0x9, 0xff}, 284 {"sb", 0xa, 0xff}, 285 {"psr", 0xd, 0xff}, 286 {"intbase", 0xe, 0xff}, 287 {"mod", 0xf, 0xff}, 288 {0, 0x0, 0xff} 289 }; 290 struct ns32k_option mmureg_032[] = /* lmr smr. */ 291 { 292 {"bpr0", 0x0, 0xff}, 293 {"bpr1", 0x1, 0xff}, 294 {"pf0", 0x4, 0xff}, 295 {"pf1", 0x5, 0xff}, 296 {"sc", 0x8, 0xff}, 297 {"msr", 0xa, 0xff}, 298 {"bcnt", 0xb, 0xff}, 299 {"ptb0", 0xc, 0xff}, 300 {"ptb1", 0xd, 0xff}, 301 {"eia", 0xf, 0xff}, 302 {0, 0x0, 0xff} 303 }; 304 305 #if defined(NS32532) 306 struct ns32k_option *cpureg = cpureg_532; 307 struct ns32k_option *mmureg = mmureg_532; 308 #else 309 struct ns32k_option *cpureg = cpureg_032; 310 struct ns32k_option *mmureg = mmureg_032; 311 #endif 312 313 314 const pseudo_typeS md_pseudo_table[] = 315 { /* So far empty. */ 316 {0, 0, 0} 317 }; 318 319 #define IND(x,y) (((x)<<2)+(y)) 320 321 /* Those are index's to relax groups in md_relax_table ie it must be 322 multiplied by 4 to point at a group start. Viz IND(x,y) Se function 323 relax_segment in write.c for more info. */ 324 325 #define BRANCH 1 326 #define PCREL 2 327 328 /* Those are index's to entries in a relax group. */ 329 330 #define BYTE 0 331 #define WORD 1 332 #define DOUBLE 2 333 #define UNDEF 3 334 /* Those limits are calculated from the displacement start in memory. 335 The ns32k uses the beginning of the instruction as displacement 336 base. This type of displacements could be handled here by moving 337 the limit window up or down. I choose to use an internal 338 displacement base-adjust as there are other routines that must 339 consider this. Also, as we have two various offset-adjusts in the 340 ns32k (acb versus br/brs/jsr/bcond), two set of limits would have 341 had to be used. Now we dont have to think about that. */ 342 343 const relax_typeS md_relax_table[] = 344 { 345 {1, 1, 0, 0}, 346 {1, 1, 0, 0}, 347 {1, 1, 0, 0}, 348 {1, 1, 0, 0}, 349 350 {(63), (-64), 1, IND (BRANCH, WORD)}, 351 {(8192), (-8192), 2, IND (BRANCH, DOUBLE)}, 352 {0, 0, 4, 0}, 353 {1, 1, 0, 0} 354 }; 355 356 /* Array used to test if mode contains displacements. 357 Value is true if mode contains displacement. */ 358 359 char disp_test[] = 360 {0, 0, 0, 0, 0, 0, 0, 0, 361 1, 1, 1, 1, 1, 1, 1, 1, 362 1, 1, 1, 0, 0, 1, 1, 0, 363 1, 1, 1, 1, 1, 1, 1, 1}; 364 365 /* Array used to calculate max size of displacements. */ 366 367 char disp_size[] = 368 {4, 1, 2, 0, 4}; 369 370 /* Parse a general operand into an addressingmode struct 371 372 In: pointer at operand in ascii form 373 pointer at addr_mode struct for result 374 the level of recursion. (always 0 or 1) 375 376 Out: data in addr_mode struct. */ 377 378 static int 379 addr_mode (char *operand, 380 addr_modeS *addr_modeP, 381 int recursive_level) 382 { 383 char *str; 384 int i; 385 int strl; 386 int mode; 387 int j; 388 389 mode = DEFAULT; /* Default. */ 390 addr_modeP->scaled_mode = 0; /* Why not. */ 391 addr_modeP->scaled_reg = 0; /* If 0, not scaled index. */ 392 addr_modeP->float_flag = 0; 393 addr_modeP->am_size = 0; 394 addr_modeP->im_disp = 0; 395 addr_modeP->pcrel = 0; /* Not set in this function. */ 396 addr_modeP->disp_suffix[0] = 0; 397 addr_modeP->disp_suffix[1] = 0; 398 addr_modeP->disp[0] = NULL; 399 addr_modeP->disp[1] = NULL; 400 str = operand; 401 402 if (str[0] == 0) 403 return 0; 404 405 strl = strlen (str); 406 407 switch (str[0]) 408 { 409 /* The following three case statements controls the mode-chars 410 this is the place to ed if you want to change them. */ 411 #ifdef ABSOLUTE_PREFIX 412 case ABSOLUTE_PREFIX: 413 if (str[strl - 1] == ']') 414 break; 415 addr_modeP->mode = 21; /* absolute */ 416 addr_modeP->disp[0] = str + 1; 417 return -1; 418 #endif 419 #ifdef IMMEDIATE_PREFIX 420 case IMMEDIATE_PREFIX: 421 if (str[strl - 1] == ']') 422 break; 423 addr_modeP->mode = 20; /* immediate */ 424 addr_modeP->disp[0] = str + 1; 425 return -1; 426 #endif 427 case '.': 428 if (str[strl - 1] != ']') 429 { 430 switch (str[1]) 431 { 432 case '-': 433 case '+': 434 if (str[2] != '\000') 435 { 436 addr_modeP->mode = 27; /* pc-relative */ 437 addr_modeP->disp[0] = str + 2; 438 return -1; 439 } 440 default: 441 as_bad (_("Invalid syntax in PC-relative addressing mode")); 442 return 0; 443 } 444 } 445 break; 446 case 'e': 447 if (str[strl - 1] != ']') 448 { 449 if ((!strncmp (str, "ext(", 4)) && strl > 7) 450 { /* external */ 451 addr_modeP->disp[0] = str + 4; 452 i = 0; 453 j = 2; 454 do 455 { /* disp[0]'s termination point. */ 456 j += 1; 457 if (str[j] == '(') 458 i++; 459 if (str[j] == ')') 460 i--; 461 } 462 while (j < strl && i != 0); 463 if (i != 0 || !(str[j + 1] == '-' || str[j + 1] == '+')) 464 { 465 as_bad (_("Invalid syntax in External addressing mode")); 466 return (0); 467 } 468 str[j] = '\000'; /* null terminate disp[0] */ 469 addr_modeP->disp[1] = str + j + 2; 470 addr_modeP->mode = 22; 471 return -1; 472 } 473 } 474 break; 475 476 default: 477 ; 478 } 479 480 strl = strlen (str); 481 482 switch (strl) 483 { 484 case 2: 485 switch (str[0]) 486 { 487 case 'f': 488 addr_modeP->float_flag = 1; 489 /* Drop through. */ 490 case 'r': 491 if (str[1] >= '0' && str[1] < '8') 492 { 493 addr_modeP->mode = str[1] - '0'; 494 return -1; 495 } 496 break; 497 default: 498 break; 499 } 500 /* Drop through. */ 501 502 case 3: 503 if (!strncmp (str, "tos", 3)) 504 { 505 addr_modeP->mode = 23; /* TopOfStack */ 506 return -1; 507 } 508 break; 509 510 default: 511 break; 512 } 513 514 if (strl > 4) 515 { 516 if (str[strl - 1] == ')') 517 { 518 if (str[strl - 2] == ')') 519 { 520 if (!strncmp (&str[strl - 5], "(fp", 3)) 521 mode = 16; /* Memory Relative. */ 522 else if (!strncmp (&str[strl - 5], "(sp", 3)) 523 mode = 17; 524 else if (!strncmp (&str[strl - 5], "(sb", 3)) 525 mode = 18; 526 527 if (mode != DEFAULT) 528 { 529 /* Memory relative. */ 530 addr_modeP->mode = mode; 531 j = strl - 5; /* Temp for end of disp[0]. */ 532 i = 0; 533 534 do 535 { 536 strl -= 1; 537 if (str[strl] == ')') 538 i++; 539 if (str[strl] == '(') 540 i--; 541 } 542 while (strl > -1 && i != 0); 543 544 if (i != 0) 545 { 546 as_bad (_("Invalid syntax in Memory Relative addressing mode")); 547 return (0); 548 } 549 550 addr_modeP->disp[1] = str; 551 addr_modeP->disp[0] = str + strl + 1; 552 str[j] = '\000'; /* Null terminate disp[0] . */ 553 str[strl] = '\000'; /* Null terminate disp[1]. */ 554 555 return -1; 556 } 557 } 558 559 switch (str[strl - 3]) 560 { 561 case 'r': 562 case 'R': 563 if (str[strl - 2] >= '0' 564 && str[strl - 2] < '8' 565 && str[strl - 4] == '(') 566 { 567 addr_modeP->mode = str[strl - 2] - '0' + 8; 568 addr_modeP->disp[0] = str; 569 str[strl - 4] = 0; 570 return -1; /* reg rel */ 571 } 572 /* Drop through. */ 573 574 default: 575 if (!strncmp (&str[strl - 4], "(fp", 3)) 576 mode = 24; 577 else if (!strncmp (&str[strl - 4], "(sp", 3)) 578 mode = 25; 579 else if (!strncmp (&str[strl - 4], "(sb", 3)) 580 mode = 26; 581 else if (!strncmp (&str[strl - 4], "(pc", 3)) 582 mode = 27; 583 584 if (mode != DEFAULT) 585 { 586 addr_modeP->mode = mode; 587 addr_modeP->disp[0] = str; 588 str[strl - 4] = '\0'; 589 590 return -1; /* Memory space. */ 591 } 592 } 593 } 594 595 /* No trailing ')' do we have a ']' ? */ 596 if (str[strl - 1] == ']') 597 { 598 switch (str[strl - 2]) 599 { 600 case 'b': 601 mode = 28; 602 break; 603 case 'w': 604 mode = 29; 605 break; 606 case 'd': 607 mode = 30; 608 break; 609 case 'q': 610 mode = 31; 611 break; 612 default: 613 as_bad (_("Invalid scaled-indexed mode, use (b,w,d,q)")); 614 615 if (str[strl - 3] != ':' || str[strl - 6] != '[' 616 || str[strl - 5] == 'r' || str[strl - 4] < '0' 617 || str[strl - 4] > '7') 618 as_bad (_("Syntax in scaled-indexed mode, use [Rn:m] where n=[0..7] m={b,w,d,q}")); 619 } /* Scaled index. */ 620 621 if (recursive_level > 0) 622 { 623 as_bad (_("Scaled-indexed addressing mode combined with scaled-index")); 624 return 0; 625 } 626 627 addr_modeP->am_size += 1; /* scaled index byte. */ 628 j = str[strl - 4] - '0'; /* store temporary. */ 629 str[strl - 6] = '\000'; /* nullterminate for recursive call. */ 630 i = addr_mode (str, addr_modeP, 1); 631 632 if (!i || addr_modeP->mode == 20) 633 { 634 as_bad (_("Invalid or illegal addressing mode combined with scaled-index")); 635 return 0; 636 } 637 638 addr_modeP->scaled_mode = addr_modeP->mode; /* Store the inferior mode. */ 639 addr_modeP->mode = mode; 640 addr_modeP->scaled_reg = j + 1; 641 642 return -1; 643 } 644 } 645 646 addr_modeP->mode = DEFAULT; /* Default to whatever. */ 647 addr_modeP->disp[0] = str; 648 649 return -1; 650 } 651 652 static void 653 evaluate_expr (expressionS *resultP, char *ptr) 654 { 655 char *tmp_line; 656 657 tmp_line = input_line_pointer; 658 input_line_pointer = ptr; 659 expression (resultP); 660 input_line_pointer = tmp_line; 661 } 662 663 /* ptr points at string addr_modeP points at struct with result This 664 routine calls addr_mode to determine the general addr.mode of the 665 operand. When this is ready it parses the displacements for size 666 specifying suffixes and determines size of immediate mode via 667 ns32k-opcode. Also builds index bytes if needed. */ 668 669 static int 670 get_addr_mode (char *ptr, addr_modeS *addr_modeP) 671 { 672 int tmp; 673 674 addr_mode (ptr, addr_modeP, 0); 675 676 if (addr_modeP->mode == DEFAULT || addr_modeP->scaled_mode == -1) 677 { 678 /* Resolve ambiguous operands, this shouldn't be necessary if 679 one uses standard NSC operand syntax. But the sequent 680 compiler doesn't!!! This finds a proper addressing mode 681 if it is implicitly stated. See ns32k-opcode.h. */ 682 (void) evaluate_expr (&exprP, ptr); /* This call takes time Sigh! */ 683 684 if (addr_modeP->mode == DEFAULT) 685 { 686 if (exprP.X_add_symbol || exprP.X_op_symbol) 687 addr_modeP->mode = desc->default_model; /* We have a label. */ 688 else 689 addr_modeP->mode = desc->default_modec; /* We have a constant. */ 690 } 691 else 692 { 693 if (exprP.X_add_symbol || exprP.X_op_symbol) 694 addr_modeP->scaled_mode = desc->default_model; 695 else 696 addr_modeP->scaled_mode = desc->default_modec; 697 } 698 699 /* Must put this mess down in addr_mode to handle the scaled 700 case better. */ 701 } 702 703 /* It appears as the sequent compiler wants an absolute when we have 704 a label without @. Constants becomes immediates besides the addr 705 case. Think it does so with local labels too, not optimum, pcrel 706 is better. When I have time I will make gas check this and 707 select pcrel when possible Actually that is trivial. */ 708 if ((tmp = addr_modeP->scaled_reg)) 709 { /* Build indexbyte. */ 710 tmp--; /* Remember regnumber comes incremented for 711 flagpurpose. */ 712 tmp |= addr_modeP->scaled_mode << 3; 713 addr_modeP->index_byte = (char) tmp; 714 addr_modeP->am_size += 1; 715 } 716 717 assert (addr_modeP->mode >= 0); 718 if (disp_test[(unsigned int) addr_modeP->mode]) 719 { 720 char c; 721 char suffix; 722 char suffix_sub; 723 int i; 724 char *toP; 725 char *fromP; 726 727 /* There was a displacement, probe for length specifying suffix. */ 728 addr_modeP->pcrel = 0; 729 730 assert(addr_modeP->mode >= 0); 731 if (disp_test[(unsigned int) addr_modeP->mode]) 732 { 733 /* There is a displacement. */ 734 if (addr_modeP->mode == 27 || addr_modeP->scaled_mode == 27) 735 /* Do we have pcrel. mode. */ 736 addr_modeP->pcrel = 1; 737 738 addr_modeP->im_disp = 1; 739 740 for (i = 0; i < 2; i++) 741 { 742 suffix_sub = suffix = 0; 743 744 if ((toP = addr_modeP->disp[i])) 745 { 746 /* Suffix of expression, the largest size rules. */ 747 fromP = toP; 748 749 while ((c = *fromP++)) 750 { 751 *toP++ = c; 752 if (c == ':') 753 { 754 switch (*fromP) 755 { 756 case '\0': 757 as_warn (_("Premature end of suffix -- Defaulting to d")); 758 suffix = 4; 759 continue; 760 case 'b': 761 suffix_sub = 1; 762 break; 763 case 'w': 764 suffix_sub = 2; 765 break; 766 case 'd': 767 suffix_sub = 4; 768 break; 769 default: 770 as_warn (_("Bad suffix after ':' use {b|w|d} Defaulting to d")); 771 suffix = 4; 772 } 773 774 fromP ++; 775 toP --; /* So we write over the ':' */ 776 777 if (suffix < suffix_sub) 778 suffix = suffix_sub; 779 } 780 } 781 782 *toP = '\0'; /* Terminate properly. */ 783 addr_modeP->disp_suffix[i] = suffix; 784 addr_modeP->am_size += suffix ? suffix : 4; 785 } 786 } 787 } 788 } 789 else 790 { 791 if (addr_modeP->mode == 20) 792 { 793 /* Look in ns32k_opcode for size. */ 794 addr_modeP->disp_suffix[0] = addr_modeP->am_size = desc->im_size; 795 addr_modeP->im_disp = 0; 796 } 797 } 798 799 return addr_modeP->mode; 800 } 801 802 /* Read an optionlist. */ 803 804 static void 805 optlist (char *str, /* The string to extract options from. */ 806 struct ns32k_option *optionP, /* How to search the string. */ 807 unsigned long *default_map) /* Default pattern and output. */ 808 { 809 int i, j, k, strlen1, strlen2; 810 char *patternP, *strP; 811 812 strlen1 = strlen (str); 813 814 if (strlen1 < 1) 815 as_fatal (_("Very short instr to option, ie you can't do it on a NULLstr")); 816 817 for (i = 0; optionP[i].pattern != 0; i++) 818 { 819 strlen2 = strlen (optionP[i].pattern); 820 821 for (j = 0; j < strlen1; j++) 822 { 823 patternP = optionP[i].pattern; 824 strP = &str[j]; 825 826 for (k = 0; k < strlen2; k++) 827 { 828 if (*(strP++) != *(patternP++)) 829 break; 830 } 831 832 if (k == strlen2) 833 { /* match */ 834 *default_map |= optionP[i].or; 835 *default_map &= optionP[i].and; 836 } 837 } 838 } 839 } 840 841 /* Search struct for symbols. 842 This function is used to get the short integer form of reg names in 843 the instructions lmr, smr, lpr, spr return true if str is found in 844 list. */ 845 846 static int 847 list_search (char *str, /* The string to match. */ 848 struct ns32k_option *optionP, /* List to search. */ 849 unsigned long *default_map) /* Default pattern and output. */ 850 { 851 int i; 852 853 for (i = 0; optionP[i].pattern != 0; i++) 854 { 855 if (!strncmp (optionP[i].pattern, str, 20)) 856 { 857 /* Use strncmp to be safe. */ 858 *default_map |= optionP[i].or; 859 *default_map &= optionP[i].and; 860 861 return -1; 862 } 863 } 864 865 as_bad (_("No such entry in list. (cpu/mmu register)")); 866 return 0; 867 } 868 869 /* Create a bit_fixS in obstack 'notes'. 870 This struct is used to profile the normal fix. If the bit_fixP is a 871 valid pointer (not NULL) the bit_fix data will be used to format 872 the fix. */ 873 874 static bit_fixS * 875 bit_fix_new (int size, /* Length of bitfield. */ 876 int offset, /* Bit offset to bitfield. */ 877 long min, /* Signextended min for bitfield. */ 878 long max, /* Signextended max for bitfield. */ 879 long add, /* Add mask, used for huffman prefix. */ 880 long base_type, /* 0 or 1, if 1 it's exploded to opcode ptr. */ 881 long base_adj) 882 { 883 bit_fixS *bit_fixP; 884 885 bit_fixP = (bit_fixS *) obstack_alloc (¬es, sizeof (bit_fixS)); 886 887 bit_fixP->fx_bit_size = size; 888 bit_fixP->fx_bit_offset = offset; 889 bit_fixP->fx_bit_base = base_type; 890 bit_fixP->fx_bit_base_adj = base_adj; 891 bit_fixP->fx_bit_max = max; 892 bit_fixP->fx_bit_min = min; 893 bit_fixP->fx_bit_add = add; 894 895 return bit_fixP; 896 } 897 898 /* Convert operands to iif-format and adds bitfields to the opcode. 899 Operands are parsed in such an order that the opcode is updated from 900 its most significant bit, that is when the operand need to alter the 901 opcode. 902 Be careful not to put to objects in the same iif-slot. */ 903 904 static void 905 encode_operand (int argc, 906 char **argv, 907 const char *operandsP, 908 const char *suffixP, 909 char im_size ATTRIBUTE_UNUSED, 910 char opcode_bit_ptr) 911 { 912 int i, j; 913 char d; 914 int pcrel, b, loop, pcrel_adjust; 915 unsigned long tmp; 916 917 for (loop = 0; loop < argc; loop++) 918 { 919 /* What operand are we supposed to work on. */ 920 i = operandsP[loop << 1] - '1'; 921 if (i > 3) 922 as_fatal (_("Internal consistency error. check ns32k-opcode.h")); 923 924 pcrel = 0; 925 pcrel_adjust = 0; 926 tmp = 0; 927 928 switch ((d = operandsP[(loop << 1) + 1])) 929 { 930 case 'f': /* Operand of sfsr turns out to be a nasty 931 specialcase. */ 932 opcode_bit_ptr -= 5; 933 case 'Z': /* Float not immediate. */ 934 case 'F': /* 32 bit float general form. */ 935 case 'L': /* 64 bit float. */ 936 case 'I': /* Integer not immediate. */ 937 case 'B': /* Byte */ 938 case 'W': /* Word */ 939 case 'D': /* Double-word. */ 940 case 'A': /* Double-word gen-address-form ie no regs 941 allowed. */ 942 get_addr_mode (argv[i], &addr_modeP); 943 944 if ((addr_modeP.mode == 20) && 945 (d == 'I' || d == 'Z' || d == 'A')) 946 as_fatal (d == 'A'? _("Address of immediate operand"): 947 _("Invalid immediate write operand.")); 948 949 if (opcode_bit_ptr == desc->opcode_size) 950 b = 4; 951 else 952 b = 6; 953 954 for (j = b; j < (b + 2); j++) 955 { 956 if (addr_modeP.disp[j - b]) 957 { 958 IIF (j, 959 2, 960 addr_modeP.disp_suffix[j - b], 961 (unsigned long) addr_modeP.disp[j - b], 962 0, 963 addr_modeP.pcrel, 964 iif.instr_size, 965 addr_modeP.im_disp, 966 IND (BRANCH, BYTE), 967 NULL, 968 (addr_modeP.scaled_reg ? addr_modeP.scaled_mode 969 : addr_modeP.mode), 970 0); 971 } 972 } 973 974 opcode_bit_ptr -= 5; 975 iif.iifP[1].object |= ((long) addr_modeP.mode) << opcode_bit_ptr; 976 977 if (addr_modeP.scaled_reg) 978 { 979 j = b / 2; 980 IIF (j, 1, 1, (unsigned long) addr_modeP.index_byte, 981 0, 0, 0, 0, 0, NULL, -1, 0); 982 } 983 break; 984 985 case 'b': /* Multiple instruction disp. */ 986 freeptr++; /* OVE:this is an useful hack. */ 987 sprintf (freeptr, "((%s-1)*%d)", argv[i], desc->im_size); 988 argv[i] = freeptr; 989 pcrel -= 1; /* Make pcrel 0 in spite of what case 'p': 990 wants. */ 991 /* fall thru */ 992 case 'p': /* Displacement - pc relative addressing. */ 993 pcrel += 1; 994 /* fall thru */ 995 case 'd': /* Displacement. */ 996 iif.instr_size += suffixP[i] ? suffixP[i] : 4; 997 IIF (12, 2, suffixP[i], (unsigned long) argv[i], 0, 998 pcrel, pcrel_adjust, 1, IND (BRANCH, BYTE), NULL, -1, 0); 999 break; 1000 case 'H': /* Sequent-hack: the linker wants a bit set 1001 when bsr. */ 1002 pcrel = 1; 1003 iif.instr_size += suffixP[i] ? suffixP[i] : 4; 1004 IIF (12, 2, suffixP[i], (unsigned long) argv[i], 0, 1005 pcrel, pcrel_adjust, 1, IND (BRANCH, BYTE), NULL, -1, 1); 1006 break; 1007 case 'q': /* quick */ 1008 opcode_bit_ptr -= 4; 1009 IIF (11, 2, 42, (unsigned long) argv[i], 0, 0, 0, 0, 0, 1010 bit_fix_new (4, opcode_bit_ptr, -8, 7, 0, 1, 0), -1, 0); 1011 break; 1012 case 'r': /* Register number (3 bits). */ 1013 list_search (argv[i], opt6, &tmp); 1014 opcode_bit_ptr -= 3; 1015 iif.iifP[1].object |= tmp << opcode_bit_ptr; 1016 break; 1017 case 'O': /* Setcfg instruction optionslist. */ 1018 optlist (argv[i], opt3, &tmp); 1019 opcode_bit_ptr -= 4; 1020 iif.iifP[1].object |= tmp << 15; 1021 break; 1022 case 'C': /* Cinv instruction optionslist. */ 1023 optlist (argv[i], opt4, &tmp); 1024 opcode_bit_ptr -= 4; 1025 iif.iifP[1].object |= tmp << 15; /* Insert the regtype in opcode. */ 1026 break; 1027 case 'S': /* String instruction options list. */ 1028 optlist (argv[i], opt5, &tmp); 1029 opcode_bit_ptr -= 4; 1030 iif.iifP[1].object |= tmp << 15; 1031 break; 1032 case 'u': 1033 case 'U': /* Register list. */ 1034 IIF (10, 1, 1, 0, 0, 0, 0, 0, 0, NULL, -1, 0); 1035 switch (operandsP[(i << 1) + 1]) 1036 { 1037 case 'u': /* Restore, exit. */ 1038 optlist (argv[i], opt1, &iif.iifP[10].object); 1039 break; 1040 case 'U': /* Save, enter. */ 1041 optlist (argv[i], opt2, &iif.iifP[10].object); 1042 break; 1043 } 1044 iif.instr_size += 1; 1045 break; 1046 case 'M': /* MMU register. */ 1047 list_search (argv[i], mmureg, &tmp); 1048 opcode_bit_ptr -= 4; 1049 iif.iifP[1].object |= tmp << opcode_bit_ptr; 1050 break; 1051 case 'P': /* CPU register. */ 1052 list_search (argv[i], cpureg, &tmp); 1053 opcode_bit_ptr -= 4; 1054 iif.iifP[1].object |= tmp << opcode_bit_ptr; 1055 break; 1056 case 'g': /* Inss exts. */ 1057 iif.instr_size += 1; /* 1 byte is allocated after the opcode. */ 1058 IIF (10, 2, 1, 1059 (unsigned long) argv[i], /* i always 2 here. */ 1060 0, 0, 0, 0, 0, 1061 bit_fix_new (3, 5, 0, 7, 0, 0, 0), /* A bit_fix is targeted to 1062 the byte. */ 1063 -1, 0); 1064 break; 1065 case 'G': 1066 IIF (11, 2, 42, 1067 (unsigned long) argv[i], /* i always 3 here. */ 1068 0, 0, 0, 0, 0, 1069 bit_fix_new (5, 0, 1, 32, -1, 0, -1), -1, 0); 1070 break; 1071 case 'i': 1072 iif.instr_size += 1; 1073 b = 2 + i; /* Put the extension byte after opcode. */ 1074 IIF (b, 2, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0); 1075 break; 1076 default: 1077 as_fatal (_("Bad opcode-table-option, check in file ns32k-opcode.h")); 1078 } 1079 } 1080 } 1081 1082 /* in: instruction line 1083 out: internal structure of instruction 1084 that has been prepared for direct conversion to fragment(s) and 1085 fixes in a systematical fashion 1086 Return-value = recursive_level. */ 1087 /* Build iif of one assembly text line. */ 1088 1089 static int 1090 parse (const char *line, int recursive_level) 1091 { 1092 const char *lineptr; 1093 char c, suffix_separator; 1094 int i; 1095 unsigned int argc; 1096 int arg_type; 1097 char sqr, sep; 1098 char suffix[MAX_ARGS], *argv[MAX_ARGS]; /* No more than 4 operands. */ 1099 1100 if (recursive_level <= 0) 1101 { 1102 /* Called from md_assemble. */ 1103 for (lineptr = line; (*lineptr) != '\0' && (*lineptr) != ' '; lineptr++) 1104 continue; 1105 1106 c = *lineptr; 1107 *(char *) lineptr = '\0'; 1108 1109 if (!(desc = (struct ns32k_opcode *) hash_find (inst_hash_handle, line))) 1110 as_fatal (_("No such opcode")); 1111 1112 *(char *) lineptr = c; 1113 } 1114 else 1115 lineptr = line; 1116 1117 argc = 0; 1118 1119 if (*desc->operands) 1120 { 1121 if (*lineptr++ != '\0') 1122 { 1123 sqr = '['; 1124 sep = ','; 1125 1126 while (*lineptr != '\0') 1127 { 1128 if (desc->operands[argc << 1]) 1129 { 1130 suffix[argc] = 0; 1131 arg_type = desc->operands[(argc << 1) + 1]; 1132 1133 switch (arg_type) 1134 { 1135 case 'd': 1136 case 'b': 1137 case 'p': 1138 case 'H': 1139 /* The operand is supposed to be a displacement. */ 1140 /* Hackwarning: do not forget to update the 4 1141 cases above when editing ns32k-opcode.h. */ 1142 suffix_separator = ':'; 1143 break; 1144 default: 1145 /* If this char occurs we loose. */ 1146 suffix_separator = '\255'; 1147 break; 1148 } 1149 1150 suffix[argc] = 0; /* 0 when no ':' is encountered. */ 1151 argv[argc] = freeptr; 1152 *freeptr = '\0'; 1153 1154 while ((c = *lineptr) != '\0' && c != sep) 1155 { 1156 if (c == sqr) 1157 { 1158 if (sqr == '[') 1159 { 1160 sqr = ']'; 1161 sep = '\0'; 1162 } 1163 else 1164 { 1165 sqr = '['; 1166 sep = ','; 1167 } 1168 } 1169 1170 if (c == suffix_separator) 1171 { 1172 /* ':' - label/suffix separator. */ 1173 switch (lineptr[1]) 1174 { 1175 case 'b': 1176 suffix[argc] = 1; 1177 break; 1178 case 'w': 1179 suffix[argc] = 2; 1180 break; 1181 case 'd': 1182 suffix[argc] = 4; 1183 break; 1184 default: 1185 as_warn (_("Bad suffix, defaulting to d")); 1186 suffix[argc] = 4; 1187 if (lineptr[1] == '\0' || lineptr[1] == sep) 1188 { 1189 lineptr += 1; 1190 continue; 1191 } 1192 break; 1193 } 1194 1195 lineptr += 2; 1196 continue; 1197 } 1198 1199 *freeptr++ = c; 1200 lineptr++; 1201 } 1202 1203 *freeptr++ = '\0'; 1204 argc += 1; 1205 1206 if (*lineptr == '\0') 1207 continue; 1208 1209 lineptr += 1; 1210 } 1211 else 1212 as_fatal (_("Too many operands passed to instruction")); 1213 } 1214 } 1215 } 1216 1217 if (argc != strlen (desc->operands) / 2) 1218 { 1219 if (strlen (desc->default_args)) 1220 { 1221 /* We can apply default, don't goof. */ 1222 if (parse (desc->default_args, 1) != 1) 1223 /* Check error in default. */ 1224 as_fatal (_("Wrong numbers of operands in default, check ns32k-opcodes.h")); 1225 } 1226 else 1227 as_fatal (_("Wrong number of operands")); 1228 } 1229 1230 for (i = 0; i < IIF_ENTRIES; i++) 1231 /* Mark all entries as void. */ 1232 iif.iifP[i].type = 0; 1233 1234 /* Build opcode iif-entry. */ 1235 iif.instr_size = desc->opcode_size / 8; 1236 IIF (1, 1, iif.instr_size, desc->opcode_seed, 0, 0, 0, 0, 0, 0, -1, 0); 1237 1238 /* This call encodes operands to iif format. */ 1239 if (argc) 1240 encode_operand (argc, argv, &desc->operands[0], 1241 &suffix[0], desc->im_size, desc->opcode_size); 1242 1243 return recursive_level; 1244 } 1245 1246 /* This functionality should really be in the bfd library. */ 1247 1248 static bfd_reloc_code_real_type 1249 reloc (int size, int pcrel, int type) 1250 { 1251 int length, index; 1252 bfd_reloc_code_real_type relocs[] = 1253 { 1254 BFD_RELOC_NS32K_IMM_8, 1255 BFD_RELOC_NS32K_IMM_16, 1256 BFD_RELOC_NS32K_IMM_32, 1257 BFD_RELOC_NS32K_IMM_8_PCREL, 1258 BFD_RELOC_NS32K_IMM_16_PCREL, 1259 BFD_RELOC_NS32K_IMM_32_PCREL, 1260 1261 /* ns32k displacements. */ 1262 BFD_RELOC_NS32K_DISP_8, 1263 BFD_RELOC_NS32K_DISP_16, 1264 BFD_RELOC_NS32K_DISP_32, 1265 BFD_RELOC_NS32K_DISP_8_PCREL, 1266 BFD_RELOC_NS32K_DISP_16_PCREL, 1267 BFD_RELOC_NS32K_DISP_32_PCREL, 1268 1269 /* Normal 2's complement. */ 1270 BFD_RELOC_8, 1271 BFD_RELOC_16, 1272 BFD_RELOC_32, 1273 BFD_RELOC_8_PCREL, 1274 BFD_RELOC_16_PCREL, 1275 BFD_RELOC_32_PCREL 1276 }; 1277 1278 switch (size) 1279 { 1280 case 1: 1281 length = 0; 1282 break; 1283 case 2: 1284 length = 1; 1285 break; 1286 case 4: 1287 length = 2; 1288 break; 1289 default: 1290 length = -1; 1291 break; 1292 } 1293 1294 index = length + 3 * pcrel + 6 * type; 1295 1296 if (index >= 0 && (unsigned int) index < sizeof (relocs) / sizeof (relocs[0])) 1297 return relocs[index]; 1298 1299 if (pcrel) 1300 as_bad (_("Can not do %d byte pc-relative relocation for storage type %d"), 1301 size, type); 1302 else 1303 as_bad (_("Can not do %d byte relocation for storage type %d"), 1304 size, type); 1305 1306 return BFD_RELOC_NONE; 1307 1308 } 1309 1310 static void 1311 fix_new_ns32k (fragS *frag, /* Which frag? */ 1312 int where, /* Where in that frag? */ 1313 int size, /* 1, 2 or 4 usually. */ 1314 symbolS *add_symbol, /* X_add_symbol. */ 1315 long offset, /* X_add_number. */ 1316 int pcrel, /* True if PC-relative relocation. */ 1317 char im_disp, /* True if the value to write is a 1318 displacement. */ 1319 bit_fixS *bit_fixP, /* Pointer at struct of bit_fix's, ignored if 1320 NULL. */ 1321 char bsr, /* Sequent-linker-hack: 1 when relocobject is 1322 a bsr. */ 1323 fragS *opcode_frag, 1324 unsigned int opcode_offset) 1325 { 1326 fixS *fixP = fix_new (frag, where, size, add_symbol, 1327 offset, pcrel, 1328 bit_fixP ? NO_RELOC : reloc (size, pcrel, im_disp) 1329 ); 1330 1331 fix_opcode_frag (fixP) = opcode_frag; 1332 fix_opcode_offset (fixP) = opcode_offset; 1333 fix_im_disp (fixP) = im_disp; 1334 fix_bsr (fixP) = bsr; 1335 fix_bit_fixP (fixP) = bit_fixP; 1336 /* We have a MD overflow check for displacements. */ 1337 fixP->fx_no_overflow = (im_disp != 0); 1338 } 1339 1340 static void 1341 fix_new_ns32k_exp (fragS *frag, /* Which frag? */ 1342 int where, /* Where in that frag? */ 1343 int size, /* 1, 2 or 4 usually. */ 1344 expressionS *exp, /* Expression. */ 1345 int pcrel, /* True if PC-relative relocation. */ 1346 char im_disp, /* True if the value to write is a 1347 displacement. */ 1348 bit_fixS *bit_fixP, /* Pointer at struct of bit_fix's, ignored if 1349 NULL. */ 1350 char bsr, /* Sequent-linker-hack: 1 when relocobject is 1351 a bsr. */ 1352 fragS *opcode_frag, 1353 unsigned int opcode_offset) 1354 { 1355 fixS *fixP = fix_new_exp (frag, where, size, exp, pcrel, 1356 bit_fixP ? NO_RELOC : reloc (size, pcrel, im_disp) 1357 ); 1358 1359 fix_opcode_frag (fixP) = opcode_frag; 1360 fix_opcode_offset (fixP) = opcode_offset; 1361 fix_im_disp (fixP) = im_disp; 1362 fix_bsr (fixP) = bsr; 1363 fix_bit_fixP (fixP) = bit_fixP; 1364 /* We have a MD overflow check for displacements. */ 1365 fixP->fx_no_overflow = (im_disp != 0); 1366 } 1367 1368 /* Convert number to chars in correct order. */ 1369 1370 void 1371 md_number_to_chars (char *buf, valueT value, int nbytes) 1372 { 1373 number_to_chars_littleendian (buf, value, nbytes); 1374 } 1375 1376 /* This is a variant of md_numbers_to_chars. The reason for its' 1377 existence is the fact that ns32k uses Huffman coded 1378 displacements. This implies that the bit order is reversed in 1379 displacements and that they are prefixed with a size-tag. 1380 1381 binary: msb -> lsb 1382 0xxxxxxx byte 1383 10xxxxxx xxxxxxxx word 1384 11xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx double word 1385 1386 This must be taken care of and we do it here! */ 1387 1388 static void 1389 md_number_to_disp (char *buf, long val, int n) 1390 { 1391 switch (n) 1392 { 1393 case 1: 1394 if (val < -64 || val > 63) 1395 as_bad (_("value of %ld out of byte displacement range."), val); 1396 val &= 0x7f; 1397 #ifdef SHOW_NUM 1398 printf ("%x ", val & 0xff); 1399 #endif 1400 *buf++ = val; 1401 break; 1402 1403 case 2: 1404 if (val < -8192 || val > 8191) 1405 as_bad (_("value of %ld out of word displacement range."), val); 1406 val &= 0x3fff; 1407 val |= 0x8000; 1408 #ifdef SHOW_NUM 1409 printf ("%x ", val >> 8 & 0xff); 1410 #endif 1411 *buf++ = (val >> 8); 1412 #ifdef SHOW_NUM 1413 printf ("%x ", val & 0xff); 1414 #endif 1415 *buf++ = val; 1416 break; 1417 1418 case 4: 1419 if (val < -0x20000000 || val >= 0x20000000) 1420 as_bad (_("value of %ld out of double word displacement range."), val); 1421 val |= 0xc0000000; 1422 #ifdef SHOW_NUM 1423 printf ("%x ", val >> 24 & 0xff); 1424 #endif 1425 *buf++ = (val >> 24); 1426 #ifdef SHOW_NUM 1427 printf ("%x ", val >> 16 & 0xff); 1428 #endif 1429 *buf++ = (val >> 16); 1430 #ifdef SHOW_NUM 1431 printf ("%x ", val >> 8 & 0xff); 1432 #endif 1433 *buf++ = (val >> 8); 1434 #ifdef SHOW_NUM 1435 printf ("%x ", val & 0xff); 1436 #endif 1437 *buf++ = val; 1438 break; 1439 1440 default: 1441 as_fatal (_("Internal logic error. line %d, file \"%s\""), 1442 __LINE__, __FILE__); 1443 } 1444 } 1445 1446 static void 1447 md_number_to_imm (char *buf, long val, int n) 1448 { 1449 switch (n) 1450 { 1451 case 1: 1452 #ifdef SHOW_NUM 1453 printf ("%x ", val & 0xff); 1454 #endif 1455 *buf++ = val; 1456 break; 1457 1458 case 2: 1459 #ifdef SHOW_NUM 1460 printf ("%x ", val >> 8 & 0xff); 1461 #endif 1462 *buf++ = (val >> 8); 1463 #ifdef SHOW_NUM 1464 printf ("%x ", val & 0xff); 1465 #endif 1466 *buf++ = val; 1467 break; 1468 1469 case 4: 1470 #ifdef SHOW_NUM 1471 printf ("%x ", val >> 24 & 0xff); 1472 #endif 1473 *buf++ = (val >> 24); 1474 #ifdef SHOW_NUM 1475 printf ("%x ", val >> 16 & 0xff); 1476 #endif 1477 *buf++ = (val >> 16); 1478 #ifdef SHOW_NUM 1479 printf ("%x ", val >> 8 & 0xff); 1480 #endif 1481 *buf++ = (val >> 8); 1482 #ifdef SHOW_NUM 1483 printf ("%x ", val & 0xff); 1484 #endif 1485 *buf++ = val; 1486 break; 1487 1488 default: 1489 as_fatal (_("Internal logic error. line %d, file \"%s\""), 1490 __LINE__, __FILE__); 1491 } 1492 } 1493 1494 /* Fast bitfiddling support. */ 1495 /* Mask used to zero bitfield before oring in the true field. */ 1496 1497 static unsigned long l_mask[] = 1498 { 1499 0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8, 1500 0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80, 1501 0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800, 1502 0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000, 1503 0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000, 1504 0xfff00000, 0xffe00000, 0xffc00000, 0xff800000, 1505 0xff000000, 0xfe000000, 0xfc000000, 0xf8000000, 1506 0xf0000000, 0xe0000000, 0xc0000000, 0x80000000, 1507 }; 1508 static unsigned long r_mask[] = 1509 { 1510 0x00000000, 0x00000001, 0x00000003, 0x00000007, 1511 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 1512 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 1513 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 1514 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, 1515 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 1516 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, 1517 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 1518 }; 1519 #define MASK_BITS 31 1520 /* Insert bitfield described by field_ptr and val at buf 1521 This routine is written for modification of the first 4 bytes pointed 1522 to by buf, to yield speed. 1523 The ifdef stuff is for selection between a ns32k-dependent routine 1524 and a general version. (My advice: use the general version!). */ 1525 1526 static void 1527 md_number_to_field (char *buf, long val, bit_fixS *field_ptr) 1528 { 1529 unsigned long object; 1530 unsigned long mask; 1531 /* Define ENDIAN on a ns32k machine. */ 1532 #ifdef ENDIAN 1533 unsigned long *mem_ptr; 1534 #else 1535 char *mem_ptr; 1536 #endif 1537 1538 if (field_ptr->fx_bit_min <= val && val <= field_ptr->fx_bit_max) 1539 { 1540 #ifdef ENDIAN 1541 if (field_ptr->fx_bit_base) 1542 /* Override buf. */ 1543 mem_ptr = (unsigned long *) field_ptr->fx_bit_base; 1544 else 1545 mem_ptr = (unsigned long *) buf; 1546 1547 mem_ptr = ((unsigned long *) 1548 ((char *) mem_ptr + field_ptr->fx_bit_base_adj)); 1549 #else 1550 if (field_ptr->fx_bit_base) 1551 mem_ptr = (char *) field_ptr->fx_bit_base; 1552 else 1553 mem_ptr = buf; 1554 1555 mem_ptr += field_ptr->fx_bit_base_adj; 1556 #endif 1557 #ifdef ENDIAN 1558 /* We have a nice ns32k machine with lowbyte at low-physical mem. */ 1559 object = *mem_ptr; /* get some bytes */ 1560 #else /* OVE Goof! the machine is a m68k or dito. */ 1561 /* That takes more byte fiddling. */ 1562 object = 0; 1563 object |= mem_ptr[3] & 0xff; 1564 object <<= 8; 1565 object |= mem_ptr[2] & 0xff; 1566 object <<= 8; 1567 object |= mem_ptr[1] & 0xff; 1568 object <<= 8; 1569 object |= mem_ptr[0] & 0xff; 1570 #endif 1571 mask = 0; 1572 mask |= (r_mask[field_ptr->fx_bit_offset]); 1573 mask |= (l_mask[field_ptr->fx_bit_offset + field_ptr->fx_bit_size]); 1574 object &= mask; 1575 val += field_ptr->fx_bit_add; 1576 object |= ((val << field_ptr->fx_bit_offset) & (mask ^ 0xffffffff)); 1577 #ifdef ENDIAN 1578 *mem_ptr = object; 1579 #else 1580 mem_ptr[0] = (char) object; 1581 object >>= 8; 1582 mem_ptr[1] = (char) object; 1583 object >>= 8; 1584 mem_ptr[2] = (char) object; 1585 object >>= 8; 1586 mem_ptr[3] = (char) object; 1587 #endif 1588 } 1589 else 1590 as_bad (_("Bit field out of range")); 1591 } 1592 1593 /* Convert iif to fragments. From this point we start to dribble with 1594 functions in other files than this one.(Except hash.c) So, if it's 1595 possible to make an iif for an other CPU, you don't need to know 1596 what frags, relax, obstacks, etc is in order to port this 1597 assembler. You only need to know if it's possible to reduce your 1598 cpu-instruction to iif-format (takes some work) and adopt the other 1599 md_? parts according to given instructions Note that iif was 1600 invented for the clean ns32k`s architecture. */ 1601 1602 /* GAS for the ns32k has a problem. PC relative displacements are 1603 relative to the address of the opcode, not the address of the 1604 operand. We used to keep track of the offset between the operand 1605 and the opcode in pcrel_adjust for each frag and each fix. However, 1606 we get into trouble where there are two or more pc-relative 1607 operands and the size of the first one can't be determined. Then in 1608 the relax phase, the size of the first operand will change and 1609 pcrel_adjust will no longer be correct. The current solution is 1610 keep a pointer to the frag with the opcode in it and the offset in 1611 that frag for each frag and each fix. Then, when needed, we can 1612 always figure out how far it is between the opcode and the pcrel 1613 object. See also md_pcrel_adjust and md_fix_pcrel_adjust. For 1614 objects not part of an instruction, the pointer to the opcode frag 1615 is always zero. */ 1616 1617 static void 1618 convert_iif (void) 1619 { 1620 int i; 1621 bit_fixS *j; 1622 fragS *inst_frag; 1623 unsigned int inst_offset; 1624 char *inst_opcode; 1625 char *memP; 1626 int l; 1627 int k; 1628 char type; 1629 char size = 0; 1630 1631 frag_grow (iif.instr_size); /* This is important. */ 1632 memP = frag_more (0); 1633 inst_opcode = memP; 1634 inst_offset = (memP - frag_now->fr_literal); 1635 inst_frag = frag_now; 1636 1637 for (i = 0; i < IIF_ENTRIES; i++) 1638 { 1639 if ((type = iif.iifP[i].type)) 1640 { 1641 /* The object exist, so handle it. */ 1642 switch (size = iif.iifP[i].size) 1643 { 1644 case 42: 1645 size = 0; 1646 /* It's a bitfix that operates on an existing object. */ 1647 if (iif.iifP[i].bit_fixP->fx_bit_base) 1648 /* Expand fx_bit_base to point at opcode. */ 1649 iif.iifP[i].bit_fixP->fx_bit_base = (long) inst_opcode; 1650 /* Fall through. */ 1651 1652 case 8: /* bignum or doublefloat. */ 1653 case 1: 1654 case 2: 1655 case 3: 1656 case 4: 1657 /* The final size in objectmemory is known. */ 1658 memP = frag_more (size); 1659 j = iif.iifP[i].bit_fixP; 1660 1661 switch (type) 1662 { 1663 case 1: /* The object is pure binary. */ 1664 if (j) 1665 md_number_to_field (memP, exprP.X_add_number, j); 1666 1667 else if (iif.iifP[i].pcrel) 1668 fix_new_ns32k (frag_now, 1669 (long) (memP - frag_now->fr_literal), 1670 size, 1671 0, 1672 iif.iifP[i].object, 1673 iif.iifP[i].pcrel, 1674 iif.iifP[i].im_disp, 1675 0, 1676 iif.iifP[i].bsr, /* Sequent hack. */ 1677 inst_frag, inst_offset); 1678 else 1679 { 1680 /* Good, just put them bytes out. */ 1681 switch (iif.iifP[i].im_disp) 1682 { 1683 case 0: 1684 md_number_to_chars (memP, iif.iifP[i].object, size); 1685 break; 1686 case 1: 1687 md_number_to_disp (memP, iif.iifP[i].object, size); 1688 break; 1689 default: 1690 as_fatal (_("iif convert internal pcrel/binary")); 1691 } 1692 } 1693 break; 1694 1695 case 2: 1696 /* The object is a pointer at an expression, so 1697 unpack it, note that bignums may result from the 1698 expression. */ 1699 evaluate_expr (&exprP, (char *) iif.iifP[i].object); 1700 if (exprP.X_op == O_big || size == 8) 1701 { 1702 if ((k = exprP.X_add_number) > 0) 1703 { 1704 /* We have a bignum ie a quad. This can only 1705 happens in a long suffixed instruction. */ 1706 if (k * 2 > size) 1707 as_bad (_("Bignum too big for long")); 1708 1709 if (k == 3) 1710 memP += 2; 1711 1712 for (l = 0; k > 0; k--, l += 2) 1713 md_number_to_chars (memP + l, 1714 generic_bignum[l >> 1], 1715 sizeof (LITTLENUM_TYPE)); 1716 } 1717 else 1718 { 1719 /* flonum. */ 1720 LITTLENUM_TYPE words[4]; 1721 1722 switch (size) 1723 { 1724 case 4: 1725 gen_to_words (words, 2, 8); 1726 md_number_to_imm (memP, (long) words[0], 1727 sizeof (LITTLENUM_TYPE)); 1728 md_number_to_imm (memP + sizeof (LITTLENUM_TYPE), 1729 (long) words[1], 1730 sizeof (LITTLENUM_TYPE)); 1731 break; 1732 case 8: 1733 gen_to_words (words, 4, 11); 1734 md_number_to_imm (memP, (long) words[0], 1735 sizeof (LITTLENUM_TYPE)); 1736 md_number_to_imm (memP + sizeof (LITTLENUM_TYPE), 1737 (long) words[1], 1738 sizeof (LITTLENUM_TYPE)); 1739 md_number_to_imm ((memP + 2 1740 * sizeof (LITTLENUM_TYPE)), 1741 (long) words[2], 1742 sizeof (LITTLENUM_TYPE)); 1743 md_number_to_imm ((memP + 3 1744 * sizeof (LITTLENUM_TYPE)), 1745 (long) words[3], 1746 sizeof (LITTLENUM_TYPE)); 1747 break; 1748 } 1749 } 1750 break; 1751 } 1752 if (exprP.X_add_symbol || 1753 exprP.X_op_symbol || 1754 iif.iifP[i].pcrel) 1755 { 1756 /* The expression was undefined due to an 1757 undefined label. Create a fix so we can fix 1758 the object later. */ 1759 exprP.X_add_number += iif.iifP[i].object_adjust; 1760 fix_new_ns32k_exp (frag_now, 1761 (long) (memP - frag_now->fr_literal), 1762 size, 1763 &exprP, 1764 iif.iifP[i].pcrel, 1765 iif.iifP[i].im_disp, 1766 j, 1767 iif.iifP[i].bsr, 1768 inst_frag, inst_offset); 1769 } 1770 else if (j) 1771 md_number_to_field (memP, exprP.X_add_number, j); 1772 else 1773 { 1774 /* Good, just put them bytes out. */ 1775 switch (iif.iifP[i].im_disp) 1776 { 1777 case 0: 1778 md_number_to_imm (memP, exprP.X_add_number, size); 1779 break; 1780 case 1: 1781 md_number_to_disp (memP, exprP.X_add_number, size); 1782 break; 1783 default: 1784 as_fatal (_("iif convert internal pcrel/pointer")); 1785 } 1786 } 1787 break; 1788 default: 1789 as_fatal (_("Internal logic error in iif.iifP[n].type")); 1790 } 1791 break; 1792 1793 case 0: 1794 /* Too bad, the object may be undefined as far as its 1795 final nsize in object memory is concerned. The size 1796 of the object in objectmemory is not explicitly 1797 given. If the object is defined its length can be 1798 determined and a fix can replace the frag. */ 1799 { 1800 evaluate_expr (&exprP, (char *) iif.iifP[i].object); 1801 1802 if ((exprP.X_add_symbol || exprP.X_op_symbol) && 1803 !iif.iifP[i].pcrel) 1804 { 1805 /* Size is unknown until link time so have to default. */ 1806 size = default_disp_size; /* Normally 4 bytes. */ 1807 memP = frag_more (size); 1808 fix_new_ns32k_exp (frag_now, 1809 (long) (memP - frag_now->fr_literal), 1810 size, 1811 &exprP, 1812 0, /* never iif.iifP[i].pcrel, */ 1813 1, /* always iif.iifP[i].im_disp */ 1814 (bit_fixS *) 0, 0, 1815 inst_frag, 1816 inst_offset); 1817 break; /* Exit this absolute hack. */ 1818 } 1819 1820 if (exprP.X_add_symbol || exprP.X_op_symbol) 1821 { 1822 /* Frag it. */ 1823 if (exprP.X_op_symbol) 1824 /* We cant relax this case. */ 1825 as_fatal (_("Can't relax difference")); 1826 else 1827 { 1828 /* Size is not important. This gets fixed by 1829 relax, but we assume 0 in what follows. */ 1830 memP = frag_more (4); /* Max size. */ 1831 size = 0; 1832 1833 { 1834 fragS *old_frag = frag_now; 1835 frag_variant (rs_machine_dependent, 1836 4, /* Max size. */ 1837 0, /* Size. */ 1838 IND (BRANCH, UNDEF), /* Expecting 1839 the worst. */ 1840 exprP.X_add_symbol, 1841 exprP.X_add_number, 1842 inst_opcode); 1843 frag_opcode_frag (old_frag) = inst_frag; 1844 frag_opcode_offset (old_frag) = inst_offset; 1845 frag_bsr (old_frag) = iif.iifP[i].bsr; 1846 } 1847 } 1848 } 1849 else 1850 { 1851 /* This duplicates code in md_number_to_disp. */ 1852 if (-64 <= exprP.X_add_number && exprP.X_add_number <= 63) 1853 size = 1; 1854 else 1855 { 1856 if (-8192 <= exprP.X_add_number 1857 && exprP.X_add_number <= 8191) 1858 size = 2; 1859 else 1860 { 1861 if (-0x20000000 <= exprP.X_add_number 1862 && exprP.X_add_number<=0x1fffffff) 1863 size = 4; 1864 else 1865 { 1866 as_bad (_("Displacement to large for :d")); 1867 size = 4; 1868 } 1869 } 1870 } 1871 1872 memP = frag_more (size); 1873 md_number_to_disp (memP, exprP.X_add_number, size); 1874 } 1875 } 1876 break; 1877 1878 default: 1879 as_fatal (_("Internal logic error in iif.iifP[].type")); 1880 } 1881 } 1882 } 1883 } 1884 1885 void 1886 md_assemble (char *line) 1887 { 1888 freeptr = freeptr_static; 1889 parse (line, 0); /* Explode line to more fix form in iif. */ 1890 convert_iif (); /* Convert iif to frags, fix's etc. */ 1891 #ifdef SHOW_NUM 1892 printf (" \t\t\t%s\n", line); 1893 #endif 1894 } 1895 1896 void 1897 md_begin (void) 1898 { 1899 /* Build a hashtable of the instructions. */ 1900 const struct ns32k_opcode *ptr; 1901 const char *stat; 1902 const struct ns32k_opcode *endop; 1903 1904 inst_hash_handle = hash_new (); 1905 1906 endop = ns32k_opcodes + sizeof (ns32k_opcodes) / sizeof (ns32k_opcodes[0]); 1907 for (ptr = ns32k_opcodes; ptr < endop; ptr++) 1908 { 1909 if ((stat = hash_insert (inst_hash_handle, ptr->name, (char *) ptr))) 1910 /* Fatal. */ 1911 as_fatal (_("Can't hash %s: %s"), ptr->name, stat); 1912 } 1913 1914 /* Some private space please! */ 1915 freeptr_static = (char *) malloc (PRIVATE_SIZE); 1916 } 1917 1918 /* Must be equal to MAX_PRECISON in atof-ieee.c. */ 1919 #define MAX_LITTLENUMS 6 1920 1921 /* Turn the string pointed to by litP into a floating point constant 1922 of type TYPE, and emit the appropriate bytes. The number of 1923 LITTLENUMS emitted is stored in *SIZEP. An error message is 1924 returned, or NULL on OK. */ 1925 1926 char * 1927 md_atof (int type, char *litP, int *sizeP) 1928 { 1929 int prec; 1930 LITTLENUM_TYPE words[MAX_LITTLENUMS]; 1931 LITTLENUM_TYPE *wordP; 1932 char *t; 1933 1934 switch (type) 1935 { 1936 case 'f': 1937 prec = 2; 1938 break; 1939 1940 case 'd': 1941 prec = 4; 1942 break; 1943 default: 1944 *sizeP = 0; 1945 return _("Bad call to MD_ATOF()"); 1946 } 1947 1948 t = atof_ieee (input_line_pointer, type, words); 1949 if (t) 1950 input_line_pointer = t; 1951 1952 *sizeP = prec * sizeof (LITTLENUM_TYPE); 1953 1954 for (wordP = words + prec; prec--;) 1955 { 1956 md_number_to_chars (litP, (long) (*--wordP), sizeof (LITTLENUM_TYPE)); 1957 litP += sizeof (LITTLENUM_TYPE); 1958 } 1959 1960 return 0; 1961 } 1962 1963 int 1964 md_pcrel_adjust (fragS *fragP) 1965 { 1966 fragS *opcode_frag; 1967 addressT opcode_address; 1968 unsigned int offset; 1969 1970 opcode_frag = frag_opcode_frag (fragP); 1971 if (opcode_frag == 0) 1972 return 0; 1973 1974 offset = frag_opcode_offset (fragP); 1975 opcode_address = offset + opcode_frag->fr_address; 1976 1977 return fragP->fr_address + fragP->fr_fix - opcode_address; 1978 } 1979 1980 static int 1981 md_fix_pcrel_adjust (fixS *fixP) 1982 { 1983 fragS *opcode_frag; 1984 addressT opcode_address; 1985 unsigned int offset; 1986 1987 opcode_frag = fix_opcode_frag (fixP); 1988 if (opcode_frag == 0) 1989 return 0; 1990 1991 offset = fix_opcode_offset (fixP); 1992 opcode_address = offset + opcode_frag->fr_address; 1993 1994 return fixP->fx_where + fixP->fx_frag->fr_address - opcode_address; 1995 } 1996 1997 /* Apply a fixS (fixup of an instruction or data that we didn't have 1998 enough info to complete immediately) to the data in a frag. 1999 2000 On the ns32k, everything is in a different format, so we have broken 2001 out separate functions for each kind of thing we could be fixing. 2002 They all get called from here. */ 2003 2004 void 2005 md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED) 2006 { 2007 long val = * (long *) valP; 2008 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; 2009 2010 if (fix_bit_fixP (fixP)) 2011 /* Bitfields to fix, sigh. */ 2012 md_number_to_field (buf, val, fix_bit_fixP (fixP)); 2013 else switch (fix_im_disp (fixP)) 2014 { 2015 case 0: 2016 /* Immediate field. */ 2017 md_number_to_imm (buf, val, fixP->fx_size); 2018 break; 2019 2020 case 1: 2021 /* Displacement field. */ 2022 /* Calculate offset. */ 2023 md_number_to_disp (buf, 2024 (fixP->fx_pcrel ? val + md_fix_pcrel_adjust (fixP) 2025 : val), fixP->fx_size); 2026 break; 2027 2028 case 2: 2029 /* Pointer in a data object. */ 2030 md_number_to_chars (buf, val, fixP->fx_size); 2031 break; 2032 } 2033 2034 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0) 2035 fixP->fx_done = 1; 2036 } 2037 2038 /* Convert a relaxed displacement to ditto in final output. */ 2039 2040 void 2041 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, 2042 segT sec ATTRIBUTE_UNUSED, 2043 fragS *fragP) 2044 { 2045 long disp; 2046 long ext = 0; 2047 /* Address in gas core of the place to store the displacement. */ 2048 char *buffer_address = fragP->fr_fix + fragP->fr_literal; 2049 /* Address in object code of the displacement. */ 2050 int object_address; 2051 2052 switch (fragP->fr_subtype) 2053 { 2054 case IND (BRANCH, BYTE): 2055 ext = 1; 2056 break; 2057 case IND (BRANCH, WORD): 2058 ext = 2; 2059 break; 2060 case IND (BRANCH, DOUBLE): 2061 ext = 4; 2062 break; 2063 } 2064 2065 if (ext == 0) 2066 return; 2067 2068 know (fragP->fr_symbol); 2069 2070 object_address = fragP->fr_fix + fragP->fr_address; 2071 2072 /* The displacement of the address, from current location. */ 2073 disp = (S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset) - object_address; 2074 disp += md_pcrel_adjust (fragP); 2075 2076 md_number_to_disp (buffer_address, (long) disp, (int) ext); 2077 fragP->fr_fix += ext; 2078 } 2079 2080 /* This function returns the estimated size a variable object will occupy, 2081 one can say that we tries to guess the size of the objects before we 2082 actually know it. */ 2083 2084 int 2085 md_estimate_size_before_relax (fragS *fragP, segT segment) 2086 { 2087 if (fragP->fr_subtype == IND (BRANCH, UNDEF)) 2088 { 2089 if (S_GET_SEGMENT (fragP->fr_symbol) != segment) 2090 { 2091 /* We don't relax symbols defined in another segment. The 2092 thing to do is to assume the object will occupy 4 bytes. */ 2093 fix_new_ns32k (fragP, 2094 (int) (fragP->fr_fix), 2095 4, 2096 fragP->fr_symbol, 2097 fragP->fr_offset, 2098 1, 2099 1, 2100 0, 2101 frag_bsr(fragP), /* Sequent hack. */ 2102 frag_opcode_frag (fragP), 2103 frag_opcode_offset (fragP)); 2104 fragP->fr_fix += 4; 2105 frag_wane (fragP); 2106 return 4; 2107 } 2108 2109 /* Relaxable case. Set up the initial guess for the variable 2110 part of the frag. */ 2111 fragP->fr_subtype = IND (BRANCH, BYTE); 2112 } 2113 2114 if (fragP->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0])) 2115 abort (); 2116 2117 /* Return the size of the variable part of the frag. */ 2118 return md_relax_table[fragP->fr_subtype].rlx_length; 2119 } 2120 2121 int md_short_jump_size = 3; 2122 int md_long_jump_size = 5; 2123 2124 void 2125 md_create_short_jump (char *ptr, 2126 addressT from_addr, 2127 addressT to_addr, 2128 fragS *frag ATTRIBUTE_UNUSED, 2129 symbolS *to_symbol ATTRIBUTE_UNUSED) 2130 { 2131 valueT offset; 2132 2133 offset = to_addr - from_addr; 2134 md_number_to_chars (ptr, (valueT) 0xEA, 1); 2135 md_number_to_disp (ptr + 1, (valueT) offset, 2); 2136 } 2137 2138 void 2139 md_create_long_jump (char *ptr, 2140 addressT from_addr, 2141 addressT to_addr, 2142 fragS *frag ATTRIBUTE_UNUSED, 2143 symbolS *to_symbol ATTRIBUTE_UNUSED) 2144 { 2145 valueT offset; 2146 2147 offset = to_addr - from_addr; 2148 md_number_to_chars (ptr, (valueT) 0xEA, 1); 2149 md_number_to_disp (ptr + 1, (valueT) offset, 4); 2150 } 2151 2152 const char *md_shortopts = "m:"; 2153 2154 struct option md_longopts[] = 2155 { 2156 #define OPTION_DISP_SIZE (OPTION_MD_BASE) 2157 {"disp-size-default", required_argument , NULL, OPTION_DISP_SIZE}, 2158 {NULL, no_argument, NULL, 0} 2159 }; 2160 2161 size_t md_longopts_size = sizeof (md_longopts); 2162 2163 int 2164 md_parse_option (int c, char *arg) 2165 { 2166 switch (c) 2167 { 2168 case 'm': 2169 if (!strcmp (arg, "32032")) 2170 { 2171 cpureg = cpureg_032; 2172 mmureg = mmureg_032; 2173 } 2174 else if (!strcmp (arg, "32532")) 2175 { 2176 cpureg = cpureg_532; 2177 mmureg = mmureg_532; 2178 } 2179 else 2180 { 2181 as_warn (_("invalid architecture option -m%s, ignored"), arg); 2182 return 0; 2183 } 2184 break; 2185 case OPTION_DISP_SIZE: 2186 { 2187 int size = atoi(arg); 2188 switch (size) 2189 { 2190 case 1: case 2: case 4: 2191 default_disp_size = size; 2192 break; 2193 default: 2194 as_warn (_("invalid default displacement size \"%s\". Defaulting to %d."), 2195 arg, default_disp_size); 2196 } 2197 break; 2198 } 2199 2200 default: 2201 return 0; 2202 } 2203 2204 return 1; 2205 } 2206 2207 void 2208 md_show_usage (FILE *stream) 2209 { 2210 fprintf (stream, _("\ 2211 NS32K options:\n\ 2212 -m32032 | -m32532 select variant of NS32K architecture\n\ 2213 --disp-size-default=<1|2|4>\n")); 2214 } 2215 2216 /* This is TC_CONS_FIX_NEW, called by emit_expr in read.c. */ 2217 2218 void 2219 cons_fix_new_ns32k (fragS *frag, /* Which frag? */ 2220 int where, /* Where in that frag? */ 2221 int size, /* 1, 2 or 4 usually. */ 2222 expressionS *exp) /* Expression. */ 2223 { 2224 fix_new_ns32k_exp (frag, where, size, exp, 2225 0, 2, 0, 0, 0, 0); 2226 } 2227 2228 /* We have no need to default values of symbols. */ 2229 2230 symbolS * 2231 md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 2232 { 2233 return 0; 2234 } 2235 2236 /* Round up a section size to the appropriate boundary. */ 2237 2238 valueT 2239 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size) 2240 { 2241 return size; /* Byte alignment is fine. */ 2242 } 2243 2244 /* Exactly what point is a PC-relative offset relative TO? On the 2245 ns32k, they're relative to the start of the instruction. */ 2246 2247 long 2248 md_pcrel_from (fixS *fixP) 2249 { 2250 long res; 2251 2252 res = fixP->fx_where + fixP->fx_frag->fr_address; 2253 #ifdef SEQUENT_COMPATABILITY 2254 if (frag_bsr (fixP->fx_frag)) 2255 res += 0x12 /* FOO Kludge alert! */ 2256 #endif 2257 return res; 2258 } 2259 2260 arelent * 2261 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) 2262 { 2263 arelent *rel; 2264 bfd_reloc_code_real_type code; 2265 2266 code = reloc (fixp->fx_size, fixp->fx_pcrel, fix_im_disp (fixp)); 2267 2268 rel = xmalloc (sizeof (arelent)); 2269 rel->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); 2270 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 2271 rel->address = fixp->fx_frag->fr_address + fixp->fx_where; 2272 if (fixp->fx_pcrel) 2273 rel->addend = fixp->fx_addnumber; 2274 else 2275 rel->addend = 0; 2276 2277 rel->howto = bfd_reloc_type_lookup (stdoutput, code); 2278 if (!rel->howto) 2279 { 2280 const char *name; 2281 2282 name = S_GET_NAME (fixp->fx_addsy); 2283 if (name == NULL) 2284 name = _("<unknown>"); 2285 as_fatal (_("Cannot find relocation type for symbol %s, code %d"), 2286 name, (int) code); 2287 } 2288 2289 return rel; 2290 } 2291