lex.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ctype.h>
  4. #include <bio.h>
  5. #include "../qc/q.out.h"
  6. #include "a.h"
  7. #include "y.tab.h"
  8. void
  9. main(int argc, char *argv[])
  10. {
  11. char *p;
  12. int nout, nproc, status, i, c;
  13. thechar = 'q';
  14. thestring = "power";
  15. memset(debug, 0, sizeof(debug));
  16. cinit();
  17. outfile = 0;
  18. include[ninclude++] = ".";
  19. ARGBEGIN {
  20. default:
  21. c = ARGC();
  22. if(c >= 0 || c < sizeof(debug))
  23. debug[c] = 1;
  24. break;
  25. case 'o':
  26. outfile = ARGF();
  27. break;
  28. case 'D':
  29. p = ARGF();
  30. if(p)
  31. Dlist[nDlist++] = p;
  32. break;
  33. case 'I':
  34. p = ARGF();
  35. setinclude(p);
  36. break;
  37. } ARGEND
  38. if(*argv == 0) {
  39. print("usage: %ca [-options] file.s\n", thechar);
  40. errorexit();
  41. }
  42. if(argc > 1 && systemtype(Windows)){
  43. print("can't assemble multiple files on windows\n");
  44. errorexit();
  45. }
  46. if(argc > 1 && !systemtype(Windows)) {
  47. nproc = 1;
  48. if(p = getenv("NPROC"))
  49. nproc = atol(p); /* */
  50. c = 0;
  51. nout = 0;
  52. for(;;) {
  53. while(nout < nproc && argc > 0) {
  54. i = myfork();
  55. if(i < 0) {
  56. i = mywait(&status);
  57. if(i < 0)
  58. errorexit();
  59. if(status)
  60. c++;
  61. nout--;
  62. continue;
  63. }
  64. if(i == 0) {
  65. print("%s:\n", *argv);
  66. if(assemble(*argv))
  67. errorexit();
  68. exits(0);
  69. }
  70. nout++;
  71. argc--;
  72. argv++;
  73. }
  74. i = mywait(&status);
  75. if(i < 0) {
  76. if(c)
  77. errorexit();
  78. exits(0);
  79. }
  80. if(status)
  81. c++;
  82. nout--;
  83. }
  84. }
  85. if(assemble(argv[0]))
  86. errorexit();
  87. exits(0);
  88. }
  89. int
  90. assemble(char *file)
  91. {
  92. char ofile[100], incfile[20], *p;
  93. int i, of;
  94. strcpy(ofile, file);
  95. p = utfrrune(ofile, pathchar());
  96. if(p) {
  97. include[0] = ofile;
  98. *p++ = 0;
  99. } else
  100. p = ofile;
  101. if(outfile == 0) {
  102. outfile = p;
  103. if(outfile){
  104. p = utfrrune(outfile, '.');
  105. if(p)
  106. if(p[1] == 's' && p[2] == 0)
  107. p[0] = 0;
  108. p = utfrune(outfile, 0);
  109. p[0] = '.';
  110. p[1] = thechar;
  111. p[2] = 0;
  112. } else
  113. outfile = "/dev/null";
  114. }
  115. p = getenv("INCLUDE");
  116. if(p) {
  117. setinclude(p);
  118. } else {
  119. if(systemtype(Plan9)) {
  120. sprint(incfile,"/%s/include", thestring);
  121. setinclude(strdup(incfile));
  122. }
  123. }
  124. of = mycreat(outfile, 0664);
  125. if(of < 0) {
  126. yyerror("%ca: cannot create %s", thechar, outfile);
  127. errorexit();
  128. }
  129. Binit(&obuf, of, OWRITE);
  130. pass = 1;
  131. pinit(file);
  132. for(i=0; i<nDlist; i++)
  133. dodefine(Dlist[i]);
  134. yyparse();
  135. if(nerrors) {
  136. cclean();
  137. return nerrors;
  138. }
  139. pass = 2;
  140. outhist();
  141. pinit(file);
  142. for(i=0; i<nDlist; i++)
  143. dodefine(Dlist[i]);
  144. yyparse();
  145. cclean();
  146. return nerrors;
  147. }
  148. struct
  149. {
  150. char *name;
  151. ushort type;
  152. ushort value;
  153. } itab[] =
  154. {
  155. "SP", LSP, D_AUTO,
  156. "SB", LSB, D_EXTERN,
  157. "FP", LFP, D_PARAM,
  158. "PC", LPC, D_BRANCH,
  159. "LR", LLR, D_LR,
  160. "CTR", LCTR, D_CTR,
  161. "XER", LSPREG, D_XER,
  162. "MSR", LMSR, D_MSR,
  163. "FPSCR", LFPSCR, D_FPSCR,
  164. "SPR", LSPR, D_SPR,
  165. "SEG", LSEG, D_SREG,
  166. "CR", LCR, 0,
  167. "CR0", LCREG, 0,
  168. "CR1", LCREG, 1,
  169. "CR2", LCREG, 2,
  170. "CR3", LCREG, 3,
  171. "CR4", LCREG, 4,
  172. "CR5", LCREG, 5,
  173. "CR6", LCREG, 6,
  174. "CR7", LCREG, 7,
  175. "R", LR, 0,
  176. "R0", LREG, 0,
  177. "R1", LREG, 1,
  178. "R2", LREG, 2,
  179. "R3", LREG, 3,
  180. "R4", LREG, 4,
  181. "R5", LREG, 5,
  182. "R6", LREG, 6,
  183. "R7", LREG, 7,
  184. "R8", LREG, 8,
  185. "R9", LREG, 9,
  186. "R10", LREG, 10,
  187. "R11", LREG, 11,
  188. "R12", LREG, 12,
  189. "R13", LREG, 13,
  190. "R14", LREG, 14,
  191. "R15", LREG, 15,
  192. "R16", LREG, 16,
  193. "R17", LREG, 17,
  194. "R18", LREG, 18,
  195. "R19", LREG, 19,
  196. "R20", LREG, 20,
  197. "R21", LREG, 21,
  198. "R22", LREG, 22,
  199. "R23", LREG, 23,
  200. "R24", LREG, 24,
  201. "R25", LREG, 25,
  202. "R26", LREG, 26,
  203. "R27", LREG, 27,
  204. "R28", LREG, 28,
  205. "R29", LREG, 29,
  206. "R30", LREG, 30,
  207. "R31", LREG, 31,
  208. "F", LF, 0,
  209. "F0", LFREG, 0,
  210. "F1", LFREG, 1,
  211. "F2", LFREG, 2,
  212. "F3", LFREG, 3,
  213. "F4", LFREG, 4,
  214. "F5", LFREG, 5,
  215. "F6", LFREG, 6,
  216. "F7", LFREG, 7,
  217. "F8", LFREG, 8,
  218. "F9", LFREG, 9,
  219. "F10", LFREG, 10,
  220. "F11", LFREG, 11,
  221. "F12", LFREG, 12,
  222. "F13", LFREG, 13,
  223. "F14", LFREG, 14,
  224. "F15", LFREG, 15,
  225. "F16", LFREG, 16,
  226. "F17", LFREG, 17,
  227. "F18", LFREG, 18,
  228. "F19", LFREG, 19,
  229. "F20", LFREG, 20,
  230. "F21", LFREG, 21,
  231. "F22", LFREG, 22,
  232. "F23", LFREG, 23,
  233. "F24", LFREG, 24,
  234. "F25", LFREG, 25,
  235. "F26", LFREG, 26,
  236. "F27", LFREG, 27,
  237. "F28", LFREG, 28,
  238. "F29", LFREG, 29,
  239. "F30", LFREG, 30,
  240. "F31", LFREG, 31,
  241. "CREQV", LCROP, ACREQV,
  242. "CRXOR", LCROP, ACRXOR,
  243. "CRAND", LCROP, ACRAND,
  244. "CROR", LCROP, ACROR,
  245. "CRANDN", LCROP, ACRANDN,
  246. "CRORN", LCROP, ACRORN,
  247. "CRNAND", LCROP, ACRNAND,
  248. "CRNOR", LCROP, ACRNOR,
  249. "ADD", LADDW, AADD,
  250. "ADDV", LADDW, AADDV,
  251. "ADDCC", LADDW, AADDCC,
  252. "ADDVCC", LADDW, AADDVCC,
  253. "ADDC", LADDW, AADDC,
  254. "ADDCV", LADDW, AADDCV,
  255. "ADDCCC", LADDW, AADDCCC,
  256. "ADDCVCC", LADDW, AADDCVCC,
  257. "ADDE", LLOGW, AADDE,
  258. "ADDEV", LLOGW, AADDEV,
  259. "ADDECC", LLOGW, AADDECC,
  260. "ADDEVCC", LLOGW, AADDEVCC,
  261. "ADDME", LABS, AADDME,
  262. "ADDMEV", LABS, AADDMEV,
  263. "ADDMECC", LABS, AADDMECC,
  264. "ADDMEVCC", LABS, AADDMEVCC,
  265. "ADDZE", LABS, AADDZE,
  266. "ADDZEV", LABS, AADDZEV,
  267. "ADDZECC", LABS, AADDZECC,
  268. "ADDZEVCC", LABS, AADDZEVCC,
  269. "SUB", LADDW, ASUB,
  270. "SUBV", LADDW, ASUBV,
  271. "SUBCC", LADDW, ASUBCC,
  272. "SUBVCC", LADDW, ASUBVCC,
  273. "SUBE", LLOGW, ASUBE,
  274. "SUBECC", LLOGW, ASUBECC,
  275. "SUBEV", LLOGW, ASUBEV,
  276. "SUBEVCC", LLOGW, ASUBEVCC,
  277. "SUBC", LADDW, ASUBC,
  278. "SUBCCC", LADDW, ASUBCCC,
  279. "SUBCV", LADDW, ASUBCV,
  280. "SUBCVCC", LADDW, ASUBCVCC,
  281. "SUBME", LABS, ASUBME,
  282. "SUBMEV", LABS, ASUBMEV,
  283. "SUBMECC", LABS, ASUBMECC,
  284. "SUBMEVCC", LABS, ASUBMEVCC,
  285. "SUBZE", LABS, ASUBZE,
  286. "SUBZEV", LABS, ASUBZEV,
  287. "SUBZECC", LABS, ASUBZECC,
  288. "SUBZEVCC", LABS, ASUBZEVCC,
  289. "AND", LADDW, AAND,
  290. "ANDCC", LADDW, AANDCC, /* includes andil & andiu */
  291. "ANDN", LLOGW, AANDN,
  292. "ANDNCC", LLOGW, AANDNCC,
  293. "EQV", LLOGW, AEQV,
  294. "EQVCC", LLOGW, AEQVCC,
  295. "NAND", LLOGW, ANAND,
  296. "NANDCC", LLOGW, ANANDCC,
  297. "NOR", LLOGW, ANOR,
  298. "NORCC", LLOGW, ANORCC,
  299. "OR", LADDW, AOR, /* includes oril & oriu */
  300. "ORCC", LADDW, AORCC,
  301. "ORN", LLOGW, AORN,
  302. "ORNCC", LLOGW, AORNCC,
  303. "XOR", LADDW, AXOR, /* includes xoril & xoriu */
  304. "XORCC", LLOGW, AXORCC,
  305. "EXTSB", LABS, AEXTSB,
  306. "EXTSBCC", LABS, AEXTSBCC,
  307. "EXTSH", LABS, AEXTSH,
  308. "EXTSHCC", LABS, AEXTSHCC,
  309. "CNTLZW", LABS, ACNTLZW,
  310. "CNTLZWCC", LABS, ACNTLZWCC,
  311. "RLWMI", LRLWM, ARLWMI,
  312. "RLWMICC", LRLWM, ARLWMICC,
  313. "RLWNM", LRLWM, ARLWNM,
  314. "RLWNMCC", LRLWM, ARLWNMCC,
  315. "SLW", LSHW, ASLW,
  316. "SLWCC", LSHW, ASLWCC,
  317. "SRW", LSHW, ASRW,
  318. "SRWCC", LSHW, ASRWCC,
  319. "SRAW", LSHW, ASRAW,
  320. "SRAWCC", LSHW, ASRAWCC,
  321. "BR", LBRA, ABR,
  322. "BC", LBRA, ABC,
  323. "BCL", LBRA, ABC,
  324. "BL", LBRA, ABL,
  325. "BEQ", LBRA, ABEQ,
  326. "BNE", LBRA, ABNE,
  327. "BGT", LBRA, ABGT,
  328. "BGE", LBRA, ABGE,
  329. "BLT", LBRA, ABLT,
  330. "BLE", LBRA, ABLE,
  331. "BVC", LBRA, ABVC,
  332. "BVS", LBRA, ABVS,
  333. "CMP", LCMP, ACMP,
  334. "CMPU", LCMP, ACMPU,
  335. "DIVW", LLOGW, ADIVW,
  336. "DIVWV", LLOGW, ADIVWV,
  337. "DIVWCC", LLOGW, ADIVWCC,
  338. "DIVWVCC", LLOGW, ADIVWVCC,
  339. "DIVWU", LLOGW, ADIVWU,
  340. "DIVWUV", LLOGW, ADIVWUV,
  341. "DIVWUCC", LLOGW, ADIVWUCC,
  342. "DIVWUVCC", LLOGW, ADIVWUVCC,
  343. "FABS", LFCONV, AFABS,
  344. "FABSCC", LFCONV, AFABSCC,
  345. "FNEG", LFCONV, AFNEG,
  346. "FNEGCC", LFCONV, AFNEGCC,
  347. "FNABS", LFCONV, AFNABS,
  348. "FNABSCC", LFCONV, AFNABSCC,
  349. "FADD", LFADD, AFADD,
  350. "FADDCC", LFADD, AFADDCC,
  351. "FSUB", LFADD, AFSUB,
  352. "FSUBCC", LFADD, AFSUBCC,
  353. "FMUL", LFADD, AFMUL,
  354. "FMULCC", LFADD, AFMULCC,
  355. "FDIV", LFADD, AFDIV,
  356. "FDIVCC", LFADD, AFDIVCC,
  357. "FRSP", LFCONV, AFRSP,
  358. "FRSPCC", LFCONV, AFRSPCC,
  359. "FMADD", LFMA, AFMADD,
  360. "FMADDCC", LFMA, AFMADDCC,
  361. "FMSUB", LFMA, AFMSUB,
  362. "FMSUBCC", LFMA, AFMSUBCC,
  363. "FNMADD", LFMA, AFNMADD,
  364. "FNMADDCC", LFMA, AFNMADDCC,
  365. "FNMSUB", LFMA, AFNMSUB,
  366. "FNMSUBCC", LFMA, AFNMSUBCC,
  367. "FMADDS", LFMA, AFMADDS,
  368. "FMADDSCC", LFMA, AFMADDSCC,
  369. "FMSUBS", LFMA, AFMSUBS,
  370. "FMSUBSCC", LFMA, AFMSUBSCC,
  371. "FNMADDS", LFMA, AFNMADDS,
  372. "FNMADDSCC", LFMA, AFNMADDSCC,
  373. "FNMSUBS", LFMA, AFNMSUBS,
  374. "FNMSUBSCC", LFMA, AFNMSUBSCC,
  375. "FCMPU", LFCMP, AFCMPU,
  376. "FCMPO", LFCMP, AFCMPO,
  377. "MTFSB0", LMTFSB, AMTFSB0,
  378. "MTFSB1", LMTFSB, AMTFSB1,
  379. "FMOVD", LFMOV, AFMOVD,
  380. "FMOVS", LFMOV, AFMOVS,
  381. "FMOVDCC", LFCONV, AFMOVDCC, /* fmr. */
  382. "GLOBL", LTEXT, AGLOBL,
  383. "MOVB", LMOVB, AMOVB,
  384. "MOVBZ", LMOVB, AMOVBZ,
  385. "MOVBU", LMOVB, AMOVBU,
  386. "MOVBZU", LMOVB, AMOVBZU,
  387. "MOVH", LMOVB, AMOVH,
  388. "MOVHZ", LMOVB, AMOVHZ,
  389. "MOVHU", LMOVB, AMOVHU,
  390. "MOVHZU", LMOVB, AMOVHZU,
  391. "MOVHBR", LXMV, AMOVHBR,
  392. "MOVWBR", LXMV, AMOVWBR,
  393. "MOVW", LMOVW, AMOVW,
  394. "MOVWU", LMOVW, AMOVWU,
  395. "MOVMW", LMOVMW, AMOVMW,
  396. "MOVFL", LMOVW, AMOVFL,
  397. "MULLW", LADDW, AMULLW, /* includes multiply immediate 10-139 */
  398. "MULLWV", LLOGW, AMULLWV,
  399. "MULLWCC", LLOGW, AMULLWCC,
  400. "MULLWVCC", LLOGW, AMULLWVCC,
  401. "MULHW", LLOGW, AMULHW,
  402. "MULHWCC", LLOGW, AMULHWCC,
  403. "MULHWU", LLOGW, AMULHWU,
  404. "MULHWUCC", LLOGW, AMULHWUCC,
  405. "NEG", LABS, ANEG,
  406. "NEGV", LABS, ANEGV,
  407. "NEGCC", LABS, ANEGCC,
  408. "NEGVCC", LABS, ANEGVCC,
  409. "NOP", LNOP, ANOP, /* ori 0,0,0 */
  410. "SYSCALL", LNOP, ASYSCALL,
  411. "RETURN", LRETRN, ARETURN,
  412. "RFI", LRETRN, ARFI,
  413. "DATA", LDATA, ADATA,
  414. "END", LEND, AEND,
  415. "TEXT", LTEXT, ATEXT,
  416. /* special instructions */
  417. "DCBF", LXOP, ADCBF,
  418. "DCBI", LXOP, ADCBI,
  419. "DCBST", LXOP, ADCBST,
  420. "DCBT", LXOP, ADCBT,
  421. "DCBTST", LXOP, ADCBTST,
  422. "DCBZ", LXOP, ADCBZ,
  423. "ICBI", LXOP, AICBI,
  424. "ECIWX", LXLD, AECIWX,
  425. "ECOWX", LXST, AECOWX,
  426. "LWAR", LXLD, ALWAR,
  427. "STWCCC", LXST, ASTWCCC,
  428. "EIEIO", LRETRN, AEIEIO,
  429. "TLBIE", LNOP, ATLBIE,
  430. "LSW", LXLD, ALSW,
  431. "STSW", LXST, ASTSW,
  432. "ISYNC", LRETRN, AISYNC,
  433. "SYNC", LRETRN, ASYNC,
  434. /* "TW", LADDW, ATW,*/
  435. "WORD", LWORD, AWORD,
  436. "SCHED", LSCHED, 0,
  437. "NOSCHED", LSCHED, 0x80,
  438. 0
  439. };
  440. void
  441. cinit(void)
  442. {
  443. Sym *s;
  444. int i;
  445. nullgen.sym = S;
  446. nullgen.offset = 0;
  447. nullgen.type = D_NONE;
  448. nullgen.name = D_NONE;
  449. nullgen.reg = NREG;
  450. nullgen.xreg = NREG;
  451. if(FPCHIP)
  452. nullgen.dval = 0;
  453. for(i=0; i<sizeof(nullgen.sval); i++)
  454. nullgen.sval[i] = 0;
  455. nerrors = 0;
  456. iostack = I;
  457. iofree = I;
  458. peekc = IGN;
  459. nhunk = 0;
  460. for(i=0; i<NHASH; i++)
  461. hash[i] = S;
  462. for(i=0; itab[i].name; i++) {
  463. s = slookup(itab[i].name);
  464. s->type = itab[i].type;
  465. s->value = itab[i].value;
  466. }
  467. ALLOCN(pathname, 0, 100);
  468. if(getwd(pathname, 99) == 0) {
  469. ALLOCN(pathname, 100, 900);
  470. if(getwd(pathname, 999) == 0)
  471. strcpy(pathname, "/???");
  472. }
  473. }
  474. void
  475. syminit(Sym *s)
  476. {
  477. s->type = LNAME;
  478. s->value = 0;
  479. }
  480. void
  481. cclean(void)
  482. {
  483. outcode(AEND, &nullgen, NREG, &nullgen);
  484. Bflush(&obuf);
  485. }
  486. void
  487. zname(char *n, int t, int s)
  488. {
  489. Bputc(&obuf, ANAME);
  490. Bputc(&obuf, t); /* type */
  491. Bputc(&obuf, s); /* sym */
  492. while(*n) {
  493. Bputc(&obuf, *n);
  494. n++;
  495. }
  496. Bputc(&obuf, 0);
  497. }
  498. void
  499. zaddr(Gen *a, int s)
  500. {
  501. long l;
  502. int i;
  503. char *n;
  504. Ieee e;
  505. Bputc(&obuf, a->type);
  506. Bputc(&obuf, a->reg);
  507. Bputc(&obuf, s);
  508. Bputc(&obuf, a->name);
  509. switch(a->type) {
  510. default:
  511. print("unknown type %d\n", a->type);
  512. exits("arg");
  513. case D_NONE:
  514. case D_REG:
  515. case D_FREG:
  516. case D_CREG:
  517. case D_FPSCR:
  518. case D_MSR:
  519. case D_SREG:
  520. case D_OPT:
  521. break;
  522. case D_SPR:
  523. case D_OREG:
  524. case D_CONST:
  525. case D_BRANCH:
  526. l = a->offset;
  527. Bputc(&obuf, l);
  528. Bputc(&obuf, l>>8);
  529. Bputc(&obuf, l>>16);
  530. Bputc(&obuf, l>>24);
  531. break;
  532. case D_SCONST:
  533. n = a->sval;
  534. for(i=0; i<NSNAME; i++) {
  535. Bputc(&obuf, *n);
  536. n++;
  537. }
  538. break;
  539. case D_FCONST:
  540. ieeedtod(&e, a->dval);
  541. Bputc(&obuf, e.l);
  542. Bputc(&obuf, e.l>>8);
  543. Bputc(&obuf, e.l>>16);
  544. Bputc(&obuf, e.l>>24);
  545. Bputc(&obuf, e.h);
  546. Bputc(&obuf, e.h>>8);
  547. Bputc(&obuf, e.h>>16);
  548. Bputc(&obuf, e.h>>24);
  549. break;
  550. }
  551. }
  552. int
  553. outsim(Gen *g)
  554. {
  555. Sym *s;
  556. int sno, t;
  557. s = g->sym;
  558. if(s == S)
  559. return 0;
  560. sno = s->sym;
  561. if(sno < 0 || sno >= NSYM)
  562. sno = 0;
  563. t = g->name;
  564. if(h[sno].type == t && h[sno].sym == s)
  565. return sno;
  566. zname(s->name, t, sym);
  567. s->sym = sym;
  568. h[sym].sym = s;
  569. h[sym].type = t;
  570. sno = sym;
  571. sym++;
  572. if(sym >= NSYM)
  573. sym = 1;
  574. return sno;
  575. }
  576. void
  577. outcode(int a, Gen *g1, int reg, Gen *g2)
  578. {
  579. int sf, st;
  580. if(a != AGLOBL && a != ADATA)
  581. pc++;
  582. if(pass == 1)
  583. return;
  584. if(g1->xreg != NREG) {
  585. if(reg != NREG || g2->xreg != NREG)
  586. yyerror("bad addressing modes");
  587. reg = g1->xreg;
  588. } else
  589. if(g2->xreg != NREG) {
  590. if(reg != NREG)
  591. yyerror("bad addressing modes");
  592. reg = g2->xreg;
  593. }
  594. do {
  595. sf = outsim(g1);
  596. st = outsim(g2);
  597. } while(sf != 0 && st == sf);
  598. Bputc(&obuf, a);
  599. Bputc(&obuf, reg|nosched);
  600. Bputc(&obuf, lineno);
  601. Bputc(&obuf, lineno>>8);
  602. Bputc(&obuf, lineno>>16);
  603. Bputc(&obuf, lineno>>24);
  604. zaddr(g1, sf);
  605. zaddr(g2, st);
  606. }
  607. void
  608. outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
  609. {
  610. int s1, s2, s3, flag;
  611. if(a != AGLOBL && a != ADATA)
  612. pc++;
  613. if(pass == 1)
  614. return;
  615. do {
  616. s1 = outsim(g1);
  617. s2 = outsim(g2);
  618. s3 = outsim(g3);
  619. } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
  620. flag = 0;
  621. if(g2->type != D_NONE)
  622. flag = 0x40; /* flags extra operand */
  623. Bputc(&obuf, a);
  624. Bputc(&obuf, reg | nosched | flag);
  625. Bputc(&obuf, lineno);
  626. Bputc(&obuf, lineno>>8);
  627. Bputc(&obuf, lineno>>16);
  628. Bputc(&obuf, lineno>>24);
  629. zaddr(g1, s1);
  630. if(flag)
  631. zaddr(g2, s2);
  632. zaddr(g3, s3);
  633. }
  634. void
  635. outhist(void)
  636. {
  637. Gen g;
  638. Hist *h;
  639. char *p, *q, *op;
  640. int n;
  641. g = nullgen;
  642. for(h = hist; h != H; h = h->link) {
  643. p = h->name;
  644. op = 0;
  645. if(p && p[0] != '/' && h->offset == 0 && pathname && pathname[0] == '/') {
  646. op = p;
  647. p = pathname;
  648. }
  649. while(p) {
  650. q = strchr(p, '/');
  651. if(q) {
  652. n = q-p;
  653. if(n == 0)
  654. n = 1; /* leading "/" */
  655. q++;
  656. } else {
  657. n = strlen(p);
  658. q = 0;
  659. }
  660. if(n) {
  661. Bputc(&obuf, ANAME);
  662. Bputc(&obuf, D_FILE); /* type */
  663. Bputc(&obuf, 1); /* sym */
  664. Bputc(&obuf, '<');
  665. Bwrite(&obuf, p, n);
  666. Bputc(&obuf, 0);
  667. }
  668. p = q;
  669. if(p == 0 && op) {
  670. p = op;
  671. op = 0;
  672. }
  673. }
  674. g.offset = h->offset;
  675. Bputc(&obuf, AHISTORY);
  676. Bputc(&obuf, 0);
  677. Bputc(&obuf, h->line);
  678. Bputc(&obuf, h->line>>8);
  679. Bputc(&obuf, h->line>>16);
  680. Bputc(&obuf, h->line>>24);
  681. zaddr(&nullgen, 0);
  682. zaddr(&g, 0);
  683. }
  684. }
  685. void
  686. praghjdicks(void)
  687. {
  688. while(getnsc() != '\n')
  689. ;
  690. }
  691. void
  692. pragvararg(void)
  693. {
  694. while(getnsc() != '\n')
  695. ;
  696. }
  697. void
  698. pragfpround(void)
  699. {
  700. while(getnsc() != '\n')
  701. ;
  702. }
  703. #include "../cc/lexbody"
  704. #include "../cc/macbody"
  705. #include "../cc/compat"