2 Generates contents of opcode switch from ip_spec.t,
3 and parameter descriptions of em_flag.h.
6 mkiswitch prefix ip_spec.t cases
10 /* $Id: mkiswitch.c,v 1.4 1994/06/24 10:50:02 ceriel Exp $ */
20 extern char em_mnem[][4] ;
21 extern char em_flag[] ;
25 FILE *ifp; /* Input File Pointer */
26 FILE *ofp; /* Output File Pointer */
27 char *Prefix; /* Prefix for function name */
33 char mnem[8]; /* Mnemonic */
34 char flgs[8]; /* Flags */
35 char argstr[256]; /* To build argument */
40 fatal("usage is: %s prefix ip_spec.t cases\n",
46 if ((ifp = fopen(argv[2], "r")) == 0) {
47 fatal("cannot open '%s' for reading\n", argv[2]);
50 if ((ofp = fopen(argv[3], "w")) == 0) {
51 fatal("cannot open '%s' for writing\n", argv[3]);
54 /* Start reading the input file */
55 while (fscanf(ifp, "%s %s", mnem, flgs) >= 0) {
63 for (p = flgs; *p; p++) {
64 if (!in("-ms2u4eNPwo", *p)) {
65 fatal("bad flags ip_spec: %s\n", flgs);
77 fatal("duplicate or missing opcode flag ip_spec: %s\n",
85 fatal("duplicate restriction flags ip_spec: %s\n", flgs);
88 mnemcode = getmnem(mnem);
91 /* capitalize mnemonic */
92 for (p = mnem; *p; p++) {
96 /* scan rest of line */
102 fscanf(ifp, " %d \n", &first);
105 fscanf(ifp, " %d %d \n", &cnt, &first);
109 if (in(flgs, 'e')) /* Escaped (secondary) opcode */
112 if (in(flgs, '4')) /* Escaped (tertiary) opcode */
117 /* analyse the opcode */
119 if ((em_flag[mnemcode] & EM_PAR) == PAR_W) {
120 /* Implicit argument on stack */
122 OutCase(mnem, base, first, 0, argstr);
126 OutCase(mnem, base, first, 0, argstr);
128 } else if (in(flgs, 'm')) { /* Mini */
129 for (i = 0; i<cnt; i++) {
130 Mini(argstr, i, flgs);
131 OutCase(mnem, base, first, i, argstr);
133 } else if (in(flgs, 's')) { /* Shortie */
134 for (i = 0; i<cnt; i++) {
135 Shortie(argstr, i, flgs);
136 OutCase(mnem, base, first, i, argstr);
138 } else if (in(flgs, '2')) { /* Two byte signed */
139 TwoSgn(argstr, flgs);
140 OutCase(mnem, base, first, 0, argstr);
141 } else if (in(flgs, 'u')) { /* Two byte unsigned */
142 TwoUns(argstr, flgs);
143 OutCase(mnem, base, first, 0, argstr);
144 } else if (in(flgs, '4')) { /* Four byte signed */
145 FourSgn(argstr, flgs);
146 OutCase(mnem, base, first, 0, argstr);
148 fatal("no opcode flag in ip_spec %s\n", flgs);
155 OutCase(mnem, base, first, i, argstr)
162 /* Output a case in the switch statement */
163 fprintf(ofp, "\t\tcase %s+%d:\t%s%s(%s); break;\n",
164 base, first+i, Prefix, mnem, argstr);
173 sprintf(argstr, "uwpop()");
182 Mini(argstr, i, flgs)
187 int newi = in(flgs, 'N') ? (-i-1) : in(flgs, 'o') ? (i+1) : i;
191 sprintf(argstr, "%s",
192 in(flgs, 'w') ? "-wsize" : "-1L");
195 sprintf(argstr, "0L");
198 sprintf(argstr, "%s",
199 in(flgs, 'w') ? "wsize" : "1L");
202 sprintf(argstr, "%dL%s",
203 newi, in(flgs, 'w') ? "*wsize" : "");
208 Shortie(argstr, i, flgs)
213 int newi = in(flgs, 'N') ? (-i-1) : in(flgs, 'o') ? (i+1) : i;
215 sprintf(argstr, "S_arg(%d)*%s",
216 newi, in(flgs, 'w') ? "wsize" : "1L");
224 sprintf(argstr, "%s*%s", in(flgs, 'P') ? "P_arg_2()" : in(flgs, 'N') ? "N_arg_2()" : "L_arg_2()",
225 in(flgs, 'w') ? "wsize" : "1L");
233 sprintf(argstr, "%s*%s", "U_arg()",
234 in(flgs, 'w') ? "wsize" : "((unsigned long) 1)");
237 FourSgn(argstr, flgs)
242 sprintf(argstr, "%s*%s", in(flgs, 'P') ? "P_arg_4()" : in(flgs, 'N') ? "N_arg_4()" : "L_arg_4()",
243 in(flgs, 'w') ? "wsize" : "1L");
261 fprintf(stderr, "%s, (fatal error): ", progname);
262 fprintf(stderr, fmt, str);
263 fprintf(stderr, "\n");
266 int getmnem(str) char *str ; {
269 for ( ptr = em_mnem ; *ptr<= &em_mnem[sp_lmnem][0] ; ptr++ ) {
270 if ( strcmp(*ptr,str)==0 ) return (ptr-em_mnem) ;
272 fatal("Illegal mnemonic") ;