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