home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include "sparc-opcode.h"
-
- static void print_rs_reg(char);
- static void print_cp_reg(void);
- static void print_f_reg(int);
- static void print_imm_13(void);
- static void print_imm_22(void);
- static void print_asi(void);
-
-
- static char *reg_names[] =
- { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
- "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
- "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
- "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
- "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
- "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
- "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
- "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
- "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
- };
-
- void
- main(
- int argc,
- char *argv[],
- char *envp[])
- {
- long i;
- const char *arg;
-
- /* output each instruction */
-
- for(i = 0; i < NUMOPCODES - 1; i++){
- printf("\t%s", sparc_opcodes[i].name);
- arg = sparc_opcodes[i].args;
-
- if (*arg != ',' && *(arg+1) != 'a') /* handle annul case */
- printf("\t");
-
- /* and every possible combination */
- for (arg = sparc_opcodes[i].args; *arg != '\0'; arg++) {
- switch (*arg) {
- case '\0':
- break; /* done */
- case '1':
- case '2':
- case 'r':
- case 'd':
- print_rs_reg(*arg); /* output in a random register */
- break;
- case 'i':
- print_imm_13(); /* output a random immediate value */
- break;
- case 'n':
- print_imm_22(); /* output a random immediate value */
- break;
- case 'L':
- case 'l':
- printf("undef");
- break;
- case 'D':
- print_cp_reg();
- break;
- case 'F':
- printf("%%fsr");
- break;
- case 'p':
- printf("%%psr");
- break;
- case 'C':
- printf("%%csr");
- break;
- case 'A':
- print_asi();
- break;
- case 'q':
- printf("%%fq");
- break;
- case 'Q':
- printf("%%cq");
- break;
- case 'y':
- printf("%%y");
- break;
- case 'w':
- printf("%%wim");
- break;
- case 't':
- printf("%%tbr");
- break;
- case 'h':
- printf("%%hi(0xaaaaa)");
- break;
- case 'e':
- case 'f':
- case 'g':
- print_f_reg(0);
- break;
- case 'v':
- case 'B':
- case 'H':
- print_f_reg(1);
- break;
- case 'R':
- case 'V':
- case 'J':
- print_f_reg(3);
- break;
- case 'm':
- case 'M':
- printf("%%asr16");
- break;
- case 'S':
- /* special case set insn */
- break;
- case '+':
- putchar('+');
- break;
- case ']':
- case '[':
- case ',':
- case ' ':
- putchar(*arg);
- break;
- case '#':
- printf("0");
- break;
- case 'a':
- printf("a\t");
- break;
- default:
- printf("*** what's this garbage %c 0x%x?\n", *arg, (int) *arg);
- }
- }
- printf("\n");
- }
- printf("\n");
- exit(0);
- }
-
-
- #define MAX_RS_REG 32
-
- static
- void
- print_rs_reg(char type)
- {
- static int i=0;
-
- printf("%%%s", reg_names[i++]);
- if (i >= MAX_RS_REG)
- i = 0;
- }
-
- #define MAX_FP_REG 64
-
- static
- void
- print_f_reg(int align)
- {
- static int i=32;
-
- printf("%%%s", reg_names[(i++) & ~align]);
- if (i >= MAX_FP_REG)
- i = 32;
- }
-
- static
- void
- print_imm_13(void)
- {
- static int val = 0;
-
- val = (val+4) & 0x3ff;
- printf("0x%x", val);
- }
-
- static
- void
- print_imm_22(void)
- {
- static int val = 0;
-
- val = (val + 4) & 0x3fffff;
- printf("0x%x", val);
- }
-
-
- #define MAX_ASI 255
-
- static
- void print_asi(void)
- {
- static int i=0;
-
- printf("(%d)", i++);
- if (i >= MAX_ASI)
- i = 0;
- }
-
- #define MAX_CP_REG 32
-
- static
- void print_cp_reg(void)
- {
- static int i=0;
-
- printf("%%c%d", i++);
- if (i >= MAX_CP_REG)
- i = 0;
- }
-