lex.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  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 = '8';
  11. thestring = "386";
  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. "AL", LBREG, D_AL,
  157. "CL", LBREG, D_CL,
  158. "DL", LBREG, D_DL,
  159. "BL", LBREG, D_BL,
  160. "AH", LBREG, D_AH,
  161. "CH", LBREG, D_CH,
  162. "DH", LBREG, D_DH,
  163. "BH", LBREG, D_BH,
  164. "AX", LLREG, D_AX,
  165. "CX", LLREG, D_CX,
  166. "DX", LLREG, D_DX,
  167. "BX", LLREG, D_BX,
  168. /* "SP", LLREG, D_SP, */
  169. "BP", LLREG, D_BP,
  170. "SI", LLREG, D_SI,
  171. "DI", LLREG, D_DI,
  172. "F0", LFREG, D_F0+0,
  173. "F1", LFREG, D_F0+1,
  174. "F2", LFREG, D_F0+2,
  175. "F3", LFREG, D_F0+3,
  176. "F4", LFREG, D_F0+4,
  177. "F5", LFREG, D_F0+5,
  178. "F6", LFREG, D_F0+6,
  179. "F7", LFREG, D_F0+7,
  180. "CS", LSREG, D_CS,
  181. "SS", LSREG, D_SS,
  182. "DS", LSREG, D_DS,
  183. "ES", LSREG, D_ES,
  184. "FS", LSREG, D_FS,
  185. "GS", LSREG, D_GS,
  186. "GDTR", LBREG, D_GDTR,
  187. "IDTR", LBREG, D_IDTR,
  188. "LDTR", LBREG, D_LDTR,
  189. "MSW", LBREG, D_MSW,
  190. "TASK", LBREG, D_TASK,
  191. "CR0", LBREG, D_CR+0,
  192. "CR1", LBREG, D_CR+1,
  193. "CR2", LBREG, D_CR+2,
  194. "CR3", LBREG, D_CR+3,
  195. "CR4", LBREG, D_CR+4,
  196. "CR5", LBREG, D_CR+5,
  197. "CR6", LBREG, D_CR+6,
  198. "CR7", LBREG, D_CR+7,
  199. "DR0", LBREG, D_DR+0,
  200. "DR1", LBREG, D_DR+1,
  201. "DR2", LBREG, D_DR+2,
  202. "DR3", LBREG, D_DR+3,
  203. "DR4", LBREG, D_DR+4,
  204. "DR5", LBREG, D_DR+5,
  205. "DR6", LBREG, D_DR+6,
  206. "DR7", LBREG, D_DR+7,
  207. "TR0", LBREG, D_TR+0,
  208. "TR1", LBREG, D_TR+1,
  209. "TR2", LBREG, D_TR+2,
  210. "TR3", LBREG, D_TR+3,
  211. "TR4", LBREG, D_TR+4,
  212. "TR5", LBREG, D_TR+5,
  213. "TR6", LBREG, D_TR+6,
  214. "TR7", LBREG, D_TR+7,
  215. "AAA", LTYPE0, AAAA,
  216. "AAD", LTYPE0, AAAD,
  217. "AAM", LTYPE0, AAAM,
  218. "AAS", LTYPE0, AAAS,
  219. "ADCB", LTYPE3, AADCB,
  220. "ADCL", LTYPE3, AADCL,
  221. "ADCW", LTYPE3, AADCW,
  222. "ADDB", LTYPE3, AADDB,
  223. "ADDL", LTYPE3, AADDL,
  224. "ADDW", LTYPE3, AADDW,
  225. "ADJSP", LTYPE2, AADJSP,
  226. "ANDB", LTYPE3, AANDB,
  227. "ANDL", LTYPE3, AANDL,
  228. "ANDW", LTYPE3, AANDW,
  229. "ARPL", LTYPE3, AARPL,
  230. "BOUNDL", LTYPE3, ABOUNDL,
  231. "BOUNDW", LTYPE3, ABOUNDW,
  232. "BSFL", LTYPE3, ABSFL,
  233. "BSFW", LTYPE3, ABSFW,
  234. "BSRL", LTYPE3, ABSRL,
  235. "BSRW", LTYPE3, ABSRW,
  236. "BTCL", LTYPE3, ABTCL,
  237. "BTCW", LTYPE3, ABTCW,
  238. "BTL", LTYPE3, ABTL,
  239. "BTRL", LTYPE3, ABTRL,
  240. "BTRW", LTYPE3, ABTRW,
  241. "BTSL", LTYPE3, ABTSL,
  242. "BTSW", LTYPE3, ABTSW,
  243. "BTW", LTYPE3, ABTW,
  244. "BYTE", LTYPE2, ABYTE,
  245. "CALL", LTYPEC, ACALL,
  246. "CLC", LTYPE0, ACLC,
  247. "CLD", LTYPE0, ACLD,
  248. "CLI", LTYPE0, ACLI,
  249. "CLTS", LTYPE0, ACLTS,
  250. "CMC", LTYPE0, ACMC,
  251. "CMPB", LTYPE4, ACMPB,
  252. "CMPL", LTYPE4, ACMPL,
  253. "CMPW", LTYPE4, ACMPW,
  254. "CMPSB", LTYPE0, ACMPSB,
  255. "CMPSL", LTYPE0, ACMPSL,
  256. "CMPSW", LTYPE0, ACMPSW,
  257. "DAA", LTYPE0, ADAA,
  258. "DAS", LTYPE0, ADAS,
  259. "DATA", LTYPED, ADATA,
  260. "DECB", LTYPE1, ADECB,
  261. "DECL", LTYPE1, ADECL,
  262. "DECW", LTYPE1, ADECW,
  263. "DIVB", LTYPE2, ADIVB,
  264. "DIVL", LTYPE2, ADIVL,
  265. "DIVW", LTYPE2, ADIVW,
  266. "END", LTYPE0, AEND,
  267. "ENTER", LTYPE2, AENTER,
  268. "GLOBL", LTYPET, AGLOBL,
  269. "HLT", LTYPE0, AHLT,
  270. "IDIVB", LTYPE2, AIDIVB,
  271. "IDIVL", LTYPE2, AIDIVL,
  272. "IDIVW", LTYPE2, AIDIVW,
  273. "IMULB", LTYPE2, AIMULB,
  274. "IMULL", LTYPE2, AIMULL,
  275. "IMULW", LTYPE2, AIMULW,
  276. "INB", LTYPE0, AINB,
  277. "INL", LTYPE0, AINL,
  278. "INW", LTYPE0, AINW,
  279. "INCB", LTYPE1, AINCB,
  280. "INCL", LTYPE1, AINCL,
  281. "INCW", LTYPE1, AINCW,
  282. "INSB", LTYPE0, AINSB,
  283. "INSL", LTYPE0, AINSL,
  284. "INSW", LTYPE0, AINSW,
  285. "INT", LTYPE2, AINT,
  286. "INTO", LTYPE0, AINTO,
  287. "IRETL", LTYPE0, AIRETL,
  288. "IRETW", LTYPE0, AIRETW,
  289. "JOS", LTYPER, AJOS,
  290. "JO", LTYPER, AJOS, /* alternate */
  291. "JOC", LTYPER, AJOC,
  292. "JNO", LTYPER, AJOC, /* alternate */
  293. "JCS", LTYPER, AJCS,
  294. "JB", LTYPER, AJCS, /* alternate */
  295. "JC", LTYPER, AJCS, /* alternate */
  296. "JNAE", LTYPER, AJCS, /* alternate */
  297. "JLO", LTYPER, AJCS, /* alternate */
  298. "JCC", LTYPER, AJCC,
  299. "JAE", LTYPER, AJCC, /* alternate */
  300. "JNB", LTYPER, AJCC, /* alternate */
  301. "JNC", LTYPER, AJCC, /* alternate */
  302. "JHS", LTYPER, AJCC, /* alternate */
  303. "JEQ", LTYPER, AJEQ,
  304. "JE", LTYPER, AJEQ, /* alternate */
  305. "JZ", LTYPER, AJEQ, /* alternate */
  306. "JNE", LTYPER, AJNE,
  307. "JNZ", LTYPER, AJNE, /* alternate */
  308. "JLS", LTYPER, AJLS,
  309. "JBE", LTYPER, AJLS, /* alternate */
  310. "JNA", LTYPER, AJLS, /* alternate */
  311. "JHI", LTYPER, AJHI,
  312. "JA", LTYPER, AJHI, /* alternate */
  313. "JNBE", LTYPER, AJHI, /* alternate */
  314. "JMI", LTYPER, AJMI,
  315. "JS", LTYPER, AJMI, /* alternate */
  316. "JPL", LTYPER, AJPL,
  317. "JNS", LTYPER, AJPL, /* alternate */
  318. "JPS", LTYPER, AJPS,
  319. "JP", LTYPER, AJPS, /* alternate */
  320. "JPE", LTYPER, AJPS, /* alternate */
  321. "JPC", LTYPER, AJPC,
  322. "JNP", LTYPER, AJPC, /* alternate */
  323. "JPO", LTYPER, AJPC, /* alternate */
  324. "JLT", LTYPER, AJLT,
  325. "JL", LTYPER, AJLT, /* alternate */
  326. "JNGE", LTYPER, AJLT, /* alternate */
  327. "JGE", LTYPER, AJGE,
  328. "JNL", LTYPER, AJGE, /* alternate */
  329. "JLE", LTYPER, AJLE,
  330. "JNG", LTYPER, AJLE, /* alternate */
  331. "JGT", LTYPER, AJGT,
  332. "JG", LTYPER, AJGT, /* alternate */
  333. "JNLE", LTYPER, AJGT, /* alternate */
  334. "JCXZ", LTYPER, AJCXZ,
  335. "JMP", LTYPEC, AJMP,
  336. "LAHF", LTYPE0, ALAHF,
  337. "LARL", LTYPE3, ALARL,
  338. "LARW", LTYPE3, ALARW,
  339. "LEAL", LTYPE3, ALEAL,
  340. "LEAW", LTYPE3, ALEAW,
  341. "LEAVEL", LTYPE0, ALEAVEL,
  342. "LEAVEW", LTYPE0, ALEAVEW,
  343. "LOCK", LTYPE0, ALOCK,
  344. "LODSB", LTYPE0, ALODSB,
  345. "LODSL", LTYPE0, ALODSL,
  346. "LODSW", LTYPE0, ALODSW,
  347. "LONG", LTYPE2, ALONG,
  348. "LOOP", LTYPER, ALOOP,
  349. "LOOPEQ", LTYPER, ALOOPEQ,
  350. "LOOPNE", LTYPER, ALOOPNE,
  351. "LSLL", LTYPE3, ALSLL,
  352. "LSLW", LTYPE3, ALSLW,
  353. "MOVB", LTYPE3, AMOVB,
  354. "MOVL", LTYPEM, AMOVL,
  355. "MOVW", LTYPEM, AMOVW,
  356. "MOVBLSX", LTYPE3, AMOVBLSX,
  357. "MOVBLZX", LTYPE3, AMOVBLZX,
  358. "MOVBWSX", LTYPE3, AMOVBWSX,
  359. "MOVBWZX", LTYPE3, AMOVBWZX,
  360. "MOVWLSX", LTYPE3, AMOVWLSX,
  361. "MOVWLZX", LTYPE3, AMOVWLZX,
  362. "MOVSB", LTYPE0, AMOVSB,
  363. "MOVSL", LTYPE0, AMOVSL,
  364. "MOVSW", LTYPE0, AMOVSW,
  365. "MULB", LTYPE2, AMULB,
  366. "MULL", LTYPE2, AMULL,
  367. "MULW", LTYPE2, AMULW,
  368. "NEGB", LTYPE1, ANEGB,
  369. "NEGL", LTYPE1, ANEGL,
  370. "NEGW", LTYPE1, ANEGW,
  371. "NOP", LTYPEN, ANOP,
  372. "NOTB", LTYPE1, ANOTB,
  373. "NOTL", LTYPE1, ANOTL,
  374. "NOTW", LTYPE1, ANOTW,
  375. "ORB", LTYPE3, AORB,
  376. "ORL", LTYPE3, AORL,
  377. "ORW", LTYPE3, AORW,
  378. "OUTB", LTYPE0, AOUTB,
  379. "OUTL", LTYPE0, AOUTL,
  380. "OUTW", LTYPE0, AOUTW,
  381. "OUTSB", LTYPE0, AOUTSB,
  382. "OUTSL", LTYPE0, AOUTSL,
  383. "OUTSW", LTYPE0, AOUTSW,
  384. "POPAL", LTYPE0, APOPAL,
  385. "POPAW", LTYPE0, APOPAW,
  386. "POPFL", LTYPE0, APOPFL,
  387. "POPFW", LTYPE0, APOPFW,
  388. "POPL", LTYPE1, APOPL,
  389. "POPW", LTYPE1, APOPW,
  390. "PUSHAL", LTYPE0, APUSHAL,
  391. "PUSHAW", LTYPE0, APUSHAW,
  392. "PUSHFL", LTYPE0, APUSHFL,
  393. "PUSHFW", LTYPE0, APUSHFW,
  394. "PUSHL", LTYPE2, APUSHL,
  395. "PUSHW", LTYPE2, APUSHW,
  396. "RCLB", LTYPE3, ARCLB,
  397. "RCLL", LTYPE3, ARCLL,
  398. "RCLW", LTYPE3, ARCLW,
  399. "RCRB", LTYPE3, ARCRB,
  400. "RCRL", LTYPE3, ARCRL,
  401. "RCRW", LTYPE3, ARCRW,
  402. "REP", LTYPE0, AREP,
  403. "REPN", LTYPE0, AREPN,
  404. "RET", LTYPE0, ARET,
  405. "ROLB", LTYPE3, AROLB,
  406. "ROLL", LTYPE3, AROLL,
  407. "ROLW", LTYPE3, AROLW,
  408. "RORB", LTYPE3, ARORB,
  409. "RORL", LTYPE3, ARORL,
  410. "RORW", LTYPE3, ARORW,
  411. "SAHF", LTYPE0, ASAHF,
  412. "SALB", LTYPE3, ASALB,
  413. "SALL", LTYPE3, ASALL,
  414. "SALW", LTYPE3, ASALW,
  415. "SARB", LTYPE3, ASARB,
  416. "SARL", LTYPE3, ASARL,
  417. "SARW", LTYPE3, ASARW,
  418. "SBBB", LTYPE3, ASBBB,
  419. "SBBL", LTYPE3, ASBBL,
  420. "SBBW", LTYPE3, ASBBW,
  421. "SCASB", LTYPE0, ASCASB,
  422. "SCASL", LTYPE0, ASCASL,
  423. "SCASW", LTYPE0, ASCASW,
  424. "SETCC", LTYPE1, ASETCC,
  425. "SETCS", LTYPE1, ASETCS,
  426. "SETEQ", LTYPE1, ASETEQ,
  427. "SETGE", LTYPE1, ASETGE,
  428. "SETGT", LTYPE1, ASETGT,
  429. "SETHI", LTYPE1, ASETHI,
  430. "SETLE", LTYPE1, ASETLE,
  431. "SETLS", LTYPE1, ASETLS,
  432. "SETLT", LTYPE1, ASETLT,
  433. "SETMI", LTYPE1, ASETMI,
  434. "SETNE", LTYPE1, ASETNE,
  435. "SETOC", LTYPE1, ASETOC,
  436. "SETOS", LTYPE1, ASETOS,
  437. "SETPC", LTYPE1, ASETPC,
  438. "SETPL", LTYPE1, ASETPL,
  439. "SETPS", LTYPE1, ASETPS,
  440. "CDQ", LTYPE0, ACDQ,
  441. "CWD", LTYPE0, ACWD,
  442. "SHLB", LTYPE3, ASHLB,
  443. "SHLL", LTYPES, ASHLL,
  444. "SHLW", LTYPES, ASHLW,
  445. "SHRB", LTYPE3, ASHRB,
  446. "SHRL", LTYPES, ASHRL,
  447. "SHRW", LTYPES, ASHRW,
  448. "STC", LTYPE0, ASTC,
  449. "STD", LTYPE0, ASTD,
  450. "STI", LTYPE0, ASTI,
  451. "STOSB", LTYPE0, ASTOSB,
  452. "STOSL", LTYPE0, ASTOSL,
  453. "STOSW", LTYPE0, ASTOSW,
  454. "SUBB", LTYPE3, ASUBB,
  455. "SUBL", LTYPE3, ASUBL,
  456. "SUBW", LTYPE3, ASUBW,
  457. "SYSCALL", LTYPE0, ASYSCALL,
  458. "TESTB", LTYPE3, ATESTB,
  459. "TESTL", LTYPE3, ATESTL,
  460. "TESTW", LTYPE3, ATESTW,
  461. "TEXT", LTYPET, ATEXT,
  462. "VERR", LTYPE2, AVERR,
  463. "VERW", LTYPE2, AVERW,
  464. "WAIT", LTYPE0, AWAIT,
  465. "WORD", LTYPE2, AWORD,
  466. "XCHGB", LTYPE3, AXCHGB,
  467. "XCHGL", LTYPE3, AXCHGL,
  468. "XCHGW", LTYPE3, AXCHGW,
  469. "XLAT", LTYPE2, AXLAT,
  470. "XORB", LTYPE3, AXORB,
  471. "XORL", LTYPE3, AXORL,
  472. "XORW", LTYPE3, AXORW,
  473. "FMOVB", LTYPE3, AFMOVB,
  474. "FMOVBP", LTYPE3, AFMOVBP,
  475. "FMOVD", LTYPE3, AFMOVD,
  476. "FMOVDP", LTYPE3, AFMOVDP,
  477. "FMOVF", LTYPE3, AFMOVF,
  478. "FMOVFP", LTYPE3, AFMOVFP,
  479. "FMOVL", LTYPE3, AFMOVL,
  480. "FMOVLP", LTYPE3, AFMOVLP,
  481. "FMOVV", LTYPE3, AFMOVV,
  482. "FMOVVP", LTYPE3, AFMOVVP,
  483. "FMOVW", LTYPE3, AFMOVW,
  484. "FMOVWP", LTYPE3, AFMOVWP,
  485. "FMOVX", LTYPE3, AFMOVX,
  486. "FMOVXP", LTYPE3, AFMOVXP,
  487. "FCOMB", LTYPE3, AFCOMB,
  488. "FCOMBP", LTYPE3, AFCOMBP,
  489. "FCOMD", LTYPE3, AFCOMD,
  490. "FCOMDP", LTYPE3, AFCOMDP,
  491. "FCOMDPP", LTYPE3, AFCOMDPP,
  492. "FCOMF", LTYPE3, AFCOMF,
  493. "FCOMFP", LTYPE3, AFCOMFP,
  494. "FCOML", LTYPE3, AFCOML,
  495. "FCOMLP", LTYPE3, AFCOMLP,
  496. "FCOMW", LTYPE3, AFCOMW,
  497. "FCOMWP", LTYPE3, AFCOMWP,
  498. "FUCOM", LTYPE3, AFUCOM,
  499. "FUCOMP", LTYPE3, AFUCOMP,
  500. "FUCOMPP", LTYPE3, AFUCOMPP,
  501. "FADDW", LTYPE3, AFADDW,
  502. "FADDL", LTYPE3, AFADDL,
  503. "FADDF", LTYPE3, AFADDF,
  504. "FADDD", LTYPE3, AFADDD,
  505. "FADDDP", LTYPE3, AFADDDP,
  506. "FSUBDP", LTYPE3, AFSUBDP,
  507. "FSUBW", LTYPE3, AFSUBW,
  508. "FSUBL", LTYPE3, AFSUBL,
  509. "FSUBF", LTYPE3, AFSUBF,
  510. "FSUBD", LTYPE3, AFSUBD,
  511. "FSUBRDP", LTYPE3, AFSUBRDP,
  512. "FSUBRW", LTYPE3, AFSUBRW,
  513. "FSUBRL", LTYPE3, AFSUBRL,
  514. "FSUBRF", LTYPE3, AFSUBRF,
  515. "FSUBRD", LTYPE3, AFSUBRD,
  516. "FMULDP", LTYPE3, AFMULDP,
  517. "FMULW", LTYPE3, AFMULW,
  518. "FMULL", LTYPE3, AFMULL,
  519. "FMULF", LTYPE3, AFMULF,
  520. "FMULD", LTYPE3, AFMULD,
  521. "FDIVDP", LTYPE3, AFDIVDP,
  522. "FDIVW", LTYPE3, AFDIVW,
  523. "FDIVL", LTYPE3, AFDIVL,
  524. "FDIVF", LTYPE3, AFDIVF,
  525. "FDIVD", LTYPE3, AFDIVD,
  526. "FDIVRDP", LTYPE3, AFDIVRDP,
  527. "FDIVRW", LTYPE3, AFDIVRW,
  528. "FDIVRL", LTYPE3, AFDIVRL,
  529. "FDIVRF", LTYPE3, AFDIVRF,
  530. "FDIVRD", LTYPE3, AFDIVRD,
  531. "FXCHD", LTYPE3, AFXCHD,
  532. "FFREE", LTYPE1, AFFREE,
  533. "FLDCW", LTYPE2, AFLDCW,
  534. "FLDENV", LTYPE1, AFLDENV,
  535. "FRSTOR", LTYPE2, AFRSTOR,
  536. "FSAVE", LTYPE1, AFSAVE,
  537. "FSTCW", LTYPE1, AFSTCW,
  538. "FSTENV", LTYPE1, AFSTENV,
  539. "FSTSW", LTYPE1, AFSTSW,
  540. "F2XM1", LTYPE0, AF2XM1,
  541. "FABS", LTYPE0, AFABS,
  542. "FCHS", LTYPE0, AFCHS,
  543. "FCLEX", LTYPE0, AFCLEX,
  544. "FCOS", LTYPE0, AFCOS,
  545. "FDECSTP", LTYPE0, AFDECSTP,
  546. "FINCSTP", LTYPE0, AFINCSTP,
  547. "FINIT", LTYPE0, AFINIT,
  548. "FLD1", LTYPE0, AFLD1,
  549. "FLDL2E", LTYPE0, AFLDL2E,
  550. "FLDL2T", LTYPE0, AFLDL2T,
  551. "FLDLG2", LTYPE0, AFLDLG2,
  552. "FLDLN2", LTYPE0, AFLDLN2,
  553. "FLDPI", LTYPE0, AFLDPI,
  554. "FLDZ", LTYPE0, AFLDZ,
  555. "FNOP", LTYPE0, AFNOP,
  556. "FPATAN", LTYPE0, AFPATAN,
  557. "FPREM", LTYPE0, AFPREM,
  558. "FPREM1", LTYPE0, AFPREM1,
  559. "FPTAN", LTYPE0, AFPTAN,
  560. "FRNDINT", LTYPE0, AFRNDINT,
  561. "FSCALE", LTYPE0, AFSCALE,
  562. "FSIN", LTYPE0, AFSIN,
  563. "FSINCOS", LTYPE0, AFSINCOS,
  564. "FSQRT", LTYPE0, AFSQRT,
  565. "FTST", LTYPE0, AFTST,
  566. "FXAM", LTYPE0, AFXAM,
  567. "FXTRACT", LTYPE0, AFXTRACT,
  568. "FYL2X", LTYPE0, AFYL2X,
  569. "FYL2XP1", LTYPE0, AFYL2XP1,
  570. 0
  571. };
  572. void
  573. cinit(void)
  574. {
  575. Sym *s;
  576. int i;
  577. nullgen.sym = S;
  578. nullgen.offset = 0;
  579. if(FPCHIP)
  580. nullgen.dval = 0;
  581. for(i=0; i<sizeof(nullgen.sval); i++)
  582. nullgen.sval[i] = 0;
  583. nullgen.type = D_NONE;
  584. nullgen.index = D_NONE;
  585. nullgen.scale = 0;
  586. nerrors = 0;
  587. iostack = I;
  588. iofree = I;
  589. peekc = IGN;
  590. nhunk = 0;
  591. for(i=0; i<NHASH; i++)
  592. hash[i] = S;
  593. for(i=0; itab[i].name; i++) {
  594. s = slookup(itab[i].name);
  595. if(s->type != LNAME)
  596. yyerror("double initialization %s", itab[i].name);
  597. s->type = itab[i].type;
  598. s->value = itab[i].value;
  599. }
  600. pathname = allocn(pathname, 0, 100);
  601. if(mygetwd(pathname, 99) == 0) {
  602. pathname = allocn(pathname, 100, 900);
  603. if(mygetwd(pathname, 999) == 0)
  604. strcpy(pathname, "/???");
  605. }
  606. }
  607. void
  608. checkscale(int scale)
  609. {
  610. switch(scale) {
  611. case 1:
  612. case 2:
  613. case 4:
  614. case 8:
  615. return;
  616. }
  617. yyerror("scale must be 1248: %d", scale);
  618. }
  619. void
  620. syminit(Sym *s)
  621. {
  622. s->type = LNAME;
  623. s->value = 0;
  624. }
  625. void
  626. cclean(void)
  627. {
  628. Gen2 g2;
  629. g2.from = nullgen;
  630. g2.to = nullgen;
  631. outcode(AEND, &g2);
  632. Bflush(&obuf);
  633. }
  634. void
  635. zname(char *n, int t, int s)
  636. {
  637. Bputc(&obuf, ANAME); /* as(2) */
  638. Bputc(&obuf, ANAME>>8);
  639. Bputc(&obuf, t); /* type */
  640. Bputc(&obuf, s); /* sym */
  641. while(*n) {
  642. Bputc(&obuf, *n);
  643. n++;
  644. }
  645. Bputc(&obuf, 0);
  646. }
  647. void
  648. zaddr(Gen *a, int s)
  649. {
  650. long l;
  651. int i, t;
  652. char *n;
  653. Ieee e;
  654. t = 0;
  655. if(a->index != D_NONE || a->scale != 0)
  656. t |= T_INDEX;
  657. if(a->offset != 0)
  658. t |= T_OFFSET;
  659. if(s != 0)
  660. t |= T_SYM;
  661. switch(a->type) {
  662. default:
  663. t |= T_TYPE;
  664. break;
  665. case D_FCONST:
  666. t |= T_FCONST;
  667. break;
  668. case D_SCONST:
  669. t |= T_SCONST;
  670. break;
  671. case D_NONE:
  672. break;
  673. }
  674. Bputc(&obuf, t);
  675. if(t & T_INDEX) { /* implies index, scale */
  676. Bputc(&obuf, a->index);
  677. Bputc(&obuf, a->scale);
  678. }
  679. if(t & T_OFFSET) { /* implies offset */
  680. l = a->offset;
  681. Bputc(&obuf, l);
  682. Bputc(&obuf, l>>8);
  683. Bputc(&obuf, l>>16);
  684. Bputc(&obuf, l>>24);
  685. }
  686. if(t & T_SYM) /* implies sym */
  687. Bputc(&obuf, s);
  688. if(t & T_FCONST) {
  689. ieeedtod(&e, a->dval);
  690. l = e.l;
  691. Bputc(&obuf, l);
  692. Bputc(&obuf, l>>8);
  693. Bputc(&obuf, l>>16);
  694. Bputc(&obuf, l>>24);
  695. l = e.h;
  696. Bputc(&obuf, l);
  697. Bputc(&obuf, l>>8);
  698. Bputc(&obuf, l>>16);
  699. Bputc(&obuf, l>>24);
  700. return;
  701. }
  702. if(t & T_SCONST) {
  703. n = a->sval;
  704. for(i=0; i<NSNAME; i++) {
  705. Bputc(&obuf, *n);
  706. n++;
  707. }
  708. return;
  709. }
  710. if(t & T_TYPE)
  711. Bputc(&obuf, a->type);
  712. }
  713. void
  714. outcode(int a, Gen2 *g2)
  715. {
  716. int sf, st, t;
  717. Sym *s;
  718. if(pass == 1)
  719. goto out;
  720. jackpot:
  721. sf = 0;
  722. s = g2->from.sym;
  723. while(s != S) {
  724. sf = s->sym;
  725. if(sf < 0 || sf >= NSYM)
  726. sf = 0;
  727. t = g2->from.type;
  728. if(t == D_ADDR)
  729. t = g2->from.index;
  730. if(h[sf].type == t)
  731. if(h[sf].sym == s)
  732. break;
  733. zname(s->name, t, sym);
  734. s->sym = sym;
  735. h[sym].sym = s;
  736. h[sym].type = t;
  737. sf = sym;
  738. sym++;
  739. if(sym >= NSYM)
  740. sym = 1;
  741. break;
  742. }
  743. st = 0;
  744. s = g2->to.sym;
  745. while(s != S) {
  746. st = s->sym;
  747. if(st < 0 || st >= NSYM)
  748. st = 0;
  749. t = g2->to.type;
  750. if(t == D_ADDR)
  751. t = g2->to.index;
  752. if(h[st].type == t)
  753. if(h[st].sym == s)
  754. break;
  755. zname(s->name, t, sym);
  756. s->sym = sym;
  757. h[sym].sym = s;
  758. h[sym].type = t;
  759. st = sym;
  760. sym++;
  761. if(sym >= NSYM)
  762. sym = 1;
  763. if(st == sf)
  764. goto jackpot;
  765. break;
  766. }
  767. Bputc(&obuf, a);
  768. Bputc(&obuf, a>>8);
  769. Bputc(&obuf, lineno);
  770. Bputc(&obuf, lineno>>8);
  771. Bputc(&obuf, lineno>>16);
  772. Bputc(&obuf, lineno>>24);
  773. zaddr(&g2->from, sf);
  774. zaddr(&g2->to, st);
  775. out:
  776. if(a != AGLOBL && a != ADATA)
  777. pc++;
  778. }
  779. void
  780. outhist(void)
  781. {
  782. Gen g;
  783. Hist *h;
  784. char *p, *q, *op, c;
  785. int n;
  786. g = nullgen;
  787. c = pathchar();
  788. for(h = hist; h != H; h = h->link) {
  789. p = h->name;
  790. op = 0;
  791. /* on windows skip drive specifier in pathname */
  792. if(systemtype(Windows) && p && p[1] == ':'){
  793. p += 2;
  794. c = *p;
  795. }
  796. if(p && p[0] != c && h->offset == 0 && pathname){
  797. /* on windows skip drive specifier in pathname */
  798. if(systemtype(Windows) && pathname[1] == ':') {
  799. op = p;
  800. p = pathname+2;
  801. c = *p;
  802. } else if(pathname[0] == c){
  803. op = p;
  804. p = pathname;
  805. }
  806. }
  807. while(p) {
  808. q = strchr(p, c);
  809. if(q) {
  810. n = q-p;
  811. if(n == 0){
  812. n = 1; /* leading "/" */
  813. *p = '/'; /* don't emit "\" on windows */
  814. }
  815. q++;
  816. } else {
  817. n = strlen(p);
  818. q = 0;
  819. }
  820. if(n) {
  821. Bputc(&obuf, ANAME);
  822. Bputc(&obuf, ANAME>>8);
  823. Bputc(&obuf, D_FILE); /* type */
  824. Bputc(&obuf, 1); /* sym */
  825. Bputc(&obuf, '<');
  826. Bwrite(&obuf, p, n);
  827. Bputc(&obuf, 0);
  828. }
  829. p = q;
  830. if(p == 0 && op) {
  831. p = op;
  832. op = 0;
  833. }
  834. }
  835. g.offset = h->offset;
  836. Bputc(&obuf, AHISTORY);
  837. Bputc(&obuf, AHISTORY>>8);
  838. Bputc(&obuf, h->line);
  839. Bputc(&obuf, h->line>>8);
  840. Bputc(&obuf, h->line>>16);
  841. Bputc(&obuf, h->line>>24);
  842. zaddr(&nullgen, 0);
  843. zaddr(&g, 0);
  844. }
  845. }
  846. #include "../cc/lexbody"
  847. #include "../cc/macbody"
  848. #include "../cc/compat"