lex.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. #define EXTERN
  2. #include "a.h"
  3. #include "y.tab.h"
  4. #include <ctype.h>
  5. void
  6. main(int argc, char *argv[])
  7. {
  8. char *p;
  9. int nout, nproc, status, i, c;
  10. thechar = '9';
  11. thestring = "power64";
  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) {
  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. if(p = strrchr(ofile, pathchar())) {
  93. include[0] = ofile;
  94. *p++ = 0;
  95. } else
  96. p = ofile;
  97. if(outfile == 0) {
  98. outfile = p;
  99. if(p = strrchr(outfile, '.'))
  100. if(p[1] == 's' && p[2] == 0)
  101. p[0] = 0;
  102. p = strrchr(outfile, 0);
  103. p[0] = '.';
  104. p[1] = thechar;
  105. p[2] = 0;
  106. }
  107. p = getenv("INCLUDE");
  108. if(p) {
  109. setinclude(p);
  110. } else {
  111. if(systemtype(Plan9)) {
  112. sprint(incfile,"/%s/include", thestring);
  113. setinclude(strdup(incfile));
  114. }
  115. }
  116. of = mycreat(outfile, 0664);
  117. if(of < 0) {
  118. yyerror("%ca: cannot create %s", thechar, outfile);
  119. errorexit();
  120. }
  121. Binit(&obuf, of, OWRITE);
  122. pass = 1;
  123. nosched = 0;
  124. pinit(file);
  125. for(i=0; i<nDlist; i++)
  126. dodefine(Dlist[i]);
  127. yyparse();
  128. if(nerrors) {
  129. cclean();
  130. return nerrors;
  131. }
  132. pass = 2;
  133. nosched = 0;
  134. outhist();
  135. pinit(file);
  136. for(i=0; i<nDlist; i++)
  137. dodefine(Dlist[i]);
  138. yyparse();
  139. cclean();
  140. return nerrors;
  141. }
  142. struct
  143. {
  144. char *name;
  145. ushort type;
  146. ushort value;
  147. } itab[] =
  148. {
  149. "SP", LSP, D_AUTO,
  150. "SB", LSB, D_EXTERN,
  151. "FP", LFP, D_PARAM,
  152. "PC", LPC, D_BRANCH,
  153. "LR", LLR, D_LR,
  154. "CTR", LCTR, D_CTR,
  155. "XER", LSPREG, D_XER,
  156. "MSR", LMSR, D_MSR,
  157. "FPSCR", LFPSCR, D_FPSCR,
  158. "SPR", LSPR, D_SPR,
  159. "DCR", LSPR, D_DCR,
  160. "CR", LCR, 0,
  161. "CR0", LCREG, 0,
  162. "CR1", LCREG, 1,
  163. "CR2", LCREG, 2,
  164. "CR3", LCREG, 3,
  165. "CR4", LCREG, 4,
  166. "CR5", LCREG, 5,
  167. "CR6", LCREG, 6,
  168. "CR7", LCREG, 7,
  169. "R", LR, 0,
  170. "R0", LREG, 0,
  171. "R1", LREG, 1,
  172. "R2", LREG, 2,
  173. "R3", LREG, 3,
  174. "R4", LREG, 4,
  175. "R5", LREG, 5,
  176. "R6", LREG, 6,
  177. "R7", LREG, 7,
  178. "R8", LREG, 8,
  179. "R9", LREG, 9,
  180. "R10", LREG, 10,
  181. "R11", LREG, 11,
  182. "R12", LREG, 12,
  183. "R13", LREG, 13,
  184. "R14", LREG, 14,
  185. "R15", LREG, 15,
  186. "R16", LREG, 16,
  187. "R17", LREG, 17,
  188. "R18", LREG, 18,
  189. "R19", LREG, 19,
  190. "R20", LREG, 20,
  191. "R21", LREG, 21,
  192. "R22", LREG, 22,
  193. "R23", LREG, 23,
  194. "R24", LREG, 24,
  195. "R25", LREG, 25,
  196. "R26", LREG, 26,
  197. "R27", LREG, 27,
  198. "R28", LREG, 28,
  199. "R29", LREG, 29,
  200. "R30", LREG, 30,
  201. "R31", LREG, 31,
  202. "F", LF, 0,
  203. "F0", LFREG, 0,
  204. "F1", LFREG, 1,
  205. "F2", LFREG, 2,
  206. "F3", LFREG, 3,
  207. "F4", LFREG, 4,
  208. "F5", LFREG, 5,
  209. "F6", LFREG, 6,
  210. "F7", LFREG, 7,
  211. "F8", LFREG, 8,
  212. "F9", LFREG, 9,
  213. "F10", LFREG, 10,
  214. "F11", LFREG, 11,
  215. "F12", LFREG, 12,
  216. "F13", LFREG, 13,
  217. "F14", LFREG, 14,
  218. "F15", LFREG, 15,
  219. "F16", LFREG, 16,
  220. "F17", LFREG, 17,
  221. "F18", LFREG, 18,
  222. "F19", LFREG, 19,
  223. "F20", LFREG, 20,
  224. "F21", LFREG, 21,
  225. "F22", LFREG, 22,
  226. "F23", LFREG, 23,
  227. "F24", LFREG, 24,
  228. "F25", LFREG, 25,
  229. "F26", LFREG, 26,
  230. "F27", LFREG, 27,
  231. "F28", LFREG, 28,
  232. "F29", LFREG, 29,
  233. "F30", LFREG, 30,
  234. "F31", LFREG, 31,
  235. "CREQV", LCROP, ACREQV,
  236. "CRXOR", LCROP, ACRXOR,
  237. "CRAND", LCROP, ACRAND,
  238. "CROR", LCROP, ACROR,
  239. "CRANDN", LCROP, ACRANDN,
  240. "CRORN", LCROP, ACRORN,
  241. "CRNAND", LCROP, ACRNAND,
  242. "CRNOR", LCROP, ACRNOR,
  243. "ADD", LADDW, AADD,
  244. "ADDV", LADDW, AADDV,
  245. "ADDCC", LADDW, AADDCC,
  246. "ADDVCC", LADDW, AADDVCC,
  247. "ADDC", LADDW, AADDC,
  248. "ADDCV", LADDW, AADDCV,
  249. "ADDCCC", LADDW, AADDCCC,
  250. "ADDCVCC", LADDW, AADDCVCC,
  251. "ADDE", LLOGW, AADDE,
  252. "ADDEV", LLOGW, AADDEV,
  253. "ADDECC", LLOGW, AADDECC,
  254. "ADDEVCC", LLOGW, AADDEVCC,
  255. "ADDME", LABS, AADDME,
  256. "ADDMEV", LABS, AADDMEV,
  257. "ADDMECC", LABS, AADDMECC,
  258. "ADDMEVCC", LABS, AADDMEVCC,
  259. "ADDZE", LABS, AADDZE,
  260. "ADDZEV", LABS, AADDZEV,
  261. "ADDZECC", LABS, AADDZECC,
  262. "ADDZEVCC", LABS, AADDZEVCC,
  263. "SUB", LADDW, ASUB,
  264. "SUBV", LADDW, ASUBV,
  265. "SUBCC", LADDW, ASUBCC,
  266. "SUBVCC", LADDW, ASUBVCC,
  267. "SUBE", LLOGW, ASUBE,
  268. "SUBECC", LLOGW, ASUBECC,
  269. "SUBEV", LLOGW, ASUBEV,
  270. "SUBEVCC", LLOGW, ASUBEVCC,
  271. "SUBC", LADDW, ASUBC,
  272. "SUBCCC", LADDW, ASUBCCC,
  273. "SUBCV", LADDW, ASUBCV,
  274. "SUBCVCC", LADDW, ASUBCVCC,
  275. "SUBME", LABS, ASUBME,
  276. "SUBMEV", LABS, ASUBMEV,
  277. "SUBMECC", LABS, ASUBMECC,
  278. "SUBMEVCC", LABS, ASUBMEVCC,
  279. "SUBZE", LABS, ASUBZE,
  280. "SUBZEV", LABS, ASUBZEV,
  281. "SUBZECC", LABS, ASUBZECC,
  282. "SUBZEVCC", LABS, ASUBZEVCC,
  283. "AND", LADDW, AAND,
  284. "ANDCC", LADDW, AANDCC, /* includes andil & andiu */
  285. "ANDN", LLOGW, AANDN,
  286. "ANDNCC", LLOGW, AANDNCC,
  287. "EQV", LLOGW, AEQV,
  288. "EQVCC", LLOGW, AEQVCC,
  289. "NAND", LLOGW, ANAND,
  290. "NANDCC", LLOGW, ANANDCC,
  291. "NOR", LLOGW, ANOR,
  292. "NORCC", LLOGW, ANORCC,
  293. "OR", LADDW, AOR, /* includes oril & oriu */
  294. "ORCC", LADDW, AORCC,
  295. "ORN", LLOGW, AORN,
  296. "ORNCC", LLOGW, AORNCC,
  297. "XOR", LADDW, AXOR, /* includes xoril & xoriu */
  298. "XORCC", LLOGW, AXORCC,
  299. "EXTSB", LABS, AEXTSB,
  300. "EXTSBCC", LABS, AEXTSBCC,
  301. "EXTSH", LABS, AEXTSH,
  302. "EXTSHCC", LABS, AEXTSHCC,
  303. "CNTLZW", LABS, ACNTLZW,
  304. "CNTLZWCC", LABS, ACNTLZWCC,
  305. "RLWMI", LRLWM, ARLWMI,
  306. "RLWMICC", LRLWM, ARLWMICC,
  307. "RLWNM", LRLWM, ARLWNM,
  308. "RLWNMCC", LRLWM, ARLWNMCC,
  309. "SLW", LSHW, ASLW,
  310. "SLWCC", LSHW, ASLWCC,
  311. "SRW", LSHW, ASRW,
  312. "SRWCC", LSHW, ASRWCC,
  313. "SRAW", LSHW, ASRAW,
  314. "SRAWCC", LSHW, ASRAWCC,
  315. "BR", LBRA, ABR,
  316. "BC", LBRA, ABC,
  317. "BCL", LBRA, ABC,
  318. "BL", LBRA, ABL,
  319. "BEQ", LBRA, ABEQ,
  320. "BNE", LBRA, ABNE,
  321. "BGT", LBRA, ABGT,
  322. "BGE", LBRA, ABGE,
  323. "BLT", LBRA, ABLT,
  324. "BLE", LBRA, ABLE,
  325. "BVC", LBRA, ABVC,
  326. "BVS", LBRA, ABVS,
  327. "CMP", LCMP, ACMP,
  328. "CMPU", LCMP, ACMPU,
  329. "DIVW", LLOGW, ADIVW,
  330. "DIVWV", LLOGW, ADIVWV,
  331. "DIVWCC", LLOGW, ADIVWCC,
  332. "DIVWVCC", LLOGW, ADIVWVCC,
  333. "DIVWU", LLOGW, ADIVWU,
  334. "DIVWUV", LLOGW, ADIVWUV,
  335. "DIVWUCC", LLOGW, ADIVWUCC,
  336. "DIVWUVCC", LLOGW, ADIVWUVCC,
  337. "FABS", LFCONV, AFABS,
  338. "FABSCC", LFCONV, AFABSCC,
  339. "FNEG", LFCONV, AFNEG,
  340. "FNEGCC", LFCONV, AFNEGCC,
  341. "FNABS", LFCONV, AFNABS,
  342. "FNABSCC", LFCONV, AFNABSCC,
  343. "FADD", LFADD, AFADD,
  344. "FADDCC", LFADD, AFADDCC,
  345. "FSUB", LFADD, AFSUB,
  346. "FSUBCC", LFADD, AFSUBCC,
  347. "FMUL", LFADD, AFMUL,
  348. "FMULCC", LFADD, AFMULCC,
  349. "FDIV", LFADD, AFDIV,
  350. "FDIVCC", LFADD, AFDIVCC,
  351. "FRSP", LFCONV, AFRSP,
  352. "FRSPCC", LFCONV, AFRSPCC,
  353. "FCTIW", LFCONV, AFCTIW,
  354. "FCTIWCC", LFCONV, AFCTIWCC,
  355. "FCTIWZ", LFCONV, AFCTIWZ,
  356. "FCTIWZCC", LFCONV, AFCTIWZCC,
  357. "FMADD", LFMA, AFMADD,
  358. "FMADDCC", LFMA, AFMADDCC,
  359. "FMSUB", LFMA, AFMSUB,
  360. "FMSUBCC", LFMA, AFMSUBCC,
  361. "FNMADD", LFMA, AFNMADD,
  362. "FNMADDCC", LFMA, AFNMADDCC,
  363. "FNMSUB", LFMA, AFNMSUB,
  364. "FNMSUBCC", LFMA, AFNMSUBCC,
  365. "FMADDS", LFMA, AFMADDS,
  366. "FMADDSCC", LFMA, AFMADDSCC,
  367. "FMSUBS", LFMA, AFMSUBS,
  368. "FMSUBSCC", LFMA, AFMSUBSCC,
  369. "FNMADDS", LFMA, AFNMADDS,
  370. "FNMADDSCC", LFMA, AFNMADDSCC,
  371. "FNMSUBS", LFMA, AFNMSUBS,
  372. "FNMSUBSCC", LFMA, AFNMSUBSCC,
  373. "FCMPU", LFCMP, AFCMPU,
  374. "FCMPO", LFCMP, AFCMPO,
  375. "MTFSB0", LMTFSB, AMTFSB0,
  376. "MTFSB1", LMTFSB, AMTFSB1,
  377. "FMOVD", LFMOV, AFMOVD,
  378. "FMOVS", LFMOV, AFMOVS,
  379. "FMOVDCC", LFCONV, AFMOVDCC, /* fmr. */
  380. "GLOBL", LTEXT, AGLOBL,
  381. "MOVB", LMOVB, AMOVB,
  382. "MOVBZ", LMOVB, AMOVBZ,
  383. "MOVBU", LMOVB, AMOVBU,
  384. "MOVBZU", LMOVB, AMOVBZU,
  385. "MOVH", LMOVB, AMOVH,
  386. "MOVHZ", LMOVB, AMOVHZ,
  387. "MOVHU", LMOVB, AMOVHU,
  388. "MOVHZU", LMOVB, AMOVHZU,
  389. "MOVHBR", LXMV, AMOVHBR,
  390. "MOVWBR", LXMV, AMOVWBR,
  391. "MOVW", LMOVW, AMOVW,
  392. "MOVWU", LMOVW, AMOVWU,
  393. "MOVMW", LMOVMW, AMOVMW,
  394. "MOVFL", LMOVW, AMOVFL,
  395. "MULLW", LADDW, AMULLW, /* includes multiply immediate 10-139 */
  396. "MULLWV", LLOGW, AMULLWV,
  397. "MULLWCC", LLOGW, AMULLWCC,
  398. "MULLWVCC", LLOGW, AMULLWVCC,
  399. "MULHW", LLOGW, AMULHW,
  400. "MULHWCC", LLOGW, AMULHWCC,
  401. "MULHWU", LLOGW, AMULHWU,
  402. "MULHWUCC", LLOGW, AMULHWUCC,
  403. "NEG", LABS, ANEG,
  404. "NEGV", LABS, ANEGV,
  405. "NEGCC", LABS, ANEGCC,
  406. "NEGVCC", LABS, ANEGVCC,
  407. "NOP", LNOP, ANOP, /* ori 0,0,0 */
  408. "SYSCALL", LNOP, ASYSCALL,
  409. "RETURN", LRETRN, ARETURN,
  410. "RFI", LRETRN, ARFI,
  411. "RFCI", LRETRN, ARFCI,
  412. "DATA", LDATA, ADATA,
  413. "END", LEND, AEND,
  414. "TEXT", LTEXT, ATEXT,
  415. /* 64-bit instructions */
  416. "CNTLZD", LABS, ACNTLZD,
  417. "CNTLZDCC", LABS, ACNTLZDCC,
  418. "DIVD", LLOGW, ADIVD,
  419. "DIVDCC", LLOGW, ADIVDCC,
  420. "DIVDVCC", LLOGW, ADIVDVCC,
  421. "DIVDV", LLOGW, ADIVDV,
  422. "DIVDU", LLOGW, ADIVDU,
  423. "DIVDUCC", LLOGW, ADIVDUCC,
  424. "DIVDUVCC", LLOGW, ADIVDUVCC,
  425. "DIVDUV", LLOGW, ADIVDUV,
  426. "EXTSW", LABS, AEXTSW,
  427. "EXTSWCC", LABS, AEXTSWCC,
  428. "FCTID", LFCONV, AFCTID,
  429. "FCTIDCC", LFCONV, AFCTIDCC,
  430. "FCTIDZ", LFCONV, AFCTIDZ,
  431. "FCTIDZCC", LFCONV, AFCTIDZCC,
  432. "FCFID", LFCONV, AFCFID,
  433. "FCFIDCC", LFCONV, AFCFIDCC,
  434. "LDAR", LXLD, ALDAR,
  435. "MOVD", LMOVW, AMOVD,
  436. "MOVDU", LMOVW, AMOVDU,
  437. "MOVWZ", LMOVW, AMOVWZ,
  438. "MOVWZU", LMOVW, AMOVWZU,
  439. "MULHD", LLOGW, AMULHD,
  440. "MULHDCC", LLOGW, AMULHDCC,
  441. "MULHDU", LLOGW, AMULHDU,
  442. "MULHDUCC", LLOGW, AMULHDUCC,
  443. "MULLD", LADDW, AMULLD, /* includes multiply immediate? */
  444. "MULLDCC", LLOGW, AMULLDCC,
  445. "MULLDVCC", LLOGW, AMULLDVCC,
  446. "MULLDV", LLOGW, AMULLDV,
  447. "RFID", LRETRN, ARFID,
  448. "HRFID", LRETRN, AHRFID,
  449. "RLDMI", LRLWM, ARLDMI,
  450. "RLDMICC", LRLWM, ARLDMICC,
  451. "RLDC", LRLWM, ARLDC,
  452. "RLDCCC", LRLWM, ARLDCCC,
  453. "RLDCR", LRLWM, ARLDCR,
  454. "RLDCRCC", LRLWM, ARLDCRCC,
  455. "RLDCL", LRLWM, ARLDCL,
  456. "RLDCLCC", LRLWM, ARLDCLCC,
  457. "SLBIA", LNOP, ASLBIA,
  458. "SLBIE", LNOP, ASLBIE,
  459. "SLBMFEE", LABS, ASLBMFEE,
  460. "SLBMFEV", LABS, ASLBMFEV,
  461. "SLBMTE", LABS, ASLBMTE,
  462. "SLD", LSHW, ASLD,
  463. "SLDCC", LSHW, ASLDCC,
  464. "SRD", LSHW, ASRD,
  465. "SRAD", LSHW, ASRAD,
  466. "SRADCC", LSHW, ASRADCC,
  467. "SRDCC", LSHW, ASRDCC,
  468. "STDCCC", LXST, ASTDCCC,
  469. "TD", LADDW, ATD,
  470. /* pseudo instructions */
  471. "REM", LLOGW, AREM,
  472. "REMCC", LLOGW, AREMCC,
  473. "REMV", LLOGW, AREMV,
  474. "REMVCC", LLOGW, AREMVCC,
  475. "REMU", LLOGW, AREMU,
  476. "REMUCC", LLOGW, AREMUCC,
  477. "REMUV", LLOGW, AREMUV,
  478. "REMUVCC", LLOGW, AREMUVCC,
  479. "REMD", LLOGW, AREMD,
  480. "REMDCC", LLOGW, AREMDCC,
  481. "REMDV", LLOGW, AREMDV,
  482. "REMDVCC", LLOGW, AREMDVCC,
  483. "REMDU", LLOGW, AREMDU,
  484. "REMDUCC", LLOGW, AREMDUCC,
  485. "REMDUV", LLOGW, AREMDUV,
  486. "REMDUVCC", LLOGW, AREMDUVCC,
  487. /* special instructions */
  488. "DCBF", LXOP, ADCBF,
  489. "DCBI", LXOP, ADCBI,
  490. "DCBST", LXOP, ADCBST,
  491. "DCBT", LXOP, ADCBT,
  492. "DCBTST", LXOP, ADCBTST,
  493. "DCBZ", LXOP, ADCBZ,
  494. "ICBI", LXOP, AICBI,
  495. "ECIWX", LXLD, AECIWX,
  496. "ECOWX", LXST, AECOWX,
  497. "LWAR", LXLD, ALWAR,
  498. "LWAR", LXLD, ALWAR,
  499. "STWCCC", LXST, ASTWCCC,
  500. "EIEIO", LRETRN, AEIEIO,
  501. "TLBIE", LNOP, ATLBIE,
  502. "TLBIEL", LNOP, ATLBIEL,
  503. "LSW", LXLD, ALSW,
  504. "STSW", LXST, ASTSW,
  505. "ISYNC", LRETRN, AISYNC,
  506. "SYNC", LRETRN, ASYNC,
  507. "TLBSYNC", LRETRN, ATLBSYNC,
  508. "PTESYNC", LRETRN, APTESYNC,
  509. /* "TW", LADDW, ATW,*/
  510. "WORD", LWORD, AWORD,
  511. "DWORD", LWORD, ADWORD,
  512. "SCHED", LSCHED, 0,
  513. "NOSCHED", LSCHED, 0x80,
  514. 0
  515. };
  516. void
  517. cinit(void)
  518. {
  519. Sym *s;
  520. int i;
  521. nullgen.sym = S;
  522. nullgen.offset = 0;
  523. nullgen.type = D_NONE;
  524. nullgen.name = D_NONE;
  525. nullgen.reg = NREG;
  526. nullgen.xreg = NREG;
  527. if(FPCHIP)
  528. nullgen.dval = 0;
  529. for(i=0; i<sizeof(nullgen.sval); i++)
  530. nullgen.sval[i] = 0;
  531. nerrors = 0;
  532. iostack = I;
  533. iofree = I;
  534. peekc = IGN;
  535. nhunk = 0;
  536. for(i=0; i<NHASH; i++)
  537. hash[i] = S;
  538. for(i=0; itab[i].name; i++) {
  539. s = slookup(itab[i].name);
  540. s->type = itab[i].type;
  541. s->value = itab[i].value;
  542. }
  543. ALLOCN(pathname, 0, 100);
  544. if(mygetwd(pathname, 99) == 0) {
  545. ALLOCN(pathname, 100, 900);
  546. if(mygetwd(pathname, 999) == 0)
  547. strcpy(pathname, "/???");
  548. }
  549. }
  550. void
  551. syminit(Sym *s)
  552. {
  553. s->type = LNAME;
  554. s->value = 0;
  555. }
  556. void
  557. cclean(void)
  558. {
  559. outcode(AEND, &nullgen, NREG, &nullgen);
  560. Bflush(&obuf);
  561. }
  562. void
  563. zname(char *n, int t, int s)
  564. {
  565. Bputc(&obuf, ANAME);
  566. Bputc(&obuf, ANAME>>8);
  567. Bputc(&obuf, t); /* type */
  568. Bputc(&obuf, s); /* sym */
  569. while(*n) {
  570. Bputc(&obuf, *n);
  571. n++;
  572. }
  573. Bputc(&obuf, 0);
  574. }
  575. void
  576. zaddr(Gen *a, int s)
  577. {
  578. long l;
  579. int i;
  580. char *n;
  581. Ieee e;
  582. if(a->type == D_CONST){
  583. l = a->offset;
  584. if((vlong)l != a->offset)
  585. a->type = D_DCONST;
  586. }
  587. Bputc(&obuf, a->type);
  588. Bputc(&obuf, a->reg);
  589. Bputc(&obuf, s);
  590. Bputc(&obuf, a->name);
  591. switch(a->type) {
  592. default:
  593. print("unknown type %d\n", a->type);
  594. exits("arg");
  595. case D_NONE:
  596. case D_REG:
  597. case D_FREG:
  598. case D_CREG:
  599. case D_FPSCR:
  600. case D_MSR:
  601. case D_OPT:
  602. break;
  603. case D_DCR:
  604. case D_SPR:
  605. case D_OREG:
  606. case D_CONST:
  607. case D_BRANCH:
  608. l = a->offset;
  609. Bputc(&obuf, l);
  610. Bputc(&obuf, l>>8);
  611. Bputc(&obuf, l>>16);
  612. Bputc(&obuf, l>>24);
  613. break;
  614. case D_DCONST:
  615. l = a->offset;
  616. Bputc(&obuf, l);
  617. Bputc(&obuf, l>>8);
  618. Bputc(&obuf, l>>16);
  619. Bputc(&obuf, l>>24);
  620. l = a->offset>>32;
  621. Bputc(&obuf, l);
  622. Bputc(&obuf, l>>8);
  623. Bputc(&obuf, l>>16);
  624. Bputc(&obuf, l>>24);
  625. break;
  626. case D_SCONST:
  627. n = a->sval;
  628. for(i=0; i<NSNAME; i++) {
  629. Bputc(&obuf, *n);
  630. n++;
  631. }
  632. break;
  633. case D_FCONST:
  634. ieeedtod(&e, a->dval);
  635. Bputc(&obuf, e.l);
  636. Bputc(&obuf, e.l>>8);
  637. Bputc(&obuf, e.l>>16);
  638. Bputc(&obuf, e.l>>24);
  639. Bputc(&obuf, e.h);
  640. Bputc(&obuf, e.h>>8);
  641. Bputc(&obuf, e.h>>16);
  642. Bputc(&obuf, e.h>>24);
  643. break;
  644. }
  645. }
  646. int
  647. outsim(Gen *g)
  648. {
  649. Sym *s;
  650. int sno, t;
  651. s = g->sym;
  652. if(s == S)
  653. return 0;
  654. sno = s->sym;
  655. if(sno < 0 || sno >= NSYM)
  656. sno = 0;
  657. t = g->name;
  658. if(h[sno].type == t && h[sno].sym == s)
  659. return sno;
  660. zname(s->name, t, sym);
  661. s->sym = sym;
  662. h[sym].sym = s;
  663. h[sym].type = t;
  664. sno = sym;
  665. sym++;
  666. if(sym >= NSYM)
  667. sym = 1;
  668. return sno;
  669. }
  670. void
  671. outcode(int a, Gen *g1, int reg, Gen *g2)
  672. {
  673. int sf, st;
  674. if(a != AGLOBL && a != ADATA)
  675. pc++;
  676. if(pass == 1)
  677. return;
  678. if(g1->xreg != NREG) {
  679. if(reg != NREG || g2->xreg != NREG)
  680. yyerror("bad addressing modes");
  681. reg = g1->xreg;
  682. } else
  683. if(g2->xreg != NREG) {
  684. if(reg != NREG)
  685. yyerror("bad addressing modes");
  686. reg = g2->xreg;
  687. }
  688. do {
  689. sf = outsim(g1);
  690. st = outsim(g2);
  691. } while(sf != 0 && st == sf);
  692. Bputc(&obuf, a);
  693. Bputc(&obuf, a>>8);
  694. Bputc(&obuf, reg|nosched);
  695. Bputc(&obuf, lineno);
  696. Bputc(&obuf, lineno>>8);
  697. Bputc(&obuf, lineno>>16);
  698. Bputc(&obuf, lineno>>24);
  699. zaddr(g1, sf);
  700. zaddr(g2, st);
  701. }
  702. void
  703. outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
  704. {
  705. int s1, s2, s3, flag;
  706. if(a != AGLOBL && a != ADATA)
  707. pc++;
  708. if(pass == 1)
  709. return;
  710. do {
  711. s1 = outsim(g1);
  712. s2 = outsim(g2);
  713. s3 = outsim(g3);
  714. } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
  715. flag = 0;
  716. if(g2->type != D_NONE)
  717. flag = 0x40; /* flags extra operand */
  718. Bputc(&obuf, a);
  719. Bputc(&obuf, a>>8);
  720. Bputc(&obuf, reg | nosched | flag);
  721. Bputc(&obuf, lineno);
  722. Bputc(&obuf, lineno>>8);
  723. Bputc(&obuf, lineno>>16);
  724. Bputc(&obuf, lineno>>24);
  725. zaddr(g1, s1);
  726. if(flag)
  727. zaddr(g2, s2);
  728. zaddr(g3, s3);
  729. }
  730. void
  731. outhist(void)
  732. {
  733. Gen g;
  734. Hist *h;
  735. char *p, *q, *op, c;
  736. int n;
  737. g = nullgen;
  738. c = pathchar();
  739. for(h = hist; h != H; h = h->link) {
  740. p = h->name;
  741. op = 0;
  742. /* on windows skip drive specifier in pathname */
  743. if(systemtype(Windows) && p && p[1] == ':'){
  744. p += 2;
  745. c = *p;
  746. }
  747. if(p && p[0] != c && h->offset == 0 && pathname){
  748. /* on windows skip drive specifier in pathname */
  749. if(systemtype(Windows) && pathname[1] == ':') {
  750. op = p;
  751. p = pathname+2;
  752. c = *p;
  753. } else if(pathname[0] == c){
  754. op = p;
  755. p = pathname;
  756. }
  757. }
  758. while(p) {
  759. q = strchr(p, c);
  760. if(q) {
  761. n = q-p;
  762. if(n == 0){
  763. n = 1; /* leading "/" */
  764. *p = '/'; /* don't emit "\" on windows */
  765. }
  766. q++;
  767. } else {
  768. n = strlen(p);
  769. q = 0;
  770. }
  771. if(n) {
  772. Bputc(&obuf, ANAME);
  773. Bputc(&obuf, ANAME>>8);
  774. Bputc(&obuf, D_FILE); /* type */
  775. Bputc(&obuf, 1); /* sym */
  776. Bputc(&obuf, '<');
  777. Bwrite(&obuf, p, n);
  778. Bputc(&obuf, 0);
  779. }
  780. p = q;
  781. if(p == 0 && op) {
  782. p = op;
  783. op = 0;
  784. }
  785. }
  786. g.offset = h->offset;
  787. Bputc(&obuf, AHISTORY);
  788. Bputc(&obuf, AHISTORY>>8);
  789. Bputc(&obuf, 0);
  790. Bputc(&obuf, h->line);
  791. Bputc(&obuf, h->line>>8);
  792. Bputc(&obuf, h->line>>16);
  793. Bputc(&obuf, h->line>>24);
  794. zaddr(&nullgen, 0);
  795. zaddr(&g, 0);
  796. }
  797. }
  798. #include "../cc/lexbody"
  799. #include "../cc/macbody"
  800. #include "../cc/compat"