1#include <stdio.h> 2#include "sparc-opcode.h" 3 4static void print_rs_reg(char); 5static void print_cp_reg(void); 6static void print_f_reg(int); 7static void print_imm_13(void); 8static void print_imm_22(void); 9static void print_asi(void); 10 11 12static char *reg_names[] = 13{ "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7", 14 "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7", 15 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", 16 "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7", 17 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", 18 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", 19 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", 20 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", 21 "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr" 22}; 23 24void 25main( 26 int argc, 27 char *argv[], 28 char *envp[]) 29{ 30 int32_t i; 31 const char *arg; 32 33 /* output each instruction */ 34 35 for(i = 0; i < NUMOPCODES - 1; i++){ 36 printf("\t%s", sparc_opcodes[i].name); 37 arg = sparc_opcodes[i].args; 38 39 if (*arg != ',' && *(arg+1) != 'a') /* handle annul case */ 40 printf("\t"); 41 42 /* and every possible combination */ 43 for (arg = sparc_opcodes[i].args; *arg != '\0'; arg++) { 44 switch (*arg) { 45 case '\0': 46 break; /* done */ 47 case '1': 48 case '2': 49 case 'r': 50 case 'd': 51 print_rs_reg(*arg); /* output in a random register */ 52 break; 53 case 'i': 54 print_imm_13(); /* output a random immediate value */ 55 break; 56 case 'n': 57 print_imm_22(); /* output a random immediate value */ 58 break; 59 case 'L': 60 case 'l': 61 printf("undef"); 62 break; 63 case 'D': 64 print_cp_reg(); 65 break; 66 case 'F': 67 printf("%%fsr"); 68 break; 69 case 'p': 70 printf("%%psr"); 71 break; 72 case 'C': 73 printf("%%csr"); 74 break; 75 case 'A': 76 print_asi(); 77 break; 78 case 'q': 79 printf("%%fq"); 80 break; 81 case 'Q': 82 printf("%%cq"); 83 break; 84 case 'y': 85 printf("%%y"); 86 break; 87 case 'w': 88 printf("%%wim"); 89 break; 90 case 't': 91 printf("%%tbr"); 92 break; 93 case 'h': 94 printf("%%hi(0xaaaaa)"); 95 break; 96 case 'e': 97 case 'f': 98 case 'g': 99 print_f_reg(0); 100 break; 101 case 'v': 102 case 'B': 103 case 'H': 104 print_f_reg(1); 105 break; 106 case 'R': 107 case 'V': 108 case 'J': 109 print_f_reg(3); 110 break; 111 case 'm': 112 case 'M': 113 printf("%%asr16"); 114 break; 115 case 'S': 116 /* special case set insn */ 117 break; 118 case '+': 119 putchar('+'); 120 break; 121 case ']': 122 case '[': 123 case ',': 124 case ' ': 125 putchar(*arg); 126 break; 127 case '#': 128 printf("0"); 129 break; 130 case 'a': 131 printf("a\t"); 132 break; 133 default: 134 printf("*** what's this garbage %c 0x%x?\n", *arg, (int) *arg); 135 } 136 } 137 printf("\n"); 138 } 139 printf("\n"); 140exit(0); 141} 142 143 144#define MAX_RS_REG 32 145 146static 147void 148print_rs_reg(char type) 149{ 150 static int i=0; 151 152 printf("%%%s", reg_names[i++]); 153 if (i >= MAX_RS_REG) 154 i = 0; 155} 156 157#define MAX_FP_REG 64 158 159static 160void 161print_f_reg(int align) 162{ 163 static int i=32; 164 165 printf("%%%s", reg_names[(i++) & ~align]); 166 if (i >= MAX_FP_REG) 167 i = 32; 168} 169 170static 171void 172print_imm_13(void) 173{ 174 static int val = 0; 175 176 val = (val+4) & 0x3ff; 177 printf("0x%x", val); 178} 179 180static 181void 182print_imm_22(void) 183{ 184 static int val = 0; 185 186 val = (val + 4) & 0x3fffff; 187 printf("0x%x", val); 188} 189 190 191#define MAX_ASI 255 192 193static 194void print_asi(void) 195{ 196 static int i=0; 197 198 printf("(%d)", i++); 199 if (i >= MAX_ASI) 200 i = 0; 201} 202 203#define MAX_CP_REG 32 204 205static 206void print_cp_reg(void) 207{ 208 static int i=0; 209 210 printf("%%c%d", i++); 211 if (i >= MAX_CP_REG) 212 i = 0; 213} 214