lex.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. #include <ctype.h>
  2. #define EXTERN
  3. #include "a.h"
  4. #include "y.tab.h"
  5. void
  6. main(int argc, char *argv[])
  7. {
  8. char *p;
  9. int nout, nproc, status, i, c;
  10. thechar = '2';
  11. thestring = "68020";
  12. memset(debug, 0, sizeof(debug));
  13. cinit();
  14. outfile = 0;
  15. include[ninclude++] = ".";
  16. ARGBEGIN {
  17. default:
  18. c = ARGC();
  19. if(c >= 0 || c < sizeof(debug))
  20. debug[c] = 1;
  21. break;
  22. case 'o':
  23. outfile = ARGF();
  24. break;
  25. case 'D':
  26. p = ARGF();
  27. if(p)
  28. Dlist[nDlist++] = p;
  29. break;
  30. case 'I':
  31. p = ARGF();
  32. setinclude(p);
  33. break;
  34. } ARGEND
  35. if(*argv == 0) {
  36. print("usage: %ca [-options] file.s\n", thechar);
  37. errorexit();
  38. }
  39. if(argc > 1 && systemtype(Windows)){
  40. print("can't assemble multiple files on windows\n");
  41. errorexit();
  42. }
  43. if(argc > 1 && !systemtype(Windows)) {
  44. nproc = 1;
  45. if(p = getenv("NPROC"))
  46. nproc = atol(p); /* */
  47. c = 0;
  48. nout = 0;
  49. for(;;) {
  50. while(nout < nproc && argc > 0) {
  51. i = myfork();
  52. if(i < 0) {
  53. i = mywait(&status);
  54. if(i < 0)
  55. errorexit();
  56. if(status)
  57. c++;
  58. nout--;
  59. continue;
  60. }
  61. if(i == 0) {
  62. print("%s:\n", *argv);
  63. if(assemble(*argv))
  64. errorexit();
  65. exits(0);
  66. }
  67. nout++;
  68. argc--;
  69. argv++;
  70. }
  71. i = mywait(&status);
  72. if(i < 0) {
  73. if(c)
  74. errorexit();
  75. exits(0);
  76. }
  77. if(status)
  78. c++;
  79. nout--;
  80. }
  81. }
  82. if(assemble(argv[0]))
  83. errorexit();
  84. exits(0);
  85. }
  86. int
  87. assemble(char *file)
  88. {
  89. char ofile[100], incfile[20], *p;
  90. int i, of;
  91. strcpy(ofile, file);
  92. p = utfrrune(ofile, pathchar());
  93. if(p) {
  94. include[0] = ofile;
  95. *p++ = 0;
  96. } else
  97. p = ofile;
  98. if(outfile == 0) {
  99. outfile = p;
  100. if(outfile){
  101. p = utfrrune(outfile, '.');
  102. if(p)
  103. if(p[1] == 's' && p[2] == 0)
  104. p[0] = 0;
  105. p = utfrune(outfile, 0);
  106. p[0] = '.';
  107. p[1] = thechar;
  108. p[2] = 0;
  109. } else
  110. outfile = "/dev/null";
  111. }
  112. p = getenv("INCLUDE");
  113. if(p) {
  114. setinclude(p);
  115. } else {
  116. if(systemtype(Plan9)) {
  117. sprint(incfile,"/%s/include", thestring);
  118. setinclude(strdup(incfile));
  119. }
  120. }
  121. of = mycreat(outfile, 0664);
  122. if(of < 0) {
  123. yyerror("%ca: cannot create %s", thechar, outfile);
  124. errorexit();
  125. }
  126. Binit(&obuf, of, OWRITE);
  127. pass = 1;
  128. pinit(file);
  129. for(i=0; i<nDlist; i++)
  130. dodefine(Dlist[i]);
  131. yyparse();
  132. if(nerrors) {
  133. cclean();
  134. return nerrors;
  135. }
  136. pass = 2;
  137. outhist();
  138. pinit(file);
  139. for(i=0; i<nDlist; i++)
  140. dodefine(Dlist[i]);
  141. yyparse();
  142. cclean();
  143. return nerrors;
  144. }
  145. struct
  146. {
  147. char *name;
  148. ushort type;
  149. ushort value;
  150. } itab[] =
  151. {
  152. "SP", LSP, D_AUTO,
  153. "SB", LSB, D_EXTERN,
  154. "FP", LFP, D_PARAM,
  155. "PC", LPC, D_BRANCH,
  156. "TOS", LTOS, D_TOS,
  157. "CCR", LTOS, D_CCR,
  158. "SR", LTOS, D_SR,
  159. "SFC", LTOS, D_SFC,
  160. "DFC", LTOS, D_DFC,
  161. "CACR", LTOS, D_CACR,
  162. "USP", LTOS, D_USP,
  163. "VBR", LTOS, D_VBR,
  164. "CAAR", LTOS, D_CAAR,
  165. "MSP", LTOS, D_MSP,
  166. "ISP", LTOS, D_ISP,
  167. "FPCR", LTOS, D_FPCR,
  168. "FPSR", LTOS, D_FPSR,
  169. "FPIAR", LTOS, D_FPIAR,
  170. "TC", LTOS, D_TC,
  171. "ITT0", LTOS, D_ITT0,
  172. "ITT1", LTOS, D_ITT1,
  173. "DTT0", LTOS, D_DTT0,
  174. "DTT1", LTOS, D_DTT1,
  175. "MMUSR", LTOS, D_MMUSR,
  176. "URP", LTOS, D_URP,
  177. "SRP", LTOS, D_SRP,
  178. "R0", LDREG, D_R0+0,
  179. "R1", LDREG, D_R0+1,
  180. "R2", LDREG, D_R0+2,
  181. "R3", LDREG, D_R0+3,
  182. "R4", LDREG, D_R0+4,
  183. "R5", LDREG, D_R0+5,
  184. "R6", LDREG, D_R0+6,
  185. "R7", LDREG, D_R0+7,
  186. ".W", LWID, 0,
  187. ".L", LWID, 4,
  188. "A0", LAREG, D_A0+0,
  189. "A1", LAREG, D_A0+1,
  190. "A2", LAREG, D_A0+2,
  191. "A3", LAREG, D_A0+3,
  192. "A4", LAREG, D_A0+4,
  193. "A5", LAREG, D_A0+5,
  194. "A6", LAREG, D_A0+6,
  195. "A7", LAREG, D_A0+7,
  196. "F0", LFREG, D_F0+0,
  197. "F1", LFREG, D_F0+1,
  198. "F2", LFREG, D_F0+2,
  199. "F3", LFREG, D_F0+3,
  200. "F4", LFREG, D_F0+4,
  201. "F5", LFREG, D_F0+5,
  202. "F6", LFREG, D_F0+6,
  203. "F7", LFREG, D_F0+7,
  204. "ABCD", LTYPE1, AABCD,
  205. "ADDB", LTYPE1, AADDB,
  206. "ADDL", LTYPE1, AADDL,
  207. "ADDW", LTYPE1, AADDW,
  208. "ADDXB", LTYPE1, AADDXB,
  209. "ADDXL", LTYPE1, AADDXL,
  210. "ADDXW", LTYPE1, AADDXW,
  211. "ADJSP", LTYPE5, AADJSP,
  212. "ANDB", LTYPE1, AANDB,
  213. "ANDL", LTYPE1, AANDL,
  214. "ANDW", LTYPE1, AANDW,
  215. "ASLB", LTYPE1, AASLB,
  216. "ASLL", LTYPE1, AASLL,
  217. "ASLW", LTYPE1, AASLW,
  218. "ASRB", LTYPE1, AASRB,
  219. "ASRL", LTYPE1, AASRL,
  220. "ASRW", LTYPE1, AASRW,
  221. "BCASE", LTYPE7, ABCASE,
  222. "BCC", LTYPE6, ABCC,
  223. "BCHG", LTYPE1, ABCHG,
  224. "BCLR", LTYPE1, ABCLR,
  225. "BCS", LTYPE6, ABCS,
  226. "BEQ", LTYPE6, ABEQ,
  227. "BFCHG", LTYPEA, ABFCHG,
  228. "BFCLR", LTYPEA, ABFCLR,
  229. "BFEXTS", LTYPEA, ABFEXTS,
  230. "BFEXTU", LTYPEA, ABFEXTU,
  231. "BFFFO", LTYPEA, ABFFFO,
  232. "BFINS", LTYPEA, ABFINS,
  233. "BFSET", LTYPEA, ABFSET,
  234. "BFTST", LTYPEA, ABFTST,
  235. "BGE", LTYPE6, ABGE,
  236. "BGT", LTYPE6, ABGT,
  237. "BHI", LTYPE6, ABHI,
  238. "BKPT", LTYPE1, ABKPT,
  239. "BLE", LTYPE6, ABLE,
  240. "BLS", LTYPE6, ABLS,
  241. "BLT", LTYPE6, ABLT,
  242. "BMI", LTYPE6, ABMI,
  243. "BNE", LTYPE6, ABNE,
  244. "BPL", LTYPE6, ABPL,
  245. "BRA", LTYPE6, ABRA,
  246. "BSET", LTYPE1, ABSET,
  247. "BSR", LTYPE3, ABSR,
  248. "BTST", LTYPE1, ABTST,
  249. "BVC", LTYPE6, ABVC,
  250. "BVS", LTYPE6, ABVS,
  251. "CALLM", LTYPE1, ACALLM,
  252. "CAS2B", LTYPE1, ACAS2B,
  253. "CAS2L", LTYPE1, ACAS2L,
  254. "CAS2W", LTYPE1, ACAS2W,
  255. "CASB", LTYPE1, ACASB,
  256. "CASEW", LTYPE2, ACASEW,
  257. "CASL", LTYPE1, ACASL,
  258. "CASW", LTYPE1, ACASW,
  259. "CHK2B", LTYPE1, ACHK2B,
  260. "CHK2L", LTYPE1, ACHK2L,
  261. "CHK2W", LTYPE1, ACHK2W,
  262. "CHKL", LTYPE1, ACHKL,
  263. "CHKW", LTYPE1, ACHKW,
  264. "CLRB", LTYPE3, ACLRB,
  265. "CLRL", LTYPE3, ACLRL,
  266. "CLRW", LTYPE3, ACLRW,
  267. "CMP2B", LTYPE1, ACMP2B,
  268. "CMP2L", LTYPE1, ACMP2L,
  269. "CMP2W", LTYPE1, ACMP2W,
  270. "CMPB", LTYPE1, ACMPB,
  271. "CMPL", LTYPE1, ACMPL,
  272. "CMPW", LTYPE1, ACMPW,
  273. "DATA", LTYPE4, ADATA,
  274. "DBCC", LTYPE7, ADBCC,
  275. "DBCS", LTYPE7, ADBCS,
  276. "DBEQ", LTYPE7, ADBEQ,
  277. "DBF", LTYPE7, ADBF,
  278. "DBGE", LTYPE7, ADBGE,
  279. "DBGT", LTYPE7, ADBGT,
  280. "DBHI", LTYPE7, ADBHI,
  281. "DBLE", LTYPE7, ADBLE,
  282. "DBLS", LTYPE7, ADBLS,
  283. "DBLT", LTYPE7, ADBLT,
  284. "DBMI", LTYPE7, ADBMI,
  285. "DBNE", LTYPE7, ADBNE,
  286. "DBPL", LTYPE7, ADBPL,
  287. "DBT", LTYPE7, ADBT,
  288. "DBVC", LTYPE7, ADBVC,
  289. "DBVS", LTYPE7, ADBVS,
  290. "DIVSL", LTYPE1, ADIVSL,
  291. "DIVSW", LTYPE1, ADIVSW,
  292. "DIVUL", LTYPE1, ADIVUL,
  293. "DIVUW", LTYPE1, ADIVUW,
  294. "END", LTYPE2, AEND,
  295. "EORB", LTYPE1, AEORB,
  296. "EORL", LTYPE1, AEORL,
  297. "EORW", LTYPE1, AEORW,
  298. "EXG", LTYPE1, AEXG,
  299. "EXTBL", LTYPE3, AEXTBL,
  300. "EXTBW", LTYPE3, AEXTBW,
  301. "EXTWL", LTYPE3, AEXTWL,
  302. "FABSB", LTYPE1, AFABSB,
  303. "FABSD", LTYPE1, AFABSD,
  304. "FABSF", LTYPE1, AFABSF,
  305. "FABSL", LTYPE1, AFABSL,
  306. "FABSW", LTYPE1, AFABSW,
  307. "FACOSB", LTYPE1, AFACOSB,
  308. "FACOSD", LTYPE1, AFACOSD,
  309. "FACOSF", LTYPE1, AFACOSF,
  310. "FACOSL", LTYPE1, AFACOSL,
  311. "FACOSW", LTYPE1, AFACOSW,
  312. "FADDB", LTYPE1, AFADDB,
  313. "FADDD", LTYPE1, AFADDD,
  314. "FADDF", LTYPE1, AFADDF,
  315. "FADDL", LTYPE1, AFADDL,
  316. "FADDW", LTYPE1, AFADDW,
  317. "FASINB", LTYPE1, AFASINB,
  318. "FASIND", LTYPE1, AFASIND,
  319. "FASINF", LTYPE1, AFASINF,
  320. "FASINL", LTYPE1, AFASINL,
  321. "FASINW", LTYPE1, AFASINW,
  322. "FATANB", LTYPE1, AFATANB,
  323. "FATAND", LTYPE1, AFATAND,
  324. "FATANF", LTYPE1, AFATANF,
  325. "FATANHB", LTYPE1, AFATANHB,
  326. "FATANHD", LTYPE1, AFATANHD,
  327. "FATANHF", LTYPE1, AFATANHF,
  328. "FATANHL", LTYPE1, AFATANHL,
  329. "FATANHW", LTYPE1, AFATANHW,
  330. "FATANL", LTYPE1, AFATANL,
  331. "FATANW", LTYPE1, AFATANW,
  332. "FBEQ", LTYPE6, AFBEQ,
  333. "FBF", LTYPE6, AFBF,
  334. "FBGE", LTYPE6, AFBGE,
  335. "FBGT", LTYPE6, AFBGT,
  336. "FBLE", LTYPE6, AFBLE,
  337. "FBLT", LTYPE6, AFBLT,
  338. "FBNE", LTYPE6, AFBNE,
  339. "FBT", LTYPE6, AFBT,
  340. "FCMPB", LTYPE1, AFCMPB,
  341. "FCMPD", LTYPE1, AFCMPD,
  342. "FCMPF", LTYPE1, AFCMPF,
  343. "FCMPL", LTYPE1, AFCMPL,
  344. "FCMPW", LTYPE1, AFCMPW,
  345. "FCOSB", LTYPE1, AFCOSB,
  346. "FCOSD", LTYPE1, AFCOSD,
  347. "FCOSF", LTYPE1, AFCOSF,
  348. "FCOSHB", LTYPE1, AFCOSHB,
  349. "FCOSHD", LTYPE1, AFCOSHD,
  350. "FCOSHF", LTYPE1, AFCOSHF,
  351. "FCOSHL", LTYPE1, AFCOSHL,
  352. "FCOSHW", LTYPE1, AFCOSHW,
  353. "FCOSL", LTYPE1, AFCOSL,
  354. "FCOSW", LTYPE1, AFCOSW,
  355. "FDBEQ", LTYPE7, AFDBEQ,
  356. "FDBF", LTYPE7, AFDBF,
  357. "FDBGE", LTYPE7, AFDBGE,
  358. "FDBGT", LTYPE7, AFDBGT,
  359. "FDBLE", LTYPE7, AFDBLE,
  360. "FDBLT", LTYPE7, AFDBLT,
  361. "FDBNE", LTYPE7, AFDBNE,
  362. "FDBT", LTYPE7, AFDBT,
  363. "FDIVB", LTYPE1, AFDIVB,
  364. "FDIVD", LTYPE1, AFDIVD,
  365. "FDIVF", LTYPE1, AFDIVF,
  366. "FDIVL", LTYPE1, AFDIVL,
  367. "FDIVW", LTYPE1, AFDIVW,
  368. "FETOXB", LTYPE1, AFETOXB,
  369. "FETOXD", LTYPE1, AFETOXD,
  370. "FETOXF", LTYPE1, AFETOXF,
  371. "FETOXL", LTYPE1, AFETOXL,
  372. "FETOXM1B", LTYPE1, AFETOXM1B,
  373. "FETOXM1D", LTYPE1, AFETOXM1D,
  374. "FETOXM1F", LTYPE1, AFETOXM1F,
  375. "FETOXM1L", LTYPE1, AFETOXM1L,
  376. "FETOXM1W", LTYPE1, AFETOXM1W,
  377. "FETOXW", LTYPE1, AFETOXW,
  378. "FGETEXPB", LTYPE1, AFGETEXPB,
  379. "FGETEXPD", LTYPE1, AFGETEXPD,
  380. "FGETEXPF", LTYPE1, AFGETEXPF,
  381. "FGETEXPL", LTYPE1, AFGETEXPL,
  382. "FGETEXPW", LTYPE1, AFGETEXPW,
  383. "FGETMANB", LTYPE1, AFGETMANB,
  384. "FGETMAND", LTYPE1, AFGETMAND,
  385. "FGETMANF", LTYPE1, AFGETMANF,
  386. "FGETMANL", LTYPE1, AFGETMANL,
  387. "FGETMANW", LTYPE1, AFGETMANW,
  388. "FINTB", LTYPE1, AFINTB,
  389. "FINTD", LTYPE1, AFINTD,
  390. "FINTF", LTYPE1, AFINTF,
  391. "FINTL", LTYPE1, AFINTL,
  392. "FINTRZB", LTYPE1, AFINTRZB,
  393. "FINTRZD", LTYPE1, AFINTRZD,
  394. "FINTRZF", LTYPE1, AFINTRZF,
  395. "FINTRZL", LTYPE1, AFINTRZL,
  396. "FINTRZW", LTYPE1, AFINTRZW,
  397. "FINTW", LTYPE1, AFINTW,
  398. "FLOG10B", LTYPE1, AFLOG10B,
  399. "FLOG10D", LTYPE1, AFLOG10D,
  400. "FLOG10F", LTYPE1, AFLOG10F,
  401. "FLOG10L", LTYPE1, AFLOG10L,
  402. "FLOG10W", LTYPE1, AFLOG10W,
  403. "FLOG2B", LTYPE1, AFLOG2B,
  404. "FLOG2D", LTYPE1, AFLOG2D,
  405. "FLOG2F", LTYPE1, AFLOG2F,
  406. "FLOG2L", LTYPE1, AFLOG2L,
  407. "FLOG2W", LTYPE1, AFLOG2W,
  408. "FLOGNB", LTYPE1, AFLOGNB,
  409. "FLOGND", LTYPE1, AFLOGND,
  410. "FLOGNF", LTYPE1, AFLOGNF,
  411. "FLOGNL", LTYPE1, AFLOGNL,
  412. "FLOGNP1B", LTYPE1, AFLOGNP1B,
  413. "FLOGNP1D", LTYPE1, AFLOGNP1D,
  414. "FLOGNP1F", LTYPE1, AFLOGNP1F,
  415. "FLOGNP1L", LTYPE1, AFLOGNP1L,
  416. "FLOGNP1W", LTYPE1, AFLOGNP1W,
  417. "FLOGNW", LTYPE1, AFLOGNW,
  418. "FMODB", LTYPE1, AFMODB,
  419. "FMODD", LTYPE1, AFMODD,
  420. "FMODF", LTYPE1, AFMODF,
  421. "FMODL", LTYPE1, AFMODL,
  422. "FMODW", LTYPE1, AFMODW,
  423. "FMOVEB", LTYPE1, AFMOVEB,
  424. "FMOVED", LTYPE1, AFMOVED,
  425. "FMOVEF", LTYPE1, AFMOVEF,
  426. "FMOVEL", LTYPE1, AFMOVEL,
  427. "FMOVEW", LTYPE1, AFMOVEW,
  428. "FMULB", LTYPE1, AFMULB,
  429. "FMULD", LTYPE1, AFMULD,
  430. "FMULF", LTYPE1, AFMULF,
  431. "FMULL", LTYPE1, AFMULL,
  432. "FMULW", LTYPE1, AFMULW,
  433. "FNEGB", LTYPE8, AFNEGB,
  434. "FNEGD", LTYPE8, AFNEGD,
  435. "FNEGF", LTYPE8, AFNEGF,
  436. "FNEGL", LTYPE8, AFNEGL,
  437. "FNEGW", LTYPE8, AFNEGW,
  438. "FREMB", LTYPE1, AFREMB,
  439. "FREMD", LTYPE1, AFREMD,
  440. "FREMF", LTYPE1, AFREMF,
  441. "FREML", LTYPE1, AFREML,
  442. "FREMW", LTYPE1, AFREMW,
  443. "FSCALEB", LTYPE1, AFSCALEB,
  444. "FSCALED", LTYPE1, AFSCALED,
  445. "FSCALEF", LTYPE1, AFSCALEF,
  446. "FSCALEL", LTYPE1, AFSCALEL,
  447. "FSCALEW", LTYPE1, AFSCALEW,
  448. "FSEQ", LTYPE1, AFSEQ,
  449. "FSF", LTYPE1, AFSF,
  450. "FSGE", LTYPE1, AFSGE,
  451. "FSGT", LTYPE1, AFSGT,
  452. "FSINB", LTYPE1, AFSINB,
  453. "FSIND", LTYPE1, AFSIND,
  454. "FSINF", LTYPE1, AFSINF,
  455. "FSINHB", LTYPE1, AFSINHB,
  456. "FSINHD", LTYPE1, AFSINHD,
  457. "FSINHF", LTYPE1, AFSINHF,
  458. "FSINHL", LTYPE1, AFSINHL,
  459. "FSINHW", LTYPE1, AFSINHW,
  460. "FSINL", LTYPE1, AFSINL,
  461. "FSINW", LTYPE1, AFSINW,
  462. "FSLE", LTYPE1, AFSLE,
  463. "FSLT", LTYPE1, AFSLT,
  464. "FSNE", LTYPE1, AFSNE,
  465. "FSQRTB", LTYPE1, AFSQRTB,
  466. "FSQRTD", LTYPE1, AFSQRTD,
  467. "FSQRTF", LTYPE1, AFSQRTF,
  468. "FSQRTL", LTYPE1, AFSQRTL,
  469. "FSQRTW", LTYPE1, AFSQRTW,
  470. "FST", LTYPE1, AFST,
  471. "FSUBB", LTYPE1, AFSUBB,
  472. "FSUBD", LTYPE1, AFSUBD,
  473. "FSUBF", LTYPE1, AFSUBF,
  474. "FSUBL", LTYPE1, AFSUBL,
  475. "FSUBW", LTYPE1, AFSUBW,
  476. "FTANB", LTYPE1, AFTANB,
  477. "FTAND", LTYPE1, AFTAND,
  478. "FTANF", LTYPE1, AFTANF,
  479. "FTANHB", LTYPE1, AFTANHB,
  480. "FTANHD", LTYPE1, AFTANHD,
  481. "FTANHF", LTYPE1, AFTANHF,
  482. "FTANHL", LTYPE1, AFTANHL,
  483. "FTANHW", LTYPE1, AFTANHW,
  484. "FTANL", LTYPE1, AFTANL,
  485. "FTANW", LTYPE1, AFTANW,
  486. "FTENTOXB", LTYPE1, AFTENTOXB,
  487. "FTENTOXD", LTYPE1, AFTENTOXD,
  488. "FTENTOXF", LTYPE1, AFTENTOXF,
  489. "FTENTOXL", LTYPE1, AFTENTOXL,
  490. "FTENTOXW", LTYPE1, AFTENTOXW,
  491. "FTSTB", LTYPE1, AFTSTB,
  492. "FTSTD", LTYPE1, AFTSTD,
  493. "FTSTF", LTYPE1, AFTSTF,
  494. "FTSTL", LTYPE1, AFTSTL,
  495. "FTSTW", LTYPE1, AFTSTW,
  496. "FTWOTOXB", LTYPE1, AFTWOTOXB,
  497. "FTWOTOXD", LTYPE1, AFTWOTOXD,
  498. "FTWOTOXF", LTYPE1, AFTWOTOXF,
  499. "FTWOTOXL", LTYPE1, AFTWOTOXL,
  500. "FTWOTOXW", LTYPE1, AFTWOTOXW,
  501. "FMOVEM", LTYPE1, AFMOVEM,
  502. "FMOVEMC", LTYPE1, AFMOVEMC,
  503. "FRESTORE", LTYPE3, AFRESTORE,
  504. "FSAVE", LTYPE3, AFSAVE,
  505. "GLOBL", LTYPE1, AGLOBL,
  506. "GOK", LTYPE2, AGOK,
  507. "HISTORY", LTYPE2, AHISTORY,
  508. "ILLEG", LTYPE2, AILLEG,
  509. "INSTR", LTYPE3, AINSTR,
  510. "JMP", LTYPE3, AJMP,
  511. "JSR", LTYPE3, AJSR,
  512. "LEA", LTYPE1, ALEA,
  513. "LINKL", LTYPE1, ALINKL,
  514. "LINKW", LTYPE1, ALINKW,
  515. "LOCATE", LTYPE1, ALOCATE,
  516. "LONG", LTYPE3, ALONG,
  517. "LSLB", LTYPE1, ALSLB,
  518. "LSLL", LTYPE1, ALSLL,
  519. "LSLW", LTYPE1, ALSLW,
  520. "LSRB", LTYPE1, ALSRB,
  521. "LSRL", LTYPE1, ALSRL,
  522. "LSRW", LTYPE1, ALSRW,
  523. "MOVB", LTYPE1, AMOVB,
  524. "MOVEM", LTYPE1, AMOVEM,
  525. "MOVEPL", LTYPE1, AMOVEPL,
  526. "MOVEPW", LTYPE1, AMOVEPW,
  527. "MOVESB", LTYPE1, AMOVESB,
  528. "MOVESL", LTYPE1, AMOVESL,
  529. "MOVESW", LTYPE1, AMOVESW,
  530. "MOVL", LTYPE1, AMOVL,
  531. "MOVW", LTYPE1, AMOVW,
  532. "MULSL", LTYPE1, AMULSL,
  533. "MULSW", LTYPE1, AMULSW,
  534. "MULUL", LTYPE1, AMULUL,
  535. "MULUW", LTYPE1, AMULUW,
  536. "NAME", LTYPE1, ANAME,
  537. "NBCD", LTYPE3, ANBCD,
  538. "NEGB", LTYPE3, ANEGB,
  539. "NEGL", LTYPE3, ANEGL,
  540. "NEGW", LTYPE3, ANEGW,
  541. "NEGXB", LTYPE3, ANEGXB,
  542. "NEGXL", LTYPE3, ANEGXL,
  543. "NEGXW", LTYPE3, ANEGXW,
  544. "NOP", LTYPE9, ANOP,
  545. "NOTB", LTYPE3, ANOTB,
  546. "NOTL", LTYPE3, ANOTL,
  547. "NOTW", LTYPE3, ANOTW,
  548. "ORB", LTYPE1, AORB,
  549. "ORL", LTYPE1, AORL,
  550. "ORW", LTYPE1, AORW,
  551. "PACK", LTYPE1, APACK,
  552. "PEA", LTYPE3, APEA,
  553. "RESET", LTYPE2, ARESET,
  554. "ROTLB", LTYPE1, AROTLB,
  555. "ROTLL", LTYPE1, AROTLL,
  556. "ROTLW", LTYPE1, AROTLW,
  557. "ROTRB", LTYPE1, AROTRB,
  558. "ROTRL", LTYPE1, AROTRL,
  559. "ROTRW", LTYPE1, AROTRW,
  560. "ROXLB", LTYPE1, AROXLB,
  561. "ROXLL", LTYPE1, AROXLL,
  562. "ROXLW", LTYPE1, AROXLW,
  563. "ROXRB", LTYPE1, AROXRB,
  564. "ROXRL", LTYPE1, AROXRL,
  565. "ROXRW", LTYPE1, AROXRW,
  566. "RTD", LTYPE3, ARTD,
  567. "RTE", LTYPE2, ARTE,
  568. "RTM", LTYPE3, ARTM,
  569. "RTR", LTYPE2, ARTR,
  570. "RTS", LTYPE2, ARTS,
  571. "SBCD", LTYPE1, ASBCD,
  572. "SCC", LTYPE3, ASCC,
  573. "SCS", LTYPE3, ASCS,
  574. "SEQ", LTYPE3, ASEQ,
  575. "SF", LTYPE3, ASF,
  576. "SGE", LTYPE3, ASGE,
  577. "SGT", LTYPE3, ASGT,
  578. "SHI", LTYPE3, ASHI,
  579. "SLE", LTYPE3, ASLE,
  580. "SLS", LTYPE3, ASLS,
  581. "SLT", LTYPE3, ASLT,
  582. "SMI", LTYPE3, ASMI,
  583. "SNE", LTYPE3, ASNE,
  584. "SPL", LTYPE3, ASPL,
  585. "ST", LTYPE3, AST,
  586. "STOP", LTYPE3, ASTOP,
  587. "SUBB", LTYPE1, ASUBB,
  588. "SUBL", LTYPE1, ASUBL,
  589. "SUBW", LTYPE1, ASUBW,
  590. "SUBXB", LTYPE1, ASUBXB,
  591. "SUBXL", LTYPE1, ASUBXL,
  592. "SUBXW", LTYPE1, ASUBXW,
  593. "SVC", LTYPE2, ASVC,
  594. "SVS", LTYPE2, ASVS,
  595. "SWAP", LTYPE3, ASWAP,
  596. "SYS", LTYPE2, ASYS,
  597. "TAS", LTYPE3, ATAS,
  598. "TEXT", LTYPEB, ATEXT,
  599. "TRAP", LTYPE3, ATRAP,
  600. "TRAPCC", LTYPE2, ATRAPCC,
  601. "TRAPCS", LTYPE2, ATRAPCS,
  602. "TRAPEQ", LTYPE2, ATRAPEQ,
  603. "TRAPF", LTYPE2, ATRAPF,
  604. "TRAPGE", LTYPE2, ATRAPGE,
  605. "TRAPGT", LTYPE2, ATRAPGT,
  606. "TRAPHI", LTYPE2, ATRAPHI,
  607. "TRAPLE", LTYPE2, ATRAPLE,
  608. "TRAPLS", LTYPE2, ATRAPLS,
  609. "TRAPLT", LTYPE2, ATRAPLT,
  610. "TRAPMI", LTYPE2, ATRAPMI,
  611. "TRAPNE", LTYPE2, ATRAPNE,
  612. "TRAPPL", LTYPE2, ATRAPPL,
  613. "TRAPT", LTYPE2, ATRAPT,
  614. "TRAPV", LTYPE2, ATRAPV,
  615. "TRAPVC", LTYPE2, ATRAPVC,
  616. "TRAPVS", LTYPE2, ATRAPVS,
  617. "TSTB", LTYPE3, ATSTB,
  618. "TSTL", LTYPE3, ATSTL,
  619. "TSTW", LTYPE3, ATSTW,
  620. "UNLK", LTYPE3, AUNLK,
  621. "UNPK", LTYPE1, AUNPK,
  622. "WORD", LTYPE3, AWORD,
  623. 0
  624. };
  625. void
  626. cinit(void)
  627. {
  628. Sym *s;
  629. int i;
  630. nullgen.sym = S;
  631. nullgen.offset = 0;
  632. nullgen.type = D_NONE;
  633. if(FPCHIP)
  634. nullgen.dval = 0;
  635. for(i=0; i<sizeof(nullgen.sval); i++)
  636. nullgen.sval[i] = 0;
  637. nullgen.displace = 0;
  638. nullgen.type = D_NONE;
  639. nullgen.index = D_NONE;
  640. nullgen.scale = 0;
  641. nullgen.field = 0;
  642. nerrors = 0;
  643. iostack = I;
  644. iofree = I;
  645. peekc = IGN;
  646. nhunk = 0;
  647. for(i=0; i<NHASH; i++)
  648. hash[i] = S;
  649. for(i=0; itab[i].name; i++) {
  650. s = slookup(itab[i].name);
  651. s->type = itab[i].type;
  652. s->value = itab[i].value;
  653. }
  654. pathname = allocn(pathname, 0, 100);
  655. if(mygetwd(pathname, 99) == 0) {
  656. pathname = allocn(pathname, 100, 900);
  657. if(mygetwd(pathname, 999) == 0)
  658. strcpy(pathname, "/???");
  659. }
  660. }
  661. void
  662. syminit(Sym *s)
  663. {
  664. s->type = LNAME;
  665. s->value = 0;
  666. }
  667. void
  668. cclean(void)
  669. {
  670. Gen2 g2;
  671. g2.from = nullgen;
  672. g2.to = nullgen;
  673. outcode(AEND, &g2);
  674. Bflush(&obuf);
  675. }
  676. void
  677. zname(char *n, int t, int s)
  678. {
  679. Bputc(&obuf, ANAME); /* as */
  680. Bputc(&obuf, ANAME>>8);
  681. Bputc(&obuf, t); /* type */
  682. Bputc(&obuf, s); /* sym */
  683. while(*n) {
  684. Bputc(&obuf, *n);
  685. n++;
  686. }
  687. Bputc(&obuf, 0);
  688. }
  689. void
  690. zaddr(Gen *a, int s)
  691. {
  692. long l;
  693. int i, t;
  694. char *n;
  695. Ieee e;
  696. t = 0;
  697. if(a->field)
  698. t |= T_FIELD;
  699. if(a->index != D_NONE || a->displace != 0)
  700. t |= T_INDEX;
  701. if(a->offset != 0)
  702. t |= T_OFFSET;
  703. if(s != 0)
  704. t |= T_SYM;
  705. if(a->type == D_FCONST)
  706. t |= T_FCONST;
  707. else
  708. if(a->type == D_SCONST)
  709. t |= T_SCONST;
  710. else
  711. if(a->type & ~0xff)
  712. t |= T_TYPE;
  713. Bputc(&obuf, t);
  714. if(t & T_FIELD) { /* implies field */
  715. i = a->field;
  716. Bputc(&obuf, i);
  717. Bputc(&obuf, i>>8);
  718. }
  719. if(t & T_INDEX) { /* implies index, scale, displace */
  720. i = a->index;
  721. Bputc(&obuf, i);
  722. Bputc(&obuf, i>>8);
  723. Bputc(&obuf, a->scale);
  724. l = a->displace;
  725. Bputc(&obuf, l);
  726. Bputc(&obuf, l>>8);
  727. Bputc(&obuf, l>>16);
  728. Bputc(&obuf, l>>24);
  729. }
  730. if(t & T_OFFSET) { /* implies offset */
  731. l = a->offset;
  732. Bputc(&obuf, l);
  733. Bputc(&obuf, l>>8);
  734. Bputc(&obuf, l>>16);
  735. Bputc(&obuf, l>>24);
  736. }
  737. if(t & T_SYM) /* implies sym */
  738. Bputc(&obuf, s);
  739. if(t & T_FCONST) {
  740. ieeedtod(&e, a->dval);
  741. l = e.l;
  742. Bputc(&obuf, l);
  743. Bputc(&obuf, l>>8);
  744. Bputc(&obuf, l>>16);
  745. Bputc(&obuf, l>>24);
  746. l = e.h;
  747. Bputc(&obuf, l);
  748. Bputc(&obuf, l>>8);
  749. Bputc(&obuf, l>>16);
  750. Bputc(&obuf, l>>24);
  751. return;
  752. }
  753. if(t & T_SCONST) {
  754. n = a->sval;
  755. for(i=0; i<NSNAME; i++) {
  756. Bputc(&obuf, *n);
  757. n++;
  758. }
  759. return;
  760. }
  761. i = a->type;
  762. Bputc(&obuf, i);
  763. if(t & T_TYPE)
  764. Bputc(&obuf, i>>8);
  765. }
  766. void
  767. outcode(int a, Gen2 *g2)
  768. {
  769. int sf, st, t;
  770. Sym *s;
  771. if(pass == 1)
  772. goto out;
  773. jackpot:
  774. sf = 0;
  775. s = g2->from.sym;
  776. while(s != S) {
  777. sf = s->sym;
  778. if(sf < 0 || sf >= NSYM)
  779. sf = 0;
  780. t = g2->from.type & D_MASK;
  781. if(h[sf].type == t)
  782. if(h[sf].sym == s)
  783. break;
  784. zname(s->name, t, sym);
  785. s->sym = sym;
  786. h[sym].sym = s;
  787. h[sym].type = t;
  788. sf = sym;
  789. sym++;
  790. if(sym >= NSYM)
  791. sym = 1;
  792. break;
  793. }
  794. st = 0;
  795. s = g2->to.sym;
  796. while(s != S) {
  797. st = s->sym;
  798. if(st < 0 || st >= NSYM)
  799. st = 0;
  800. t = g2->to.type & D_MASK;
  801. if(h[st].type == t)
  802. if(h[st].sym == s)
  803. break;
  804. zname(s->name, t, sym);
  805. s->sym = sym;
  806. h[sym].sym = s;
  807. h[sym].type = t;
  808. st = sym;
  809. sym++;
  810. if(sym >= NSYM)
  811. sym = 1;
  812. if(st == sf)
  813. goto jackpot;
  814. break;
  815. }
  816. Bputc(&obuf, a);
  817. Bputc(&obuf, a>>8);
  818. Bputc(&obuf, lineno);
  819. Bputc(&obuf, lineno>>8);
  820. Bputc(&obuf, lineno>>16);
  821. Bputc(&obuf, lineno>>24);
  822. zaddr(&g2->from, sf);
  823. zaddr(&g2->to, st);
  824. out:
  825. if(a != AGLOBL && a != ADATA)
  826. pc++;
  827. }
  828. void
  829. outhist(void)
  830. {
  831. Gen g;
  832. Hist *h;
  833. char *p, *q, *op, c;
  834. int n;
  835. g = nullgen;
  836. c = pathchar();
  837. for(h = hist; h != H; h = h->link) {
  838. p = h->name;
  839. op = 0;
  840. if(p && p[0] != c && h->offset == 0 && pathname){
  841. /* on windows skip drive specifier in pathname */
  842. if(systemtype(Windows) && pathname[2] == c) {
  843. op = p;
  844. p = pathname+2;
  845. *p = '/';
  846. } else if(pathname[0] == c){
  847. op = p;
  848. p = pathname;
  849. }
  850. }
  851. while(p) {
  852. q = strchr(p, c);
  853. if(q) {
  854. n = q-p;
  855. if(n == 0)
  856. n = 1; /* leading "/" */
  857. q++;
  858. } else {
  859. n = strlen(p);
  860. q = 0;
  861. }
  862. if(n) {
  863. Bputc(&obuf, ANAME);
  864. Bputc(&obuf, ANAME>>8);
  865. Bputc(&obuf, D_FILE); /* type */
  866. Bputc(&obuf, 1); /* sym */
  867. Bputc(&obuf, '<');
  868. Bwrite(&obuf, p, n);
  869. Bputc(&obuf, 0);
  870. }
  871. p = q;
  872. if(p == 0 && op) {
  873. p = op;
  874. op = 0;
  875. }
  876. }
  877. g.offset = h->offset;
  878. Bputc(&obuf, AHISTORY);
  879. Bputc(&obuf, AHISTORY>>8);
  880. Bputc(&obuf, h->line);
  881. Bputc(&obuf, h->line>>8);
  882. Bputc(&obuf, h->line>>16);
  883. Bputc(&obuf, h->line>>24);
  884. zaddr(&nullgen, 0);
  885. zaddr(&g, 0);
  886. }
  887. }
  888. void
  889. praghjdicks(void)
  890. {
  891. while(getnsc() != '\n')
  892. ;
  893. }
  894. void
  895. pragvararg(void)
  896. {
  897. while(getnsc() != '\n')
  898. ;
  899. }
  900. void
  901. pragfpround(void)
  902. {
  903. while(getnsc() != '\n')
  904. ;
  905. }
  906. #include "../cc/lexbody"
  907. #include "../cc/macbody"
  908. #include "../cc/compat"