|
|
1.1 ! root 1: /* hppa-aux.c -- Assembler for the PA - PA-RISC specific support routines ! 2: Copyright (C) 1989 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 1, 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 ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: /* ! 21: HP PA-RISC support was contributed by the Center for Software Science ! 22: at the University of Utah. ! 23: */ ! 24: ! 25: #include <stdio.h> ! 26: #include <string.h> ! 27: #include <ctype.h> ! 28: ! 29: #include "obstack.h" ! 30: #include "as.h" ! 31: #include "frags.h" ! 32: #include "flonum.h" ! 33: #include "expr.h" ! 34: #include "hash.h" ! 35: #include "md.h" ! 36: #include "symbols.h" ! 37: #include "messages.h" ! 38: #include "hppa-aux.h" ! 39: #include "stuff/hppa.h" ! 40: ! 41: extern char *expr_end; /* defined in hppa.c */ ! 42: ! 43: static const int print_errors = 1; ! 44: ! 45: static int reg_name_search( ! 46: char *name); ! 47: ! 48: int pa_parse_number(s) ! 49: char **s; ! 50: { ! 51: int num; ! 52: char *name; ! 53: char c; ! 54: symbolS *sym; ! 55: int status; ! 56: char * p = *s; ! 57: ! 58: while ( *p == ' ' || *p == '\t' ) ! 59: p = p + 1; ! 60: num=-1; /* assume invalid number to begin with */ ! 61: if (isdigit(*p)) { ! 62: num = 0; /* now we know it is a number */ ! 63: ! 64: if ( *p == '0' ! 65: && ( *(p+1) == 'x' || *(p+1) == 'X' ) ) { /* hex input */ ! 66: p = p + 2; ! 67: while ( isdigit(*p) || ( (*p >= 'a') && (*p <= 'f') ) ! 68: || ( (*p >= 'A') && (*p <= 'F') ) ){ ! 69: if ( isdigit(*p) ) ! 70: num = num*16 + *p-'0'; ! 71: else if ( *p >= 'a' && *p <= 'f' ) ! 72: num = num*16 + *p-'a' + 10; ! 73: else ! 74: num = num*16 + *p-'A' + 10; ! 75: ++p; ! 76: } ! 77: } ! 78: else { ! 79: while (isdigit(*p)) { ! 80: num= num*10 + *p-'0'; ! 81: ++p; ! 82: } ! 83: } ! 84: } ! 85: else if ( *p == '%' ) { /* could be a pre-defined register */ ! 86: num = 0; ! 87: name = p; ! 88: p++; ! 89: c = *p; ! 90: ! 91: /* ! 92: * tege hack: Special case for general registers as the ! 93: * general code makes a binary search with case translation, ! 94: * and is VERY slow. ! 95: */ ! 96: if (c == 'r') { ! 97: p++; ! 98: if (!isdigit(*p)) ! 99: as_bad("Undefined register: '%s'. ASSUMING 0",name); ! 100: else { ! 101: do ! 102: num= num*10 + *p++ - '0'; ! 103: while (isdigit(*p)); ! 104: } ! 105: } ! 106: else { ! 107: while ( is_part_of_name(c) ) { ! 108: p = p + 1; ! 109: c = *p; ! 110: } ! 111: /* Terminate string with \0. Restore below. */ ! 112: *p = 0; ! 113: status = reg_name_search(name); ! 114: if ( status >= 0 ) ! 115: num = status; ! 116: else { ! 117: if ( print_errors ) ! 118: as_bad("Undefined register: '%s'. ASSUMING 0",name); ! 119: else ! 120: num = -1; ! 121: } ! 122: /* Restore orignal value of string. */ ! 123: *p = c; ! 124: } ! 125: } ! 126: else { ! 127: num = 0; ! 128: name = p; ! 129: c = *p; ! 130: while ( is_part_of_name(c) ) { ! 131: p = p + 1; ! 132: c = *p; ! 133: } ! 134: *p = 0; ! 135: if ( (sym = symbol_find(name)) != NULL ) { ! 136: if ( sym->sy_type == N_ABS && sym->sy_other == NO_SECT ) { ! 137: num = sym->sy_value; ! 138: } ! 139: else { ! 140: if ( print_errors ) ! 141: as_bad("Non-absolute constant: '%s'. ASSUMING 0",name); ! 142: else ! 143: num = -1; ! 144: } ! 145: } ! 146: else { ! 147: if ( print_errors ) ! 148: as_bad("Undefined absolute constant: '%s'. ASSUMING 0",name); ! 149: else ! 150: num = -1; ! 151: } ! 152: *p = c; ! 153: } ! 154: ! 155: *s = p; ! 156: return num; ! 157: } ! 158: ! 159: struct pd_reg { ! 160: char *name; ! 161: int value; ! 162: }; ! 163: ! 164: /* List of registers that are pre-defined: ! 165: ! 166: General Registers: ! 167: ! 168: Name Value Name Value ! 169: %r0 0 %r16 16 ! 170: %r1 1 %r17 17 ! 171: %r2 2 %r18 18 ! 172: %r3 3 %r19 19 ! 173: %r4 4 %r20 20 ! 174: %r5 5 %r21 21 ! 175: %r6 6 %r22 22 ! 176: %r7 7 %r23 23 ! 177: %r8 8 %r24 24 ! 178: %r9 9 %r25 25 ! 179: %r10 10 %r26 26 ! 180: %r11 11 %r27 27 ! 181: %r12 12 %r28 28 ! 182: %r13 13 %r29 29 ! 183: %r14 14 %r30 30 ! 184: %r15 15 %r31 31 ! 185: ! 186: Floating-point Registers: ! 187: [NOTE: Also includes L and R versions of these (e.g. %fr19L, %fr19R)] ! 188: ! 189: Name Value Name Value ! 190: %fr0 0 %fr16 16 ! 191: %fr1 1 %fr17 17 ! 192: %fr2 2 %fr18 18 ! 193: %fr3 3 %fr19 19 ! 194: %fr4 4 %fr20 20 ! 195: %fr5 5 %fr21 21 ! 196: %fr6 6 %fr22 22 ! 197: %fr7 7 %fr23 23 ! 198: %fr8 8 %fr24 24 ! 199: %fr9 9 %fr25 25 ! 200: %fr10 10 %fr26 26 ! 201: %fr11 11 %fr27 27 ! 202: %fr12 12 %fr28 28 ! 203: %fr13 13 %fr29 29 ! 204: %fr14 14 %fr30 30 ! 205: %fr15 15 %fr31 31 ! 206: ! 207: Space Registers: ! 208: ! 209: Name Value Name Value ! 210: %sr0 0 %sr4 4 ! 211: %sr1 1 %sr5 5 ! 212: %sr2 2 %sr6 6 ! 213: %sr3 3 %sr7 7 ! 214: ! 215: Control registers and their synonyms: ! 216: ! 217: Names Value ! 218: %cr0 %rctr 0 ! 219: %cr8 %pidr1 8 ! 220: %cr9 %pidr2 9 ! 221: %cr10 %ccr 10 ! 222: %cr11 %sar 11 ! 223: %cr12 %pidr3 12 ! 224: %cr13 %pidr4 13 ! 225: %cr14 %iva 14 ! 226: %cr15 %eiem 15 ! 227: %cr16 %itmr 16 ! 228: %cr17 %pcsq 17 ! 229: %cr18 %pcoq 18 ! 230: %cr19 %iir 19 ! 231: %cr20 %isr 20 ! 232: %cr21 %ior 21 ! 233: %cr22 %ipsw 22 ! 234: %cr23 %eirr 23 ! 235: %cr24 %tr0 %ppda 24 ! 236: %cr25 %tr1 %hta 25 ! 237: %cr26 %tr2 26 ! 238: %cr27 %tr3 27 ! 239: %cr28 %tr4 28 ! 240: %cr29 %tr5 29 ! 241: %cr30 %tr6 30 ! 242: %cr31 %tr7 31 ! 243: ! 244: */ ! 245: ! 246: /* This table is sorted. Suitable for searching by a binary search. */ ! 247: ! 248: static struct pd_reg pre_defined_registers[] = { ! 249: { "%ccr", 10 }, ! 250: { "%cr0", 0 }, ! 251: { "%cr10", 10 }, ! 252: { "%cr11", 11 }, ! 253: { "%cr12", 12 }, ! 254: { "%cr13", 13 }, ! 255: { "%cr14", 14 }, ! 256: { "%cr15", 15 }, ! 257: { "%cr16", 16 }, ! 258: { "%cr17", 17 }, ! 259: { "%cr18", 18 }, ! 260: { "%cr19", 19 }, ! 261: { "%cr20", 20 }, ! 262: { "%cr21", 21 }, ! 263: { "%cr22", 22 }, ! 264: { "%cr23", 23 }, ! 265: { "%cr24", 24 }, ! 266: { "%cr25", 25 }, ! 267: { "%cr26", 26 }, ! 268: { "%cr27", 27 }, ! 269: { "%cr28", 28 }, ! 270: { "%cr29", 29 }, ! 271: { "%cr30", 30 }, ! 272: { "%cr31", 31 }, ! 273: { "%cr8", 8 }, ! 274: { "%cr9", 9 }, ! 275: { "%eiem", 15 }, ! 276: { "%eirr", 23 }, ! 277: { "%fr0", 0 }, ! 278: { "%fr0L", 0 }, ! 279: { "%fr0R", 0 }, ! 280: { "%fr1", 1 }, ! 281: { "%fr10", 10 }, ! 282: { "%fr10L", 10 }, ! 283: { "%fr10R", 10 }, ! 284: { "%fr11", 11 }, ! 285: { "%fr11L", 11 }, ! 286: { "%fr11R", 11 }, ! 287: { "%fr12", 12 }, ! 288: { "%fr12L", 12 }, ! 289: { "%fr12R", 12 }, ! 290: { "%fr13", 13 }, ! 291: { "%fr13L", 13 }, ! 292: { "%fr13R", 13 }, ! 293: { "%fr14", 14 }, ! 294: { "%fr14L", 14 }, ! 295: { "%fr14R", 14 }, ! 296: { "%fr15", 15 }, ! 297: { "%fr15L", 15 }, ! 298: { "%fr15R", 15 }, ! 299: { "%fr16", 16 }, ! 300: { "%fr16L", 16 }, ! 301: { "%fr16R", 16 }, ! 302: { "%fr17", 17 }, ! 303: { "%fr17L", 17 }, ! 304: { "%fr17R", 17 }, ! 305: { "%fr18", 18 }, ! 306: { "%fr18L", 18 }, ! 307: { "%fr18R", 18 }, ! 308: { "%fr19", 19 }, ! 309: { "%fr19L", 19 }, ! 310: { "%fr19R", 19 }, ! 311: { "%fr1L", 1 }, ! 312: { "%fr1R", 1 }, ! 313: { "%fr2", 2 }, ! 314: { "%fr20", 20 }, ! 315: { "%fr20L", 20 }, ! 316: { "%fr20R", 20 }, ! 317: { "%fr21", 21 }, ! 318: { "%fr21L", 21 }, ! 319: { "%fr21R", 21 }, ! 320: { "%fr22", 22 }, ! 321: { "%fr22L", 22 }, ! 322: { "%fr22R", 22 }, ! 323: { "%fr23", 23 }, ! 324: { "%fr23L", 23 }, ! 325: { "%fr23R", 23 }, ! 326: { "%fr24", 24 }, ! 327: { "%fr24L", 24 }, ! 328: { "%fr24R", 24 }, ! 329: { "%fr25", 25 }, ! 330: { "%fr25L", 25 }, ! 331: { "%fr25R", 25 }, ! 332: { "%fr26", 26 }, ! 333: { "%fr26L", 26 }, ! 334: { "%fr26R", 26 }, ! 335: { "%fr27", 27 }, ! 336: { "%fr27L", 27 }, ! 337: { "%fr27R", 27 }, ! 338: { "%fr28", 28 }, ! 339: { "%fr28L", 28 }, ! 340: { "%fr28R", 28 }, ! 341: { "%fr29", 29 }, ! 342: { "%fr29L", 29 }, ! 343: { "%fr29R", 29 }, ! 344: { "%fr2L", 2 }, ! 345: { "%fr2R", 2 }, ! 346: { "%fr3", 3 }, ! 347: { "%fr30", 30 }, ! 348: { "%fr30L", 30 }, ! 349: { "%fr30R", 30 }, ! 350: { "%fr31", 31 }, ! 351: { "%fr31L", 31 }, ! 352: { "%fr31R", 31 }, ! 353: { "%fr3L", 3 }, ! 354: { "%fr3R", 3 }, ! 355: { "%fr4", 4 }, ! 356: { "%fr4L", 4 }, ! 357: { "%fr4R", 4 }, ! 358: { "%fr5", 5 }, ! 359: { "%fr5L", 5 }, ! 360: { "%fr5R", 5 }, ! 361: { "%fr6", 6 }, ! 362: { "%fr6L", 6 }, ! 363: { "%fr6R", 6 }, ! 364: { "%fr7", 7 }, ! 365: { "%fr7L", 7 }, ! 366: { "%fr7R", 7 }, ! 367: { "%fr8", 8 }, ! 368: { "%fr8L", 8 }, ! 369: { "%fr8R", 8 }, ! 370: { "%fr9", 9 }, ! 371: { "%fr9L", 9 }, ! 372: { "%fr9R", 9 }, ! 373: { "%hta", 25 }, ! 374: { "%iir", 19 }, ! 375: { "%ior", 21 }, ! 376: { "%ipsw", 22 }, ! 377: { "%isr", 20 }, ! 378: { "%itmr", 16 }, ! 379: { "%iva", 14 }, ! 380: { "%pcoq", 18 }, ! 381: { "%pcsq", 17 }, ! 382: { "%pidr1", 8 }, ! 383: { "%pidr2", 9 }, ! 384: { "%pidr3", 12 }, ! 385: { "%pidr4", 13 }, ! 386: { "%ppda", 24 }, ! 387: { "%r0", 0 }, ! 388: { "%r1", 1 }, ! 389: { "%r10", 10 }, ! 390: { "%r11", 11 }, ! 391: { "%r12", 12 }, ! 392: { "%r13", 13 }, ! 393: { "%r14", 14 }, ! 394: { "%r15", 15 }, ! 395: { "%r16", 16 }, ! 396: { "%r17", 17 }, ! 397: { "%r18", 18 }, ! 398: { "%r19", 19 }, ! 399: { "%r2", 2 }, ! 400: { "%r20", 20 }, ! 401: { "%r21", 21 }, ! 402: { "%r22", 22 }, ! 403: { "%r23", 23 }, ! 404: { "%r24", 24 }, ! 405: { "%r25", 25 }, ! 406: { "%r26", 26 }, ! 407: { "%r27", 27 }, ! 408: { "%r28", 28 }, ! 409: { "%r29", 29 }, ! 410: { "%r3", 3 }, ! 411: { "%r30", 30 }, ! 412: { "%r31", 31 }, ! 413: { "%r4", 4 }, ! 414: { "%r4L", 4 }, ! 415: { "%r4R", 4 }, ! 416: { "%r5", 5 }, ! 417: { "%r5L", 5 }, ! 418: { "%r5R", 5 }, ! 419: { "%r6", 6 }, ! 420: { "%r6L", 6 }, ! 421: { "%r6R", 6 }, ! 422: { "%r7", 7 }, ! 423: { "%r7L", 7 }, ! 424: { "%r7R", 7 }, ! 425: { "%r8", 8 }, ! 426: { "%r8L", 8 }, ! 427: { "%r8R", 8 }, ! 428: { "%r9", 9 }, ! 429: { "%r9L", 9 }, ! 430: { "%r9R", 9 }, ! 431: { "%rctr", 0 }, ! 432: { "%sar", 11 }, ! 433: { "%sr0", 0 }, ! 434: { "%sr1", 1 }, ! 435: { "%sr2", 2 }, ! 436: { "%sr3", 3 }, ! 437: { "%sr4", 4 }, ! 438: { "%sr5", 5 }, ! 439: { "%sr6", 6 }, ! 440: { "%sr7", 7 }, ! 441: { "%tr0", 24 }, ! 442: { "%tr1", 25 }, ! 443: { "%tr2", 26 }, ! 444: { "%tr3", 27 }, ! 445: { "%tr4", 28 }, ! 446: { "%tr5", 9 }, ! 447: { "%tr6", 30 }, ! 448: { "%tr7", 31 } ! 449: }; ! 450: ! 451: #define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg)) ! 452: ! 453: static ! 454: int ! 455: reg_name_search( ! 456: char *name) ! 457: { ! 458: int x,l,r; ! 459: ! 460: l = 0; ! 461: r = REG_NAME_CNT - 1; ! 462: ! 463: do { ! 464: x = (l + r) / 2; ! 465: if (strcasecmp(name,pre_defined_registers[x].name) < 0) ! 466: r = x - 1; ! 467: else ! 468: l = x + 1; ! 469: } while ( !( (strcasecmp(name,pre_defined_registers[x].name) == 0) || ! 470: (l > r) ) ); ! 471: ! 472: if ( strcasecmp(name,pre_defined_registers[x].name) == 0 ) ! 473: return(pre_defined_registers[x].value); ! 474: else ! 475: return(-1); ! 476: ! 477: } ! 478: ! 479: static ! 480: int ! 481: is_R_select( ! 482: char *s) ! 483: { ! 484: ! 485: if ( *s == 'R' || *s == 'r' ) ! 486: return(TRUE); ! 487: else ! 488: return(FALSE); ! 489: } ! 490: ! 491: static ! 492: int ! 493: is_L_select( ! 494: char *s) ! 495: { ! 496: ! 497: if ( *s == 'L' || *s == 'l' ) ! 498: return(TRUE); ! 499: else ! 500: return(FALSE); ! 501: } ! 502: ! 503: int need_89_opcode(insn,result) ! 504: struct pa_it *insn; ! 505: struct pa_89_fp_reg_struct *result; ! 506: { ! 507: if ( result->L_R_select == 1 && !(insn->fpof1 == DBL && insn->fpof2 == DBL) ) ! 508: return TRUE; ! 509: else ! 510: return FALSE; ! 511: } ! 512: ! 513: int ! 514: pa_89_parse_number(s,result) ! 515: char **s; ! 516: struct pa_89_fp_reg_struct *result; ! 517: { ! 518: int num; ! 519: char *name; ! 520: char c; ! 521: symbolS *sym; ! 522: int status; ! 523: char * p = *s; ! 524: ! 525: while ( *p == ' ' || *p == '\t' ) ! 526: p = p + 1; ! 527: num=-1; /* assume invalid number to begin with */ ! 528: result->number_part = -1; ! 529: result->L_R_select = -1; ! 530: ! 531: if (isdigit(*p)) { ! 532: num = 0; /* now we know it is a number */ ! 533: ! 534: if ( *p == '0' && ( *(p+1) == 'x' || *(p+1) == 'X' ) ) { /* hex input */ ! 535: p = p + 2; ! 536: while ( isdigit(*p) ! 537: || ( (*p >= 'a') && (*p <= 'f') ) ! 538: || ( (*p >= 'A') && (*p <= 'F') ) ){ ! 539: if ( isdigit(*p) ) ! 540: num = num*16 + *p-'0'; ! 541: else if ( *p >= 'a' && *p <= 'f' ) ! 542: num = num*16 + *p-'a' + 10; ! 543: else ! 544: num = num*16 + *p-'A' + 10; ! 545: ++p; ! 546: } ! 547: } ! 548: else { ! 549: while (isdigit(*p)) { ! 550: num= num*10 + *p-'0'; ! 551: ++p; ! 552: } ! 553: } ! 554: ! 555: result->number_part = num; ! 556: ! 557: if ( is_R_select(p) ) { ! 558: result->L_R_select = 1; ! 559: ++p; ! 560: } ! 561: else if ( is_L_select(p) ) { ! 562: result->L_R_select = 0; ! 563: ++p; ! 564: } ! 565: else ! 566: result->L_R_select = 0; ! 567: ! 568: } ! 569: else if ( *p == '%' ) { /* could be a pre-defined register */ ! 570: num = 0; ! 571: name = p; ! 572: p = p + 1; ! 573: c = *p; ! 574: /* tege hack: Special case for general registers ! 575: as the general code makes a binary search with case translation, ! 576: and is VERY slow. */ ! 577: if (c == 'r') { ! 578: p++; ! 579: if (!isdigit(*p)) ! 580: as_bad("Undefined register: '%s'. ASSUMING 0",name); ! 581: else { ! 582: do ! 583: num= num*10 + *p++ - '0'; ! 584: while (isdigit(*p)); ! 585: } ! 586: } ! 587: else { ! 588: while ( is_part_of_name(c) ) { ! 589: p = p + 1; ! 590: c = *p; ! 591: } ! 592: /* Terminate string with \0. Restore below. */ ! 593: *p = 0; ! 594: status = reg_name_search(name); ! 595: if ( status >= 0 ) ! 596: num = status; ! 597: else { ! 598: if ( print_errors ) ! 599: as_bad("Undefined register: '%s'. ASSUMING 0",name); ! 600: else ! 601: num = -1; ! 602: } ! 603: *p = c; ! 604: } ! 605: ! 606: result->number_part = num; ! 607: ! 608: if ( is_R_select(p-1) ) ! 609: result->L_R_select = 1; ! 610: else if ( is_L_select(p-1) ) ! 611: result->L_R_select = 0; ! 612: else ! 613: result->L_R_select = 0; ! 614: ! 615: } ! 616: else { ! 617: num = 0; ! 618: name = p; ! 619: c = *p; ! 620: while ( is_part_of_name(c) ) { ! 621: p = p + 1; ! 622: c = *p; ! 623: } ! 624: *p = 0; ! 625: if ( (sym = symbol_find(name)) != NULL ) { ! 626: if ( sym->sy_type == N_ABS && sym->sy_other == NO_SECT ) { ! 627: num = sym->sy_value; ! 628: } ! 629: else { ! 630: if ( print_errors ) ! 631: as_bad("Non-absolute constant: '%s'. ASSUMING 0",name); ! 632: else ! 633: num = -1; ! 634: } ! 635: } ! 636: else { ! 637: if ( print_errors ) ! 638: as_bad("Undefined absolute constant: '%s'. ASSUMING 0",name); ! 639: else ! 640: num = -1; ! 641: } ! 642: *p = c; ! 643: ! 644: result->number_part = num; ! 645: ! 646: if ( is_R_select(p-1) ) { ! 647: result->L_R_select = 1; ! 648: } ! 649: else if ( is_L_select(p-1) ) { ! 650: result->L_R_select = 0; ! 651: } ! 652: else ! 653: result->L_R_select = 0; ! 654: } ! 655: ! 656: *s = p; ! 657: return num; ! 658: ! 659: } ! 660: ! 661: int pa_parse_fp_cmp_cond(s) ! 662: char **s; ! 663: { ! 664: int cond,i; ! 665: struct possibleS { ! 666: char *string; ! 667: int cond; ! 668: }; ! 669: ! 670: /* ! 671: This table is sorted by order of the length of the string. This is so we ! 672: check for <> before we check for <. If we had a <> and checked for < first, ! 673: we would get a false match. ! 674: */ ! 675: static struct possibleS poss[] = ! 676: { ! 677: { "false?", 0 }, ! 678: { "false", 1 }, ! 679: { "true?", 30 }, ! 680: { "true", 31 }, ! 681: { "!<=>", 3 }, ! 682: { "!?>=", 8 }, ! 683: { "!?<=", 16 }, ! 684: { "!<>", 7 }, ! 685: { "!>=", 11 }, ! 686: { "!?>", 12 }, ! 687: { "?<=", 14 }, ! 688: { "!<=", 19 }, ! 689: { "!?<", 20 }, ! 690: { "?>=", 22 }, ! 691: { "!?=", 24 }, ! 692: { "!=t", 27 }, ! 693: { "<=>", 29 }, ! 694: { "=t", 5 }, ! 695: { "?=", 6 }, ! 696: { "?<", 10 }, ! 697: { "<=", 13 }, ! 698: { "!>", 15 }, ! 699: { "?>", 18 }, ! 700: { ">=", 21 }, ! 701: { "!<", 23 }, ! 702: { "<>", 25 }, ! 703: { "!=", 26 }, ! 704: { "!?", 28 }, ! 705: { "?", 2 }, ! 706: { "=", 4 }, ! 707: { "<", 9 }, ! 708: { ">", 17 } ! 709: }; ! 710: ! 711: cond=0; ! 712: ! 713: for ( i = 0; i < 32; i++ ) { ! 714: if ( strncasecmp(*s,poss[i].string,strlen(poss[i].string)) == 0 ) { ! 715: cond = poss[i].cond; ! 716: *s += strlen(poss[i].string); ! 717: while ( **s == ' ' || **s == '\t' ) ! 718: *s = *s + 1; ! 719: return cond; ! 720: } ! 721: } ! 722: ! 723: as_bad("Illegal FP Compare Condition: %c",**s); ! 724: return 0; ! 725: } ! 726: ! 727: FP_Operand_Format pa_parse_fp_format(s) ! 728: char **s; ! 729: { ! 730: int f; ! 731: ! 732: f = SGL; ! 733: if ( **s == ',' ) { ! 734: *s += 1; ! 735: if ( strncasecmp(*s,"sgl",3) == 0 ) { ! 736: f = SGL; ! 737: *s += 4; ! 738: } ! 739: else if ( strncasecmp(*s,"dbl",3) == 0 ) { ! 740: f = DBL; ! 741: *s += 4; ! 742: } ! 743: else if ( strncasecmp(*s,"quad",4) == 0 ) { ! 744: f = QUAD; ! 745: *s += 5; ! 746: } ! 747: else { ! 748: f = ILLEGAL_FMT; ! 749: as_bad("Unrecognized FP Operand Format: %3s",*s); ! 750: } ! 751: } ! 752: while ( **s == ' ' || **s == '\t' || **s == 0 ) ! 753: *s = *s + 1; ! 754: ! 755: return f; ! 756: } ! 757: ! 758: int ! 759: getExpression( ! 760: char *str) ! 761: { ! 762: char *save_in; ! 763: segT seg; ! 764: ! 765: save_in = input_line_pointer; ! 766: input_line_pointer = str; ! 767: switch (seg = expression(&the_insn.exp)) { ! 768: ! 769: case SEG_ABSOLUTE: ! 770: case SEG_SECT: ! 771: case SEG_DIFFSECT: ! 772: case SEG_UNKNOWN: ! 773: case SEG_NONE: ! 774: case SEG_BIG: ! 775: break; ! 776: ! 777: default: ! 778: the_insn.error = "illegal segment"; ! 779: expr_end = input_line_pointer; ! 780: input_line_pointer=save_in; ! 781: return 1; ! 782: } ! 783: expr_end = input_line_pointer; ! 784: input_line_pointer = save_in; ! 785: return 0; ! 786: } ! 787: ! 788: int ! 789: getAbsoluteExpression( ! 790: char *str) ! 791: { ! 792: char *save_in; ! 793: segT seg; ! 794: ! 795: for ( ; *str == ' ' || *str == '\t' ; str++) ! 796: ; /* do nothing */ ! 797: save_in = input_line_pointer; ! 798: input_line_pointer = str; ! 799: switch (seg = expression(&the_insn.exp)) { ! 800: case SEG_ABSOLUTE: ! 801: break; ! 802: default: ! 803: the_insn.error = "segment should be ABSOLUTE"; ! 804: expr_end = input_line_pointer; ! 805: input_line_pointer=save_in; ! 806: return 1; ! 807: } ! 808: expr_end = input_line_pointer; ! 809: input_line_pointer = save_in; ! 810: return 0; ! 811: } ! 812: ! 813: int ! 814: evaluateAbsolute( ! 815: expressionS exp, ! 816: int field_selector) ! 817: { ! 818: int value; ! 819: unsigned long left21, right14; ! 820: ! 821: value = exp.X_add_number; ! 822: calc_hppa_HILO(0, value, &left21, &right14); ! 823: ! 824: if ( exp.X_add_symbol ) { ! 825: value += exp.X_add_symbol->sy_value; ! 826: } ! 827: if ( exp.X_subtract_symbol ) { ! 828: value -= exp.X_subtract_symbol->sy_value; ! 829: } ! 830: ! 831: switch (field_selector) { ! 832: case /* no selector */ 0: ! 833: break; ! 834: case /* e_lsel */ 1: /* L` */ ! 835: value = left21; ! 836: break; ! 837: ! 838: case /* e_rsel */ 2: /* R` */ ! 839: value = right14; ! 840: break; ! 841: default: ! 842: BAD_CASE(field_selector); ! 843: break; ! 844: } ! 845: return value; ! 846: } ! 847: ! 848: int pa_parse_nullif(s) ! 849: char **s; ! 850: { ! 851: int nullif; ! 852: ! 853: nullif = 0; ! 854: if ( **s == ',' ) { ! 855: *s = *s + 1; ! 856: if ( strncasecmp(*s,"n",1) == 0 ) ! 857: nullif = 1; ! 858: else { ! 859: as_bad("Unrecognized Nullification: (%c)",**s); ! 860: nullif = 0; ! 861: } ! 862: *s = *s + 1; ! 863: } ! 864: while ( **s == ' ' || **s == '\t' ) ! 865: *s = *s + 1; ! 866: ! 867: return nullif; ! 868: } ! 869: ! 870: int pa_parse_nonneg_cmpsub_cmpltr(s) ! 871: char **s; ! 872: { ! 873: int cmpltr; ! 874: char *name; ! 875: char c; ! 876: ! 877: cmpltr = 0; ! 878: if ( **s == ',' ) { ! 879: *s+=1; ! 880: name = *s; ! 881: while ( **s != ',' && **s != ' ' && **s != '\t' ) ! 882: *s += 1; ! 883: c = **s; ! 884: **s = 0x00; ! 885: if ( strcmp(name,"=") == 0 ) { ! 886: cmpltr = 1; ! 887: } ! 888: else if ( strcmp(name,"<") == 0 ) { ! 889: cmpltr = 2; ! 890: } ! 891: else if ( strcmp(name,"<=") == 0 ) { ! 892: cmpltr = 3; ! 893: } ! 894: else if ( strcmp(name,"<<") == 0 ) { ! 895: cmpltr = 4; ! 896: } ! 897: else if ( strcmp(name,"<<=") == 0 ) { ! 898: cmpltr = 5; ! 899: } ! 900: else if ( strcasecmp(name,"sv") == 0 ) { ! 901: cmpltr = 6; ! 902: } ! 903: else if ( strcasecmp(name,"od") == 0 ) { ! 904: cmpltr = 7; ! 905: } ! 906: else ! 907: cmpltr = -1; ! 908: **s = c; ! 909: } ! 910: if ( cmpltr >= 0 ) { ! 911: while ( **s == ' ' || **s == '\t' ) ! 912: *s = *s + 1; ! 913: } ! 914: ! 915: return cmpltr; ! 916: } ! 917: ! 918: int pa_parse_neg_cmpsub_cmpltr(s) ! 919: char **s; ! 920: { ! 921: int cmpltr; ! 922: char *name; ! 923: char c; ! 924: ! 925: cmpltr = -1; ! 926: if ( **s == ',' ) { ! 927: *s+=1; ! 928: name = *s; ! 929: while ( **s != ',' && **s != ' ' && **s != '\t' ) ! 930: *s += 1; ! 931: c = **s; ! 932: **s = 0x00; ! 933: if ( strcasecmp(name,"tr") == 0 ) { ! 934: cmpltr = 0; ! 935: } ! 936: else if ( strcmp(name,"<>") == 0 ) { ! 937: cmpltr = 1; ! 938: } ! 939: else if ( strcmp(name,">=") == 0 ) { ! 940: cmpltr = 2; ! 941: } ! 942: else if ( strcmp(name,">") == 0 ) { ! 943: cmpltr = 3; ! 944: } ! 945: else if ( strcmp(name,">>=") == 0 ) { ! 946: cmpltr = 4; ! 947: } ! 948: else if ( strcmp(name,">>") == 0 ) { ! 949: cmpltr = 5; ! 950: } ! 951: else if ( strcasecmp(name,"nsv") == 0 ) { ! 952: cmpltr = 6; ! 953: } ! 954: else if ( strcasecmp(name,"ev") == 0 ) { ! 955: cmpltr = 7; ! 956: } ! 957: **s = c; ! 958: } ! 959: if ( cmpltr >= 0 ) { ! 960: while ( **s == ' ' || **s == '\t' ) ! 961: *s = *s + 1; ! 962: } ! 963: ! 964: return cmpltr; ! 965: } ! 966: ! 967: int pa_parse_nonneg_add_cmpltr(s) ! 968: char **s; ! 969: { ! 970: int cmpltr; ! 971: char *name; ! 972: char c; ! 973: ! 974: cmpltr = -1; ! 975: if ( **s == ',' ) { ! 976: *s+=1; ! 977: name = *s; ! 978: while ( **s != ',' && **s != ' ' && **s != '\t' ) ! 979: *s += 1; ! 980: c = **s; ! 981: **s = 0x00; ! 982: if ( strcmp(name,"=") == 0 ) { ! 983: cmpltr = 1; ! 984: } ! 985: else if ( strcmp(name,"<") == 0 ) { ! 986: cmpltr = 2; ! 987: } ! 988: else if ( strcmp(name,"<=") == 0 ) { ! 989: cmpltr = 3; ! 990: } ! 991: else if ( strcasecmp(name,"nuv") == 0 ) { ! 992: cmpltr = 4; ! 993: } ! 994: else if ( strcasecmp(name,"znv") == 0 ) { ! 995: cmpltr = 5; ! 996: } ! 997: else if ( strcasecmp(name,"sv") == 0 ) { ! 998: cmpltr = 6; ! 999: } ! 1000: else if ( strcasecmp(name,"od") == 0 ) { ! 1001: cmpltr = 7; ! 1002: } ! 1003: **s = c; ! 1004: } ! 1005: if ( cmpltr >= 0 ) { ! 1006: while ( **s == ' ' || **s == '\t' ) ! 1007: *s = *s + 1; ! 1008: } ! 1009: ! 1010: return cmpltr; ! 1011: } ! 1012: ! 1013: int pa_parse_neg_add_cmpltr(s) ! 1014: char **s; ! 1015: { ! 1016: int cmpltr; ! 1017: char *name; ! 1018: char c; ! 1019: ! 1020: cmpltr = -1; ! 1021: if ( **s == ',' ) { ! 1022: *s+=1; ! 1023: name = *s; ! 1024: while ( **s != ',' && **s != ' ' && **s != '\t' ) ! 1025: *s += 1; ! 1026: c = **s; ! 1027: **s = 0x00; ! 1028: if ( strcasecmp(name,"tr") == 0 ) { ! 1029: cmpltr = 0; ! 1030: } ! 1031: else if ( strcmp(name,"<>") == 0 ) { ! 1032: cmpltr = 1; ! 1033: } ! 1034: else if ( strcmp(name,">=") == 0 ) { ! 1035: cmpltr = 2; ! 1036: } ! 1037: else if ( strcmp(name,">") == 0 ) { ! 1038: cmpltr = 3; ! 1039: } ! 1040: else if ( strcmp(name,"uv") == 0 ) { ! 1041: cmpltr = 4; ! 1042: } ! 1043: else if ( strcmp(name,"vnz") == 0 ) { ! 1044: cmpltr = 5; ! 1045: } ! 1046: else if ( strcasecmp(name,"nsv") == 0 ) { ! 1047: cmpltr = 6; ! 1048: } ! 1049: else if ( strcasecmp(name,"ev") == 0 ) { ! 1050: cmpltr = 7; ! 1051: } ! 1052: **s = c; ! 1053: } ! 1054: if ( cmpltr >= 0 ) { ! 1055: while ( **s == ' ' || **s == '\t' ) ! 1056: *s = *s + 1; ! 1057: } ! 1058: ! 1059: return cmpltr; ! 1060: } ! 1061: ! 1062: static int ! 1063: is_same_frag(frag1P,frag2P) ! 1064: fragS *frag1P; ! 1065: fragS *frag2P; ! 1066: { ! 1067: ! 1068: if ( frag1P == NULL ) ! 1069: return (FALSE); ! 1070: else if ( frag2P == NULL ) ! 1071: return (FALSE); ! 1072: else if ( frag1P == frag2P ) ! 1073: return (TRUE); ! 1074: else if ( frag2P->fr_type == rs_fill && frag2P->fr_fix == 0 ) ! 1075: return is_same_frag(frag1P,frag2P->fr_next); ! 1076: else if ( frag2P->fr_type == rs_align ) ! 1077: return is_same_frag(frag1P,frag2P->fr_next); ! 1078: else ! 1079: return (FALSE); ! 1080: } ! 1081: ! 1082: /* end hppa-aux.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.