Annotation of GNUtools/cctools/as/hppa-aux.c, revision 1.1.1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.