mkiswitch.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /*
  2. Generates contents of opcode switch from ip_spec.t,
  3. and parameter descriptions of em_flag.h.
  4. Call is:
  5. mkiswitch prefix ip_spec.t cases
  6. */
  7. /* $Id$ */
  8. #include <stdio.h>
  9. extern FILE *popen();
  10. #include <ip_spec.h>
  11. #include <em_spec.h>
  12. #include <em_flag.h>
  13. extern char em_mnem[][4] ;
  14. extern char em_flag[] ;
  15. char *progname;
  16. FILE *ifp; /* Input File Pointer */
  17. FILE *ofp; /* Output File Pointer */
  18. char *Prefix; /* Prefix for function name */
  19. main(argc, argv)
  20. int argc;
  21. char **argv;
  22. {
  23. char mnem[8]; /* Mnemonic */
  24. char flgs[8]; /* Flags */
  25. char argstr[256]; /* To build argument */
  26. progname = argv[0];
  27. if (argc != 4 ) {
  28. fatal("usage is: %s prefix ip_spec.t cases\n",
  29. argv[0]);
  30. }
  31. Prefix = argv[1];
  32. if ((ifp = fopen(argv[2], "r")) == 0) {
  33. fatal("cannot open '%s' for reading\n", argv[2]);
  34. }
  35. if ((ofp = fopen(argv[3], "w")) == 0) {
  36. fatal("cannot open '%s' for writing\n", argv[3]);
  37. }
  38. /* Start reading the input file */
  39. while (fscanf(ifp, "%s %s", mnem, flgs) >= 0) {
  40. int i;
  41. char *p;
  42. char *base;
  43. int cnt, first;
  44. int mnemcode;
  45. /* check flags */
  46. for (p = flgs; *p; p++) {
  47. if (!in("-ms2u4eNPwo", *p)) {
  48. fatal("bad flags ip_spec: %s\n", flgs);
  49. }
  50. }
  51. if ( in(flgs, '-')
  52. + in(flgs, 'm')
  53. + in(flgs, 's')
  54. + in(flgs, '2')
  55. + in(flgs, 'u')
  56. + in(flgs, '4')
  57. != 1
  58. ) {
  59. fatal("duplicate or missing opcode flag ip_spec: %s\n",
  60. flgs);
  61. }
  62. if ( in(flgs, 'N')
  63. + in(flgs, 'P')
  64. > 1
  65. ) {
  66. fatal("duplicate restriction flags ip_spec: %s\n", flgs);
  67. }
  68. mnemcode = getmnem(mnem);
  69. /* capitalize mnemonic */
  70. for (p = mnem; *p; p++) {
  71. *p += ('A' - 'a');
  72. }
  73. /* scan rest of line */
  74. if ( in(flgs, '-')
  75. || in(flgs, '2')
  76. || in(flgs, 'u')
  77. || in(flgs, '4')
  78. ) {
  79. fscanf(ifp, " %d \n", &first);
  80. }
  81. else {
  82. fscanf(ifp, " %d %d \n", &cnt, &first);
  83. }
  84. /* determine base */
  85. if (in(flgs, 'e')) /* Escaped (secondary) opcode */
  86. base = "SEC_BASE";
  87. else
  88. if (in(flgs, '4')) /* Escaped (tertiary) opcode */
  89. base = "TERT_BASE";
  90. else
  91. base = "PRIM_BASE";
  92. /* analyse the opcode */
  93. if (in(flgs, '-')) {
  94. if ((em_flag[mnemcode] & EM_PAR) == PAR_W) {
  95. /* Implicit argument on stack */
  96. ImplicitArg(argstr);
  97. OutCase(mnem, base, first, 0, argstr);
  98. } else {
  99. /* No arguments */
  100. NoArgs(argstr);
  101. OutCase(mnem, base, first, 0, argstr);
  102. }
  103. } else if (in(flgs, 'm')) { /* Mini */
  104. for (i = 0; i<cnt; i++) {
  105. Mini(argstr, i, flgs);
  106. OutCase(mnem, base, first, i, argstr);
  107. }
  108. } else if (in(flgs, 's')) { /* Shortie */
  109. for (i = 0; i<cnt; i++) {
  110. Shortie(argstr, i, flgs);
  111. OutCase(mnem, base, first, i, argstr);
  112. }
  113. } else if (in(flgs, '2')) { /* Two byte signed */
  114. TwoSgn(argstr, flgs);
  115. OutCase(mnem, base, first, 0, argstr);
  116. } else if (in(flgs, 'u')) { /* Two byte unsigned */
  117. TwoUns(argstr, flgs);
  118. OutCase(mnem, base, first, 0, argstr);
  119. } else if (in(flgs, '4')) { /* Four byte signed */
  120. FourSgn(argstr, flgs);
  121. OutCase(mnem, base, first, 0, argstr);
  122. } else {
  123. fatal("no opcode flag in ip_spec %s\n", flgs);
  124. }
  125. }
  126. exit(0);
  127. }
  128. OutCase(mnem, base, first, i, argstr)
  129. char *mnem;
  130. char *base;
  131. int first;
  132. int i;
  133. char *argstr;
  134. {
  135. /* Output a case in the switch statement */
  136. fprintf(ofp, "\t\tcase %s+%d:\t%s%s(%s); break;\n",
  137. base, first+i, Prefix, mnem, argstr);
  138. }
  139. ImplicitArg(argstr)
  140. char *argstr;
  141. {
  142. sprintf(argstr, "uwpop()");
  143. }
  144. NoArgs(argstr)
  145. char *argstr;
  146. {
  147. sprintf(argstr, "");
  148. }
  149. Mini(argstr, i, flgs)
  150. char *argstr;
  151. int i;
  152. char *flgs;
  153. {
  154. int newi = in(flgs, 'N') ? (-i-1) : in(flgs, 'o') ? (i+1) : i;
  155. switch (newi) {
  156. case -1:
  157. sprintf(argstr, "%s",
  158. in(flgs, 'w') ? "-wsize" : "-1L");
  159. break;
  160. case 0:
  161. sprintf(argstr, "0L");
  162. break;
  163. case 1:
  164. sprintf(argstr, "%s",
  165. in(flgs, 'w') ? "wsize" : "1L");
  166. break;
  167. default:
  168. sprintf(argstr, "%dL%s",
  169. newi, in(flgs, 'w') ? "*wsize" : "");
  170. break;
  171. }
  172. }
  173. Shortie(argstr, i, flgs)
  174. char *argstr;
  175. int i;
  176. char *flgs;
  177. {
  178. int newi = in(flgs, 'N') ? (-i-1) : in(flgs, 'o') ? (i+1) : i;
  179. sprintf(argstr, "S_arg(%d)*%s",
  180. newi, in(flgs, 'w') ? "wsize" : "1L");
  181. }
  182. TwoSgn(argstr, flgs)
  183. char *argstr;
  184. char *flgs;
  185. {
  186. sprintf(argstr, "%s*%s", in(flgs, 'P') ? "P_arg_2()" : in(flgs, 'N') ? "N_arg_2()" : "L_arg_2()",
  187. in(flgs, 'w') ? "wsize" : "1L");
  188. }
  189. TwoUns(argstr, flgs)
  190. char *argstr;
  191. char *flgs;
  192. {
  193. sprintf(argstr, "%s*%s", "U_arg()",
  194. in(flgs, 'w') ? "wsize" : "((unsigned long) 1)");
  195. }
  196. FourSgn(argstr, flgs)
  197. char *argstr;
  198. char *flgs;
  199. {
  200. sprintf(argstr, "%s*%s", in(flgs, 'P') ? "P_arg_4()" : in(flgs, 'N') ? "N_arg_4()" : "L_arg_4()",
  201. in(flgs, 'w') ? "wsize" : "1L");
  202. }
  203. int
  204. in(flgs, c)
  205. char *flgs;
  206. char c;
  207. {
  208. while (*flgs)
  209. if (c == *flgs++)
  210. return 1;
  211. return 0;
  212. }
  213. fatal(fmt, str)
  214. char *fmt;
  215. char *str;
  216. {
  217. fprintf(stderr, "%s, (fatal error): ", progname);
  218. fprintf(stderr, fmt, str);
  219. fprintf(stderr, "\n");
  220. exit(1);
  221. }
  222. int getmnem(str) char *str ; {
  223. char (*ptr)[4] ;
  224. for ( ptr = em_mnem ; *ptr<= &em_mnem[sp_lmnem][0] ; ptr++ ) {
  225. if ( strcmp(*ptr,str)==0 ) return (ptr-em_mnem) ;
  226. }
  227. fatal("Illegal mnemonic") ;
  228. return 0 ;
  229. }