home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Source / GNU / cctools / as / i860-check.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-01-31  |  3.8 KB  |  133 lines

  1. #include "i860-opcode.h"
  2. #include <stdio.h>
  3.  
  4. extern long random();
  5.  
  6. char *controlregs[] = { "fir", "psr", "epsr", "dirbase", "db", "fsr" };
  7. #define NCREGS    (sizeof controlregs / sizeof controlregs[0])
  8.  
  9. char *textlabels[] = { "foo", "bar", "baz", "xork" };
  10. #define NTLABELS    (sizeof textlabels / sizeof textlabels[0])
  11.  
  12. char *datalabels[] = { "data1", "data2", "data3", "data4" };
  13. #define NDLABELS    (sizeof datalabels / sizeof datalabels[0])
  14.  
  15. /*
  16.  * Traverse the opcode table, dumping out sample instructions.
  17.  */
  18. main()
  19. {
  20.     int i;
  21.     const char *arg;
  22.     int r1, r2, rd;
  23.     
  24.     printf( "\t.text\n%s:", textlabels[0] );
  25.     for ( i = 0; i < NUMOPCODES; ++i )
  26.     {
  27.         if ( i == (NUMOPCODES/3) )
  28.             printf( "%s:", textlabels[1] );
  29.         if ( i == (NUMOPCODES/2) )
  30.             printf( "%s:", textlabels[2] );
  31.  
  32.         if ( (random() & 0x30) == 0 &&
  33.              (i860_opcodes[i].match & OP_PREFIX_MASK) == PREFIX_FPU )
  34.         {
  35.             printf( "\td.%s\t", i860_opcodes[i].name );
  36.         }
  37.         else
  38.             printf( "\t%s\t", i860_opcodes[i].name );
  39.         r1 = random() & 0x1F;
  40.         do
  41.             r2 = random() & 0x1F;
  42.         while( (r2 & 0x1E) == (r1 & 0x1E) );
  43.         do
  44.             rd = random() & 0x1F;
  45.         while( (rd & 0x1E) == (r1 & 0x1E) || (rd & 0x1E) == (r2 & 0x1E) );
  46.         
  47.         for ( arg = i860_opcodes[i].args; *arg != '\0'; ++arg )
  48.         {
  49.             switch( *arg )
  50.             {
  51.             case '1': /*    rs1 register, bits 11-15 of insn. */
  52.                case '2': /*    rs2 register, bits 21-25 of insn. */
  53.                case 'd': /*    rd register, bits 16-20 of insn.  */
  54.                 printf( "r%d", random() % 32);
  55.                 break;
  56.                 
  57.                case 'e': /*    frs1 floating point register, bits 11-15 of insn*/
  58.                 printf( "f%d", r1 );
  59.                 break;
  60.                   
  61.                case 'f': /*    frs2 floating point register, bits 21-25 of insn*/
  62.                 printf( "f%d", r2 );
  63.                 break;
  64.                   
  65.                case 'g': /*    frsd floating point register, bits 16-20 of insn*/ 
  66.                 printf( "f%d", rd );
  67.                 break;
  68.                 
  69.                case 'E': /*    frs1 floating point register, bits 11-15 of insn*/
  70.                 printf( "f%d", r1 & 0x1E );
  71.                 break;
  72.                   
  73.                case 'F': /*    frs2 floating point register, bits 21-25 of insn*/
  74.                 printf( "f%d", r2 & 0x1E );
  75.                 break;
  76.                   
  77.                case 'G': /*    frsd floating point register, bits 16-20 of insn*/ 
  78.                 printf( "f%d", rd & 0x1E );
  79.                 break;
  80.                   
  81.                case 'H': /*    frsd floating point register, bits 16-20 of insn*/ 
  82.                 printf( "f%d", rd & 0x1C );
  83.                 break;
  84.  
  85.             case 'I': /*    16 bit High portion of address, RELOC_HIGH. */
  86.                 printf( "h%%%s", datalabels[random() % NDLABELS] );
  87.                 break;
  88.                 
  89.             case 'i': /*    16 bit byte address low half, */
  90.                case 'j': /*    16 bit short address, RELOC_LOW1 */
  91.                case 'k': /*    16 bit word/int    address low half, RELOC_LOW2 */
  92.                case 'l': /*    16 bit 8-byte address (double) low half */
  93.                case 'm': /*    16 bit 16-byte address (quad) low half */
  94.                case 'n': /*    16 bit byte aligned low half, split fields */
  95.                case 'o': /*    16 bit short aligned low half, split fields */
  96.                case 'p': /*    16 bit int/word aligned low half, split fields */
  97.                 printf( "l%%%s", datalabels[random() % NDLABELS] );
  98.                 break;
  99.  
  100.                case 'J': /*    16 bit High portion of addr requiring adjustment*/
  101.                 printf( "ha%%%s", datalabels[random() % NDLABELS] );
  102.                 break;
  103.                             
  104.             case 'K': /*    26 bit branch displacement */
  105.                case 'L': /*    16 bit split branch displacement */
  106.                 printf( textlabels[random() % NTLABELS] );
  107.                 break;
  108.             
  109.             case 'D': /* constant for shift opcode */    
  110.                case 'B': /*    5 bit immediate, for bte and btne insn */
  111.                 printf( "%d", random() % 32 );
  112.                 break;
  113.                 
  114.                case 'C': /*    Control Register */
  115.                 printf( controlregs[random() % NCREGS] );
  116.                 break;
  117.                 
  118.             default:
  119.                 putchar( *arg );
  120.                 break;
  121.             }
  122.         }
  123.         putchar( '\n' );
  124.     }
  125.     printf( "%s:\n", textlabels[3] );
  126.     printf( "\t.data\n" );
  127.     printf( "data1:    .blkb 1024\n" );
  128.     printf( "data2:    .blkb 1024\n" );
  129.     printf( "data3:    .blkb 1024\n" );
  130.     printf( "data4:    .blkb 1024\n" );
  131.  
  132. }
  133.