home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / cctools / as / i860-check.c < prev    next >
C/C++ Source or Header  |  1993-09-09  |  4KB  |  138 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. void
  19. main(
  20. int argc,
  21. char *argv[],
  22. char *envp[])
  23. {
  24.     int i;
  25.     const char *arg;
  26.     int r1, r2, rd;
  27.     
  28.     printf( "\t.text\n%s:", textlabels[0] );
  29.     for ( i = 0; i < NUMOPCODES; ++i )
  30.     {
  31.         if ( i == (NUMOPCODES/3) )
  32.             printf( "%s:", textlabels[1] );
  33.         if ( i == (NUMOPCODES/2) )
  34.             printf( "%s:", textlabels[2] );
  35.  
  36.         if ( (random() & 0x30) == 0 &&
  37.              (i860_opcodes[i].match & OP_PREFIX_MASK) == PREFIX_FPU )
  38.         {
  39.             printf( "\td.%s\t", i860_opcodes[i].name );
  40.         }
  41.         else
  42.             printf( "\t%s\t", i860_opcodes[i].name );
  43.         r1 = random() & 0x1F;
  44.         do
  45.             r2 = random() & 0x1F;
  46.         while( (r2 & 0x1E) == (r1 & 0x1E) );
  47.         do
  48.             rd = random() & 0x1F;
  49.         while( (rd & 0x1E) == (r1 & 0x1E) || (rd & 0x1E) == (r2 & 0x1E) );
  50.         
  51.         for ( arg = i860_opcodes[i].args; *arg != '\0'; ++arg )
  52.         {
  53.             switch( *arg )
  54.             {
  55.             case '1': /*    rs1 register, bits 11-15 of insn. */
  56.                case '2': /*    rs2 register, bits 21-25 of insn. */
  57.                case 'd': /*    rd register, bits 16-20 of insn.  */
  58.                 printf( "r%d", random() % 32);
  59.                 break;
  60.                 
  61.                case 'e': /*    frs1 floating point register, bits 11-15 of insn*/
  62.                 printf( "f%d", r1 );
  63.                 break;
  64.                   
  65.                case 'f': /*    frs2 floating point register, bits 21-25 of insn*/
  66.                 printf( "f%d", r2 );
  67.                 break;
  68.                   
  69.                case 'g': /*    frsd floating point register, bits 16-20 of insn*/ 
  70.                 printf( "f%d", rd );
  71.                 break;
  72.                 
  73.                case 'E': /*    frs1 floating point register, bits 11-15 of insn*/
  74.                 printf( "f%d", r1 & 0x1E );
  75.                 break;
  76.                   
  77.                case 'F': /*    frs2 floating point register, bits 21-25 of insn*/
  78.                 printf( "f%d", r2 & 0x1E );
  79.                 break;
  80.                   
  81.                case 'G': /*    frsd floating point register, bits 16-20 of insn*/ 
  82.                 printf( "f%d", rd & 0x1E );
  83.                 break;
  84.                   
  85.                case 'H': /*    frsd floating point register, bits 16-20 of insn*/ 
  86.                 printf( "f%d", rd & 0x1C );
  87.                 break;
  88.  
  89.             case 'I': /*    16 bit High portion of address, I860_RELOC_HIGH. */
  90.                 printf( "h%%%s", datalabels[random() % NDLABELS] );
  91.                 break;
  92.                 
  93.             case 'i': /*    16 bit byte address low half, */
  94.                case 'j': /*    16 bit short address, I860_RELOC_LOW1 */
  95.                case 'k': /*    16 bit word/int    address low half, I860_RELOC_LOW2 */
  96.                case 'l': /*    16 bit 8-byte address (double) low half */
  97.                case 'm': /*    16 bit 16-byte address (quad) low half */
  98.                case 'n': /*    16 bit byte aligned low half, split fields */
  99.                case 'o': /*    16 bit short aligned low half, split fields */
  100.                case 'p': /*    16 bit int/word aligned low half, split fields */
  101.                 printf( "l%%%s", datalabels[random() % NDLABELS] );
  102.                 break;
  103.  
  104.                case 'J': /*    16 bit High portion of addr requiring adjustment*/
  105.                 printf( "ha%%%s", datalabels[random() % NDLABELS] );
  106.                 break;
  107.                             
  108.             case 'K': /*    26 bit branch displacement */
  109.                case 'L': /*    16 bit split branch displacement */
  110.                 printf( textlabels[random() % NTLABELS] );
  111.                 break;
  112.             
  113.             case 'D': /* constant for shift opcode */    
  114.                case 'B': /*    5 bit immediate, for bte and btne insn */
  115.                 printf( "%d", random() % 32 );
  116.                 break;
  117.                 
  118.                case 'C': /*    Control Register */
  119.                 printf( controlregs[random() % NCREGS] );
  120.                 break;
  121.                 
  122.             default:
  123.                 putchar( *arg );
  124.                 break;
  125.             }
  126.         }
  127.         putchar( '\n' );
  128.     }
  129.     printf( "%s:\n", textlabels[3] );
  130.     printf( "nop\n" );
  131.     printf( "\t.text\n" );
  132.     printf( "data1:    nop\n" );
  133.     printf( "data2:    nop\n" );
  134.     printf( "data3:    nop\n" );
  135.     printf( "data4:    nop\n" );
  136.  
  137. }
  138.