Annotation of GNUtools/cctools/as/hppa-check.c, revision 1.1

1.1     ! root        1: #include "hppa-opcode.h"
        !             2: #include <stdio.h>
        !             3: 
        !             4: extern long random();
        !             5: 
        !             6: #define RANGE(number)  (random() % (number))
        !             7: #define COIN                   (RANGE(2))
        !             8: #define IMM_NUM(range) {       int tmp000111000usv = RANGE(range); \
        !             9:                                                        if (tmp000111000usv == 0) \
        !            10:                                                                printf(" %d", tmp000111000usv); \
        !            11:                                                        else \
        !            12:                                                                printf(" %c%d", (COIN) ? '-' : ' ',  \
        !            13:                                                                        tmp000111000usv); \
        !            14:                                                }
        !            15: 
        !            16: 
        !            17: /* The 'cond' decode table */
        !            18: 
        !            19: typedef  struct  condition_decode {
        !            20:        char condition[4];
        !            21: }  condT;
        !            22: 
        !            23: char *get_cond_str(const condT table[8][2], int c, int f );
        !            24: 
        !            25: /* condition decode tables
        !            26:  * Refer to PA-RISC 1.1 Architecture and Instruction Set 
        !            27:  * Reference Manual, Second edition, Sep. 1992, pp. 5-2 - 5-8.
        !            28:  */
        !            29: 
        !            30: /* Note : In all the following tables
        !            31:  *        ""   ... never
        !            32:  *        "???"   ... Invalid combination 
        !            33:  */
        !            34: 
        !            35: /* compare/subtraclt instruction conditions */
        !            36: const condT c_comp_sub[8][2]  = { /* Table 5-3 */
        !            37:        { "", "TR" },
        !            38:        { "=", "<>" },
        !            39:        { "<", ">=" },
        !            40:        { "<=", ">" },
        !            41:        { "<<", ">>=" },
        !            42:        { "<<=", ">>" },
        !            43:        { "SV", "NSV" },
        !            44:        { "OD", "EV" }
        !            45: };
        !            46: 
        !            47: /* add instruction conditions */
        !            48: const condT c_add[8][2]  = { /* Table 5-4 */
        !            49:        { "", "TR" },
        !            50:        { "=", "<>" },
        !            51:        { "<", ">=" },
        !            52:        { "<=", ">" },
        !            53:        { "NUV", "UV"  },
        !            54:        { "ZNV", "VNZ" },
        !            55:        { "SV", "NSV" },
        !            56:        { "OD", "EV" }
        !            57: };
        !            58: 
        !            59: /* logical instruction conditions */
        !            60: const condT c_logical[8][2]  = { /* Table 5-5 */
        !            61:        { "", "TR" },
        !            62:        { "=", "<>" },
        !            63:        { "<", ">=" },
        !            64:        { "<=", ">" },
        !            65:        { "???", "???" },
        !            66:        { "???", "???" },
        !            67:        { "???", "???" },
        !            68:        { "OD", "EV" }
        !            69: };
        !            70: 
        !            71: /* unit instruction conditions */
        !            72: const condT c_unit[8][2]  = { /* Table 5-6 */
        !            73:        { "", "TR" },
        !            74:        { "???", "???" },
        !            75:        { "SBZ", "NBZ" },
        !            76:        { "SHZ", "NHZ" },
        !            77:        { "SDC", "NDC" },
        !            78:        { "???", "???" },
        !            79:        { "SBC", "NBC" },
        !            80:        { "SHC", "NHC" }
        !            81: };
        !            82: 
        !            83: /* shift/extract/deposit instruction conditions */
        !            84: const condT c_shift_extract_deposit[8][2]  = { /* Table 5-7 */
        !            85:        { "", "???" },
        !            86:        { "=", "???" },
        !            87:        { "<", "???" },
        !            88:        { "OD", "???" },
        !            89:        { "TR", "???" },
        !            90:        { "<>", "???" },
        !            91:        { ">=", "???" },
        !            92:        { "EV", "???" }
        !            93: };
        !            94: 
        !            95: 
        !            96: 
        !            97: char *controlregs[] = { "fir", "psr", "epsr", "dirbase", "db", "fsr" };
        !            98: #define NCREGS (sizeof controlregs / sizeof controlregs[0])
        !            99: 
        !           100: char *textlabels[] = { "foo", "bar", "baz", "xork" };
        !           101: #define NTLABELS       (sizeof textlabels / sizeof textlabels[0])
        !           102: 
        !           103: char *datalabels[] = { "data1", "data2", "data3", "data4" };
        !           104: #define NDLABELS       (sizeof datalabels / sizeof datalabels[0])
        !           105: 
        !           106: char *fp_cmp_cond[] =  {
        !           107:        "false?","false", "true?", "true", "!<=>", "!?>=", "!?<=",
        !           108:        "!<>", "!>=", "!?>", "?<=", "!<=", "!?<", "?>=", "!?=",
        !           109:        "!=t", "<=>", "=t", "?=", "?<", "<=", "!>", "?>", ">=",
        !           110:        "!<", "<>", "!=", "!?", "?", "=", "<", ">"
        !           111: };
        !           112: #define NFPCOND        (sizeof fp_cmp_cond / sizeof fp_cmp_cond[0])
        !           113: 
        !           114: char *fp_format_str[] = { "sgl", "dbl", "quad" };
        !           115: #define NFPFMT (sizeof fp_format_str / sizeof fp_format_str[0])
        !           116: 
        !           117: /*
        !           118:  * Traverse the opcode table, dumping out sample instructions.
        !           119:  */
        !           120: void
        !           121: main()
        !           122: {
        !           123:        int i;
        !           124:        const char *arg;
        !           125:        int do_not_nullify = 0;
        !           126:        
        !           127:        printf( "\t.text\n%s:", textlabels[0] );
        !           128:        /* a label at the begining of the file */
        !           129:        printf("label1:\n");
        !           130:        
        !           131:        for ( i = 0; i < NUMOPCODES; ++i )
        !           132:        {
        !           133:                if ( i == (NUMOPCODES/3) )
        !           134:                        printf( "%s:", textlabels[1] );
        !           135:                if ( i == (NUMOPCODES/2) )
        !           136:                        printf( "%s:", textlabels[2] );
        !           137: 
        !           138:                printf( "\t%s", pa_opcodes[i].name );
        !           139:                
        !           140:                for ( arg = pa_opcodes[i].args; *arg != '\0'; ++arg )
        !           141:                {
        !           142:                    switch( *arg ) {
        !           143: 
        !           144:                        case '\0':  /* end of args */
        !           145:                                break;
        !           146: 
        !           147:                        case '(':   /* these must match exactly */
        !           148:                                putchar(' '); /* and FALLTHRU  */
        !           149:                        case ')':
        !           150:                        case ',':
        !           151:                        case ' ':
        !           152:                                putchar(*arg);
        !           153:                                break;
        !           154: 
        !           155:                        case 'b':   /* 5 bit register field at 10 */
        !           156:                        case 'x':   /* 5 bit register field at 15 */
        !           157:                        case 't':   /* 5 bit register field at 31 */
        !           158:                        case 'v':   /* a 't' type extended to handle L/R register halves. */
        !           159:                        case 'E':   /* a 'b' type extended to handle L/R register halves. */
        !           160:                        case 'X':   /* an 'x' type extended to handle L/R register halves. */
        !           161:                        case '4':   /* 5 bit register field at 10 (used in 'fmpyadd' and 'fmpysub') */
        !           162:                        case '6':   /* 5 bit register field at 15 (used in 'fmpyadd' and 'fmpysub') */
        !           163:                        case '7':   /* 5 bit register field at 31 (used in 'fmpyadd' and 'fmpysub') */
        !           164:                        case '8':   /* 5 bit register field at 20 (used in 'fmpyadd' and 'fmpysub') */
        !           165:                        case '9':   /* 5 bit register field at 25 (used in 'fmpyadd' and 'fmpysub') */
        !           166:                                printf(" %%r%d", RANGE(32));
        !           167:                                break;
        !           168: 
        !           169:                        case 'r':   /* 5  bit immediate at 31 */
        !           170:                        case 'R':   /* 5  bit immediate at 15 */
        !           171:                                printf(" %d", RANGE(32));
        !           172:                                break;
        !           173:                        case 'T':   /* 5 bit field length at 31 (encoded as 32-T) */
        !           174:                                printf(" %d", RANGE(31) + 1);
        !           175:                                break;
        !           176: 
        !           177:                        case '5':   /* 5 bit immediate at 15 */
        !           178:                        case 'V':   /* 5  bit immediate at 31 */
        !           179:                        case 'p':   /* 5 bit shift count at 26 (to support SHD instr.) */
        !           180:                                                /* value is encoded in instr. as 31-p where p is   */
        !           181:                                                /* the value scanned here */
        !           182:                        case 'P':   /* 5-bit bit position at 26 */
        !           183:                        case 'Q':   /* 5  bit immediate at 10 (unsigned bit position */
        !           184:                                                /* value for the bb instruction) */
        !           185:                                IMM_NUM(15);
        !           186:                                continue;
        !           187: 
        !           188:                        case 's':   /* 2 bit space identifier at 17 */
        !           189:                                printf(" %d", RANGE(4));
        !           190:                                break;
        !           191: 
        !           192:                        case 'S':   /* 3 bit space identifier at 18 */
        !           193:                                printf(" %%sr%d", RANGE(8));
        !           194:                                break;
        !           195: 
        !           196:                        case 'c':   /* indexed load completer. */
        !           197:                        {
        !           198:                                int m, u, i;
        !           199:                                
        !           200:                                m = COIN;
        !           201:                                u = COIN;
        !           202:                                i = 0;
        !           203:                                if (COIN)
        !           204:                                        while (i < 2) {
        !           205:                                                if (m==1 && u==1) {
        !           206:                                                        printf(",sm");
        !           207:                                                        i++;
        !           208:                                                }
        !           209:                                                else if (m==1) 
        !           210:                                                        printf(",m");
        !           211:                                                        else if (u==1)
        !           212:                                                                printf(",s");
        !           213:                                                                else /* m==0 && u==0 */ {
        !           214:                                                                        printf(",sm");
        !           215:                                                                        i++;
        !           216:                                                                } /* probability distribution */
        !           217:                                                i++;
        !           218:                                        }
        !           219:                                continue;
        !           220:                        }
        !           221:                        case 'C':   /* short load and store completer */
        !           222:                                if (COIN) 
        !           223:                                        if (COIN)
        !           224:                                                printf(",mb");
        !           225:                                        else
        !           226:                                                printf(",ma");
        !           227:                                continue;
        !           228:                        case 'Y':   /* Store Bytes Short completer */
        !           229:                        {
        !           230:                                int i = 0, m, a;
        !           231:                                while ( i < 2 ) {
        !           232:                                        m = COIN;
        !           233:                                        a = COIN;
        !           234:                                
        !           235:                                        if (m==1) /* && (a==0 || a==1) */
        !           236:                                                printf(",m");
        !           237:                                        else if (a==0)  /* && m==0 */
        !           238:                                                printf(",b");
        !           239:                                                else if (a==1) /* && m==0 */
        !           240:                                                        printf(",e");
        !           241:                                        i++;
        !           242:                                }
        !           243:                                continue;
        !           244:                        }
        !           245:                        case '<':   /* non-negated compare/subtract conditions. */
        !           246:                        {
        !           247:                                int cmpltr;
        !           248:                                
        !           249:                                do {
        !           250:                                        cmpltr = RANGE(4);
        !           251:                                } while (cmpltr == 0);
        !           252:                                
        !           253:                                printf(",%s", get_cond_str(c_comp_sub, cmpltr, 0));
        !           254:                        }
        !           255:                                continue;
        !           256:                        case '?':   /* negated or non-negated cmp/sub conditions. */
        !           257:                                        /* used only by ``comb'' and ``comib'' pseudo-ops */
        !           258:                        case '-':   /* compare/subtract conditions */
        !           259:                        {
        !           260:                                int flag, cmpltr;
        !           261:                                char *tmp;
        !           262:                                
        !           263:                                do {
        !           264:                                        flag = COIN;
        !           265:                                        cmpltr = RANGE(8);
        !           266:                                } while ((flag & cmpltr) == 0 || (cmpltr == 0));
        !           267:                                
        !           268:                                tmp = get_cond_str(c_comp_sub, cmpltr, flag);                           
        !           269: 
        !           270:                                if (*tmp != '\0')
        !           271:                                        printf(",%s", tmp);
        !           272:                        }
        !           273:                                continue;
        !           274:                        case '+':   /* non-negated add conditions */
        !           275:                        case '!':   /* negated or non-negated add conditions. */
        !           276:                        {
        !           277:                                int flag, cmpltr;
        !           278:                                char *tmp;
        !           279:                                
        !           280:                                do {
        !           281:                                        flag = COIN;
        !           282:                                        cmpltr = RANGE(8);
        !           283:                                } while ((flag & cmpltr) == 0 || (cmpltr == 0));
        !           284:                                
        !           285:                                tmp = get_cond_str(c_add, cmpltr, flag);
        !           286:                                
        !           287:                                if (COIN && (*tmp != '\0')) /* condition */ {
        !           288:                                                printf(",%s", tmp);
        !           289:                                                if (COIN) { /* nullify */
        !           290:                                                        printf(",n ");
        !           291:                                                        do_not_nullify = 1;
        !           292:                                                }
        !           293:                                }
        !           294:                        }
        !           295:                                continue;               
        !           296:                        case '&':   /* logical instruction conditions */
        !           297:                        {
        !           298:                                int flag, cmpltr;
        !           299:                                char *tmp;
        !           300:                                
        !           301:                                flag = COIN;
        !           302:                                do {
        !           303:                                        cmpltr = RANGE(8);
        !           304:                                } while (cmpltr == 4 || cmpltr == 5 || cmpltr == 6);
        !           305:                                
        !           306:                                tmp = get_cond_str(c_logical, cmpltr, flag);                            
        !           307: 
        !           308:                                if (COIN && (*tmp != '\0')) /* condition */
        !           309:                                        printf(",%s", tmp);
        !           310:                        }
        !           311:                                continue;
        !           312:                        case 'U':   /* unit instruction conditions */
        !           313:                        {
        !           314:                                int flag, cmpltr;
        !           315:                                char *tmp;
        !           316: 
        !           317:                                flag = COIN;
        !           318:                                do {
        !           319:                                        cmpltr = RANGE(8);
        !           320:                                } while (cmpltr == 1 || cmpltr == 5);
        !           321:                                
        !           322:                                tmp = get_cond_str(c_unit, cmpltr, flag);                               
        !           323:                                if (COIN && (*tmp != '\0')) /* condition */
        !           324:                                        printf(",%s", tmp);
        !           325:                        }
        !           326:                                continue;
        !           327:                        case '>':   /* shift/extract/deposit conditions. */
        !           328:                        {
        !           329:                                int  cmpltr;
        !           330:                                char *tmp;
        !           331:                                
        !           332:                                cmpltr = RANGE(8);
        !           333:                                
        !           334:                                tmp = get_cond_str(c_shift_extract_deposit, cmpltr, 0);                         
        !           335: 
        !           336:                                if (COIN && (*tmp != '\0')) /* condition */
        !           337:                                        printf(",%s", tmp);
        !           338:                        }
        !           339:                                continue;
        !           340:                        case '~':   /* bvb,bb conditions */
        !           341:                                if (COIN)
        !           342:                                        printf(",<");
        !           343:                                else
        !           344:                                        printf(",>=");
        !           345:                                continue;
        !           346:                                
        !           347:                        case 'i':   /* 11 bit immediate at 31 */
        !           348:                                IMM_NUM(1024);
        !           349:                                continue;
        !           350:                                
        !           351:                        case 'j':   /* 14 bit immediate at 31 --- LO14 */
        !           352:                        case 'a':       /* for be, ble --- BR17*/
        !           353:                        {
        !           354:                                int field_selector = RANGE(3);
        !           355:                                switch (field_selector) {
        !           356:                                case 2: /* field selector R`*/
        !           357:                                        printf(" R`");
        !           358:                                        break;
        !           359:                                case 1: /* field selector L`*/
        !           360:                                        printf(" L`");
        !           361:                                        break;
        !           362:                                default:
        !           363:                                        break;
        !           364:                                }
        !           365:                                IMM_NUM(8192);
        !           366:                                continue;
        !           367:                        }  
        !           368:                        case 'k':   /* 21 bit immediate at 31 --- HI21 */
        !           369:                        {
        !           370:                                int field_selector = RANGE(3);
        !           371:                                switch (field_selector) {
        !           372:                                case 2: /* field selector R`*/
        !           373:                                        printf(" R`");
        !           374:                                        break;
        !           375:                                case 1: /* field selector L`*/
        !           376:                                        printf(" L`");
        !           377:                                        break;
        !           378:                                default:
        !           379:                                        break;
        !           380:                                }
        !           381:                                IMM_NUM(1048576);
        !           382:                                continue;
        !           383:                        }                       
        !           384:                        case 'n':   /* nullification for branch instructions */
        !           385:                                if (!do_not_nullify)
        !           386:                                        if (COIN)
        !           387:                                                printf(",n");
        !           388:                                else
        !           389:                                        do_not_nullify = 0;
        !           390:                                continue;               
        !           391:                        case 'w':   /* 12 bit branch displacement */
        !           392:                                IMM_NUM(2048);
        !           393:                                continue;
        !           394:                        case 'W':   /* 17 bit branch displacement --- BL17 */
        !           395:                        case '@':   /* 17 bit branch displacement --- JBSR */
        !           396:                        case 'z':   /* 17 bit branch displacement (non-pc-relative) */
        !           397:                                IMM_NUM(65536);
        !           398:                                continue;
        !           399:                        case 'B':   /* either "s,b" or "b" where b & s are defined above */
        !           400:                                if (COIN)
        !           401:                                        printf(" %d,", RANGE(4));
        !           402:                                printf(" %%r%d", RANGE(32));
        !           403:                                break;
        !           404:                        case 'A':   /* 13 bit immediate at 18 (to support BREAK instr.) */
        !           405:                                printf(" %d", RANGE(4096));
        !           406:                                continue;
        !           407:                        case 'Z':   /* System Control Completer(for LDA, LHA, etc.) */
        !           408:                                if (COIN)
        !           409:                                        printf(",M");
        !           410:                                continue;
        !           411:                        case 'D':   /* 26 bit immediate at 31 (to support DIAG instr.) */
        !           412:                                                /* the action (and interpretation of this operand is
        !           413:                                                        implementation dependent) */
        !           414:                                IMM_NUM(33554432);
        !           415:                                continue;
        !           416:                        case 'f':   /* 3 bit Special Function Unit (SFU) identifier at 25 */
        !           417:                        case 'u':   /* 3 bit coprocessor unit identifier at 25 */
        !           418:                                printf("%d", RANGE(8));
        !           419:                                continue;
        !           420:                        case 'O':   /* 20 bit SFU op. split between 15 bits at 20 and 5 bits at 31 */
        !           421:                                printf("%d", RANGE(1048576));
        !           422:                                continue;
        !           423:                        case 'o':   /* 15 bit Special Function Unit operation at 20 */
        !           424:                        case '1':   /* 15 bit SFU op. split between 10 bits at 20
        !           425:                                                        and 5 bits at 31 */
        !           426:                                printf("%d", RANGE(32768));
        !           427:                                continue;
        !           428:                        case '2':   /* 22 bit SFU op. split between 17 bits at 20
        !           429:                                                        and 5 bits at 31 */
        !           430:                                printf("%d", RANGE(4194304));
        !           431:                                continue;
        !           432:                        case '0':   /* 10 bit SFU op. split between 5 bits at 20
        !           433:                                                        and 5 bits at 31 */
        !           434:                                printf("%d", RANGE(1024));
        !           435:                                continue;
        !           436:                        case 'G':   /* Destination FP Operand Format Completer (2 bits at 18) */
        !           437:                        case 'F':   /* Source FP Operand Format Completer (2 bits at 20) */
        !           438:                                printf(",%s", fp_format_str[RANGE(NFPFMT)]);
        !           439:                                continue;
        !           440:                        case 'M':   /* FP Compare Conditions (encoded as 5 bits at 31) */
        !           441:                                printf(",%s", fp_cmp_cond[RANGE(NFPCOND)]);
        !           442:                                continue;
        !           443: 
        !           444: #if 0
        !           445:                        case 'H':  /* Floating Point Operand Format at 26 for       */
        !           446:                                                /* 'fmpyadd' and 'fmpysub' (very similar to 'F') */
        !           447:                                                /* bits are switched from other FP Operand       */
        !           448:                                                /* formats. 1=SGL, 1=<none>, 0=DBL               */
        !           449:                                f = pa_parse_fp_format(&s);
        !           450:                                switch (f) {
        !           451:                                case SGL:
        !           452:                                        opcode |= 0x20;
        !           453:                                case DBL:
        !           454:                                        the_insn.fpof1 = f;
        !           455:                                        continue;
        !           456: 
        !           457:                                case QUAD:
        !           458:                                case ILLEGAL_FMT:
        !           459:                                default:
        !           460:                                        as_bad("Illegal Floating Point Operand Format for"
        !           461:                                                "this instruction: '%s'",*s);
        !           462:                                }
        !           463:                                break;
        !           464:                        default:
        !           465:                                abort();
        !           466: #endif    /* 0 */
        !           467: 
        !           468:                        }
        !           469:                }
        !           470:                putchar( '\n' );
        !           471:        }
        !           472:        /* a label at the end of the file */
        !           473:        printf("label2:\n");
        !           474:        
        !           475: 
        !           476:        printf( "%s:\n", textlabels[3] );
        !           477:        printf( "\t.data\n" );
        !           478:        printf( "data1: .space 1024\n" );
        !           479:        printf( "data2: .space 1024\n" );
        !           480:        printf( "data3: .space 1024\n" );
        !           481:        printf( "data4: .space 1024\n" );
        !           482: 
        !           483: }
        !           484: 
        !           485: /* The function to search the condition decode table 
        !           486:  * and return the 'cond'
        !           487:  * The way tables are initialised ... NULL termination 
        !           488:  * of 'cond' is assured.
        !           489:  */ 
        !           490: char *get_cond_str(const condT table[8][2], int c, int f )
        !           491: {
        !           492: 
        !           493: /* do range check and return NULL if out of bound */
        !           494: /*     char *str;
        !           495:        if ( c < 0  || c > 7 )
        !           496:                *str = (char *) NULL;
        !           497:        else    if ( f < 0  || f > 1 )
        !           498:                *str = (char *) NULL;
        !           499:        else 
        !           500:                str = table[c][f].condition;
        !           501: 
        !           502:        return str;
        !           503: */
        !           504: 
        !           505: /* here goes the one liner */
        !           506: 
        !           507:        return (c<0 || c>7 || f<0 || f>1)
        !           508:                ? (char *)NULL : table[c][f].condition  ;
        !           509: }    /* end get_cond_str() */
        !           510: 

unix.superglobalmegacorp.com

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