lex.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #define EXTERN
  10. #include "a.h"
  11. #include "y.tab.h"
  12. #include <ctype.h>
  13. void
  14. main(int argc, char *argv[])
  15. {
  16. char *p;
  17. int nout, nproc, status, i, c;
  18. thechar = 'q';
  19. thestring = "power";
  20. memset(debug, 0, sizeof(debug));
  21. cinit();
  22. outfile = 0;
  23. include[ninclude++] = ".";
  24. ARGBEGIN {
  25. default:
  26. c = ARGC();
  27. if(c >= 0 || c < sizeof(debug))
  28. debug[c] = 1;
  29. break;
  30. case 'o':
  31. outfile = ARGF();
  32. break;
  33. case 'D':
  34. p = ARGF();
  35. if(p)
  36. Dlist[nDlist++] = p;
  37. break;
  38. case 'I':
  39. p = ARGF();
  40. setinclude(p);
  41. break;
  42. } ARGEND
  43. if(*argv == 0) {
  44. print("usage: %ca [-options] file.s\n", thechar);
  45. errorexit();
  46. }
  47. if(argc > 1 && systemtype(Windows)){
  48. print("can't assemble multiple files on windows\n");
  49. errorexit();
  50. }
  51. if(argc > 1) {
  52. nproc = 1;
  53. if(p = getenv("NPROC"))
  54. nproc = atol(p);
  55. c = 0;
  56. nout = 0;
  57. for(;;) {
  58. while(nout < nproc && argc > 0) {
  59. i = myfork();
  60. if(i < 0) {
  61. i = mywait(&status);
  62. if(i < 0)
  63. errorexit();
  64. if(status)
  65. c++;
  66. nout--;
  67. continue;
  68. }
  69. if(i == 0) {
  70. print("%s:\n", *argv);
  71. if(assemble(*argv))
  72. errorexit();
  73. exits(0);
  74. }
  75. nout++;
  76. argc--;
  77. argv++;
  78. }
  79. i = mywait(&status);
  80. if(i < 0) {
  81. if(c)
  82. errorexit();
  83. exits(0);
  84. }
  85. if(status)
  86. c++;
  87. nout--;
  88. }
  89. }
  90. if(assemble(argv[0]))
  91. errorexit();
  92. exits(0);
  93. }
  94. int
  95. assemble(char *file)
  96. {
  97. char ofile[100], incfile[20], *p;
  98. int i, of;
  99. strcpy(ofile, file);
  100. if(p = strrchr(ofile, pathchar())) {
  101. include[0] = ofile;
  102. *p++ = 0;
  103. } else
  104. p = ofile;
  105. if(outfile == 0) {
  106. outfile = p;
  107. if(p = strrchr(outfile, '.'))
  108. if(p[1] == 's' && p[2] == 0)
  109. p[0] = 0;
  110. p = strrchr(outfile, 0);
  111. p[0] = '.';
  112. p[1] = thechar;
  113. p[2] = 0;
  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. nosched = 0;
  132. pinit(file);
  133. for(i=0; i<nDlist; i++)
  134. dodefine(Dlist[i]);
  135. yyparse();
  136. if(nerrors) {
  137. cclean();
  138. return nerrors;
  139. }
  140. pass = 2;
  141. nosched = 0;
  142. outhist();
  143. pinit(file);
  144. for(i=0; i<nDlist; i++)
  145. dodefine(Dlist[i]);
  146. yyparse();
  147. cclean();
  148. return nerrors;
  149. }
  150. struct
  151. {
  152. char *name;
  153. uint16_t type;
  154. uint16_t value;
  155. } itab[] =
  156. {
  157. "SP", LSP, D_AUTO,
  158. "SB", LSB, D_EXTERN,
  159. "FP", LFP, D_PARAM,
  160. "PC", LPC, D_BRANCH,
  161. "LR", LLR, D_LR,
  162. "CTR", LCTR, D_CTR,
  163. "XER", LSPREG, D_XER,
  164. "MSR", LMSR, D_MSR,
  165. "FPSCR", LFPSCR, D_FPSCR,
  166. "SPR", LSPR, D_SPR,
  167. "DCR", LDCR, D_DCR,
  168. "SEG", LSEG, D_SREG,
  169. "CR", LCR, 0,
  170. "CR0", LCREG, 0,
  171. "CR1", LCREG, 1,
  172. "CR2", LCREG, 2,
  173. "CR3", LCREG, 3,
  174. "CR4", LCREG, 4,
  175. "CR5", LCREG, 5,
  176. "CR6", LCREG, 6,
  177. "CR7", LCREG, 7,
  178. "R", LR, 0,
  179. "R0", LREG, 0,
  180. "R1", LREG, 1,
  181. "R2", LREG, 2,
  182. "R3", LREG, 3,
  183. "R4", LREG, 4,
  184. "R5", LREG, 5,
  185. "R6", LREG, 6,
  186. "R7", LREG, 7,
  187. "R8", LREG, 8,
  188. "R9", LREG, 9,
  189. "R10", LREG, 10,
  190. "R11", LREG, 11,
  191. "R12", LREG, 12,
  192. "R13", LREG, 13,
  193. "R14", LREG, 14,
  194. "R15", LREG, 15,
  195. "R16", LREG, 16,
  196. "R17", LREG, 17,
  197. "R18", LREG, 18,
  198. "R19", LREG, 19,
  199. "R20", LREG, 20,
  200. "R21", LREG, 21,
  201. "R22", LREG, 22,
  202. "R23", LREG, 23,
  203. "R24", LREG, 24,
  204. "R25", LREG, 25,
  205. "R26", LREG, 26,
  206. "R27", LREG, 27,
  207. "R28", LREG, 28,
  208. "R29", LREG, 29,
  209. "R30", LREG, 30,
  210. "R31", LREG, 31,
  211. "F", LF, 0,
  212. "F0", LFREG, 0,
  213. "F1", LFREG, 1,
  214. "F2", LFREG, 2,
  215. "F3", LFREG, 3,
  216. "F4", LFREG, 4,
  217. "F5", LFREG, 5,
  218. "F6", LFREG, 6,
  219. "F7", LFREG, 7,
  220. "F8", LFREG, 8,
  221. "F9", LFREG, 9,
  222. "F10", LFREG, 10,
  223. "F11", LFREG, 11,
  224. "F12", LFREG, 12,
  225. "F13", LFREG, 13,
  226. "F14", LFREG, 14,
  227. "F15", LFREG, 15,
  228. "F16", LFREG, 16,
  229. "F17", LFREG, 17,
  230. "F18", LFREG, 18,
  231. "F19", LFREG, 19,
  232. "F20", LFREG, 20,
  233. "F21", LFREG, 21,
  234. "F22", LFREG, 22,
  235. "F23", LFREG, 23,
  236. "F24", LFREG, 24,
  237. "F25", LFREG, 25,
  238. "F26", LFREG, 26,
  239. "F27", LFREG, 27,
  240. "F28", LFREG, 28,
  241. "F29", LFREG, 29,
  242. "F30", LFREG, 30,
  243. "F31", LFREG, 31,
  244. "CREQV", LCROP, ACREQV,
  245. "CRXOR", LCROP, ACRXOR,
  246. "CRAND", LCROP, ACRAND,
  247. "CROR", LCROP, ACROR,
  248. "CRANDN", LCROP, ACRANDN,
  249. "CRORN", LCROP, ACRORN,
  250. "CRNAND", LCROP, ACRNAND,
  251. "CRNOR", LCROP, ACRNOR,
  252. "ADD", LADDW, AADD,
  253. "ADDV", LADDW, AADDV,
  254. "ADDCC", LADDW, AADDCC,
  255. "ADDVCC", LADDW, AADDVCC,
  256. "ADDC", LADDW, AADDC,
  257. "ADDCV", LADDW, AADDCV,
  258. "ADDCCC", LADDW, AADDCCC,
  259. "ADDCVCC", LADDW, AADDCVCC,
  260. "ADDE", LLOGW, AADDE,
  261. "ADDEV", LLOGW, AADDEV,
  262. "ADDECC", LLOGW, AADDECC,
  263. "ADDEVCC", LLOGW, AADDEVCC,
  264. "ADDME", LABS, AADDME,
  265. "ADDMEV", LABS, AADDMEV,
  266. "ADDMECC", LABS, AADDMECC,
  267. "ADDMEVCC", LABS, AADDMEVCC,
  268. "ADDZE", LABS, AADDZE,
  269. "ADDZEV", LABS, AADDZEV,
  270. "ADDZECC", LABS, AADDZECC,
  271. "ADDZEVCC", LABS, AADDZEVCC,
  272. "SUB", LADDW, ASUB,
  273. "SUBV", LADDW, ASUBV,
  274. "SUBCC", LADDW, ASUBCC,
  275. "SUBVCC", LADDW, ASUBVCC,
  276. "SUBE", LLOGW, ASUBE,
  277. "SUBECC", LLOGW, ASUBECC,
  278. "SUBEV", LLOGW, ASUBEV,
  279. "SUBEVCC", LLOGW, ASUBEVCC,
  280. "SUBC", LADDW, ASUBC,
  281. "SUBCCC", LADDW, ASUBCCC,
  282. "SUBCV", LADDW, ASUBCV,
  283. "SUBCVCC", LADDW, ASUBCVCC,
  284. "SUBME", LABS, ASUBME,
  285. "SUBMEV", LABS, ASUBMEV,
  286. "SUBMECC", LABS, ASUBMECC,
  287. "SUBMEVCC", LABS, ASUBMEVCC,
  288. "SUBZE", LABS, ASUBZE,
  289. "SUBZEV", LABS, ASUBZEV,
  290. "SUBZECC", LABS, ASUBZECC,
  291. "SUBZEVCC", LABS, ASUBZEVCC,
  292. "AND", LADDW, AAND,
  293. "ANDCC", LADDW, AANDCC, /* includes andil & andiu */
  294. "ANDN", LLOGW, AANDN,
  295. "ANDNCC", LLOGW, AANDNCC,
  296. "EQV", LLOGW, AEQV,
  297. "EQVCC", LLOGW, AEQVCC,
  298. "NAND", LLOGW, ANAND,
  299. "NANDCC", LLOGW, ANANDCC,
  300. "NOR", LLOGW, ANOR,
  301. "NORCC", LLOGW, ANORCC,
  302. "OR", LADDW, AOR, /* includes oril & oriu */
  303. "ORCC", LADDW, AORCC,
  304. "ORN", LLOGW, AORN,
  305. "ORNCC", LLOGW, AORNCC,
  306. "XOR", LADDW, AXOR, /* includes xoril & xoriu */
  307. "XORCC", LLOGW, AXORCC,
  308. "EXTSB", LABS, AEXTSB,
  309. "EXTSBCC", LABS, AEXTSBCC,
  310. "EXTSH", LABS, AEXTSH,
  311. "EXTSHCC", LABS, AEXTSHCC,
  312. "CNTLZW", LABS, ACNTLZW,
  313. "CNTLZWCC", LABS, ACNTLZWCC,
  314. "RLWMI", LRLWM, ARLWMI,
  315. "RLWMICC", LRLWM, ARLWMICC,
  316. "RLWNM", LRLWM, ARLWNM,
  317. "RLWNMCC", LRLWM, ARLWNMCC,
  318. "SLW", LSHW, ASLW,
  319. "SLWCC", LSHW, ASLWCC,
  320. "SRW", LSHW, ASRW,
  321. "SRWCC", LSHW, ASRWCC,
  322. "SRAW", LSHW, ASRAW,
  323. "SRAWCC", LSHW, ASRAWCC,
  324. "BR", LBRA, ABR,
  325. "BC", LBRA, ABC,
  326. "BCL", LBRA, ABC,
  327. "BL", LBRA, ABL,
  328. "BEQ", LBRA, ABEQ,
  329. "BNE", LBRA, ABNE,
  330. "BGT", LBRA, ABGT,
  331. "BGE", LBRA, ABGE,
  332. "BLT", LBRA, ABLT,
  333. "BLE", LBRA, ABLE,
  334. "BVC", LBRA, ABVC,
  335. "BVS", LBRA, ABVS,
  336. "CMP", LCMP, ACMP,
  337. "CMPU", LCMP, ACMPU,
  338. "DIVW", LLOGW, ADIVW,
  339. "DIVWV", LLOGW, ADIVWV,
  340. "DIVWCC", LLOGW, ADIVWCC,
  341. "DIVWVCC", LLOGW, ADIVWVCC,
  342. "DIVWU", LLOGW, ADIVWU,
  343. "DIVWUV", LLOGW, ADIVWUV,
  344. "DIVWUCC", LLOGW, ADIVWUCC,
  345. "DIVWUVCC", LLOGW, ADIVWUVCC,
  346. "FABS", LFCONV, AFABS,
  347. "FABSCC", LFCONV, AFABSCC,
  348. "FNEG", LFCONV, AFNEG,
  349. "FNEGCC", LFCONV, AFNEGCC,
  350. "FNABS", LFCONV, AFNABS,
  351. "FNABSCC", LFCONV, AFNABSCC,
  352. "FADD", LFADD, AFADD,
  353. "FADDCC", LFADD, AFADDCC,
  354. "FSUB", LFADD, AFSUB,
  355. "FSUBCC", LFADD, AFSUBCC,
  356. "FMUL", LFADD, AFMUL,
  357. "FMULCC", LFADD, AFMULCC,
  358. "FDIV", LFADD, AFDIV,
  359. "FDIVCC", LFADD, AFDIVCC,
  360. "FRSP", LFCONV, AFRSP,
  361. "FRSPCC", LFCONV, AFRSPCC,
  362. "FMADD", LFMA, AFMADD,
  363. "FMADDCC", LFMA, AFMADDCC,
  364. "FMSUB", LFMA, AFMSUB,
  365. "FMSUBCC", LFMA, AFMSUBCC,
  366. "FNMADD", LFMA, AFNMADD,
  367. "FNMADDCC", LFMA, AFNMADDCC,
  368. "FNMSUB", LFMA, AFNMSUB,
  369. "FNMSUBCC", LFMA, AFNMSUBCC,
  370. "FMADDS", LFMA, AFMADDS,
  371. "FMADDSCC", LFMA, AFMADDSCC,
  372. "FMSUBS", LFMA, AFMSUBS,
  373. "FMSUBSCC", LFMA, AFMSUBSCC,
  374. "FNMADDS", LFMA, AFNMADDS,
  375. "FNMADDSCC", LFMA, AFNMADDSCC,
  376. "FNMSUBS", LFMA, AFNMSUBS,
  377. "FNMSUBSCC", LFMA, AFNMSUBSCC,
  378. "FCMPU", LFCMP, AFCMPU,
  379. "FCMPO", LFCMP, AFCMPO,
  380. "MTFSB0", LMTFSB, AMTFSB0,
  381. "MTFSB1", LMTFSB, AMTFSB1,
  382. "FMOVD", LFMOV, AFMOVD,
  383. "FMOVS", LFMOV, AFMOVS,
  384. "FMOVDCC", LFCONV, AFMOVDCC, /* fmr. */
  385. "GLOBL", LTEXT, AGLOBL,
  386. "MOVB", LMOVB, AMOVB,
  387. "MOVBZ", LMOVB, AMOVBZ,
  388. "MOVBU", LMOVB, AMOVBU,
  389. "MOVBZU", LMOVB, AMOVBZU,
  390. "MOVH", LMOVB, AMOVH,
  391. "MOVHZ", LMOVB, AMOVHZ,
  392. "MOVHU", LMOVB, AMOVHU,
  393. "MOVHZU", LMOVB, AMOVHZU,
  394. "MOVHBR", LXMV, AMOVHBR,
  395. "MOVWBR", LXMV, AMOVWBR,
  396. "MOVW", LMOVW, AMOVW,
  397. "MOVWU", LMOVW, AMOVWU,
  398. "MOVMW", LMOVMW, AMOVMW,
  399. "MOVFL", LMOVW, AMOVFL,
  400. "MULLW", LADDW, AMULLW, /* includes multiply immediate 10-139 */
  401. "MULLWV", LLOGW, AMULLWV,
  402. "MULLWCC", LLOGW, AMULLWCC,
  403. "MULLWVCC", LLOGW, AMULLWVCC,
  404. "MULHW", LLOGW, AMULHW,
  405. "MULHWCC", LLOGW, AMULHWCC,
  406. "MULHWU", LLOGW, AMULHWU,
  407. "MULHWUCC", LLOGW, AMULHWUCC,
  408. "NEG", LABS, ANEG,
  409. "NEGV", LABS, ANEGV,
  410. "NEGCC", LABS, ANEGCC,
  411. "NEGVCC", LABS, ANEGVCC,
  412. "NOP", LNOP, ANOP, /* ori 0,0,0 */
  413. "SYSCALL", LNOP, ASYSCALL,
  414. "RETURN", LRETRN, ARETURN,
  415. "RFI", LRETRN, ARFI,
  416. "RFCI", LRETRN, ARFCI,
  417. "DATA", LDATA, ADATA,
  418. "END", LEND, AEND,
  419. "TEXT", LTEXT, ATEXT,
  420. /* IBM powerpc embedded */
  421. "MACCHW", LMA, AMACCHW,
  422. "MACCHWCC", LMA, AMACCHWCC,
  423. "MACCHWS", LMA, AMACCHWS,
  424. "MACCHWSCC", LMA, AMACCHWSCC,
  425. "MACCHWSU", LMA, AMACCHWSU,
  426. "MACCHWSUCC", LMA, AMACCHWSUCC,
  427. "MACCHWSUV", LMA, AMACCHWSUV,
  428. "MACCHWSUVCC", LMA, AMACCHWSUVCC,
  429. "MACCHWSV", LMA, AMACCHWSV,
  430. "MACCHWSVCC", LMA, AMACCHWSVCC,
  431. "MACCHWU", LMA, AMACCHWU,
  432. "MACCHWUCC", LMA, AMACCHWUCC,
  433. "MACCHWUV", LMA, AMACCHWUV,
  434. "MACCHWUVCC", LMA, AMACCHWUVCC,
  435. "MACCHWV", LMA, AMACCHWV,
  436. "MACCHWVCC", LMA, AMACCHWVCC,
  437. "MACHHW", LMA, AMACHHW,
  438. "MACHHWCC", LMA, AMACHHWCC,
  439. "MACHHWS", LMA, AMACHHWS,
  440. "MACHHWSCC", LMA, AMACHHWSCC,
  441. "MACHHWSU", LMA, AMACHHWSU,
  442. "MACHHWSUCC", LMA, AMACHHWSUCC,
  443. "MACHHWSUV", LMA, AMACHHWSUV,
  444. "MACHHWSUVCC", LMA, AMACHHWSUVCC,
  445. "MACHHWSV", LMA, AMACHHWSV,
  446. "MACHHWSVCC", LMA, AMACHHWSVCC,
  447. "MACHHWU", LMA, AMACHHWU,
  448. "MACHHWUCC", LMA, AMACHHWUCC,
  449. "MACHHWUV", LMA, AMACHHWUV,
  450. "MACHHWUVCC", LMA, AMACHHWUVCC,
  451. "MACHHWV", LMA, AMACHHWV,
  452. "MACHHWVCC", LMA, AMACHHWVCC,
  453. "MACLHW", LMA, AMACLHW,
  454. "MACLHWCC", LMA, AMACLHWCC,
  455. "MACLHWS", LMA, AMACLHWS,
  456. "MACLHWSCC", LMA, AMACLHWSCC,
  457. "MACLHWSU", LMA, AMACLHWSU,
  458. "MACLHWSUCC", LMA, AMACLHWSUCC,
  459. "MACLHWSUV", LMA, AMACLHWSUV,
  460. "MACLHWSUVCC", LMA, AMACLHWSUVCC,
  461. "MACLHWSV", LMA, AMACLHWSV,
  462. "MACLHWSVCC", LMA, AMACLHWSVCC,
  463. "MACLHWU", LMA, AMACLHWU,
  464. "MACLHWUCC", LMA, AMACLHWUCC,
  465. "MACLHWUV", LMA, AMACLHWUV,
  466. "MACLHWUVCC", LMA, AMACLHWUVCC,
  467. "MACLHWV", LMA, AMACLHWV,
  468. "MACLHWVCC", LMA, AMACLHWVCC,
  469. "MULCHW", LLOGW, AMULCHW,
  470. "MULCHWCC", LLOGW, AMULCHWCC,
  471. "MULCHWU", LLOGW, AMULCHWU,
  472. "MULCHWUCC", LLOGW, AMULCHWUCC,
  473. "MULHHW", LLOGW, AMULHHW,
  474. "MULHHWCC", LLOGW, AMULHHWCC,
  475. "MULHHWU", LLOGW, AMULHHWU,
  476. "MULHHWUCC", LLOGW, AMULHHWUCC,
  477. "MULLHW", LLOGW, AMULLHW,
  478. "MULLHWCC", LLOGW, AMULLHWCC,
  479. "MULLHWU", LLOGW, AMULLHWU,
  480. "MULLHWUCC", LLOGW, AMULLHWUCC,
  481. "NMACCHW", LMA, ANMACCHW,
  482. "NMACCHWCC", LMA, ANMACCHWCC,
  483. "NMACCHWS", LMA, ANMACCHWS,
  484. "NMACCHWSCC", LMA, ANMACCHWSCC,
  485. "NMACCHWSV", LMA, ANMACCHWSV,
  486. "NMACCHWSVCC", LMA, ANMACCHWSVCC,
  487. "NMACCHWV", LMA, ANMACCHWV,
  488. "NMACCHWVCC", LMA, ANMACCHWVCC,
  489. "NMACHHW", LMA, ANMACHHW,
  490. "NMACHHWCC", LMA, ANMACHHWCC,
  491. "NMACHHWS", LMA, ANMACHHWS,
  492. "NMACHHWSCC", LMA, ANMACHHWSCC,
  493. "NMACHHWSV", LMA, ANMACHHWSV,
  494. "NMACHHWSVCC", LMA, ANMACHHWSVCC,
  495. "NMACHHWV", LMA, ANMACHHWV,
  496. "NMACHHWVCC", LMA, ANMACHHWVCC,
  497. "NMACLHW", LMA, ANMACLHW,
  498. "NMACLHWCC", LMA, ANMACLHWCC,
  499. "NMACLHWS", LMA, ANMACLHWS,
  500. "NMACLHWSCC", LMA, ANMACLHWSCC,
  501. "NMACLHWSV", LMA, ANMACLHWSV,
  502. "NMACLHWSVCC", LMA, ANMACLHWSVCC,
  503. "NMACLHWV", LMA, ANMACLHWV,
  504. "NMACLHWVCC", LMA, ANMACLHWVCC,
  505. /* optional on 32-bit */
  506. "FRES", LFCONV, AFRES,
  507. "FRESCC", LFCONV, AFRESCC,
  508. "FRSQRTE", LFCONV, AFRSQRTE,
  509. "FRSQRTECC", LFCONV, AFRSQRTECC,
  510. "FSEL", LFMA, AFSEL,
  511. "FSELCC", LFMA, AFSELCC,
  512. "FSQRT", LFCONV, AFSQRT,
  513. "FSQRTCC", LFCONV, AFSQRTCC,
  514. "FSQRTS", LFCONV, AFSQRTS,
  515. "FSQRTSCC", LFCONV, AFSQRTSCC,
  516. /* parallel, cross, and secondary (fp2) */
  517. "FPSEL", LFMA, AFPSEL,
  518. "FPMUL", LFADD, AFPMUL,
  519. "FXMUL", LFADD, AFXMUL,
  520. "FXPMUL", LFADD, AFXPMUL,
  521. "FXSMUL", LFADD, AFXSMUL,
  522. "FPADD", LFADD, AFPADD,
  523. "FPSUB", LFADD, AFPSUB,
  524. "FPRE", LFCONV, AFPRE,
  525. "FPRSQRTE", LFCONV, AFPRSQRTE,
  526. "FPMADD", LFMA, AFPMADD,
  527. "FXMADD", LFMA, AFXMADD,
  528. "FXCPMADD", LFMA, AFXCPMADD,
  529. "FXCSMADD", LFMA, AFXCSMADD,
  530. "FPNMADD", LFMA, AFPNMADD,
  531. "FXNMADD", LFMA, AFXNMADD,
  532. "FXCPNMADD", LFMA, AFXCPNMADD,
  533. "FXCSNMADD", LFMA, AFXCSNMADD,
  534. "FPMSUB", LFMA, AFPMSUB,
  535. "FXMSUB", LFMA, AFXMSUB,
  536. "FXCPMSUB", LFMA, AFXCPMSUB,
  537. "FXCSMSUB", LFMA, AFXCSMSUB,
  538. "FPNMSUB", LFMA, AFPNMSUB,
  539. "FXNMSUB", LFMA, AFXNMSUB,
  540. "FXCPNMSUB", LFMA, AFXCPNMSUB,
  541. "FXCSNMSUB", LFMA, AFXCSNMSUB,
  542. "FPABS", LFCONV, AFPABS,
  543. "FPNEG", LFCONV, AFPNEG,
  544. "FPRSP", LFCONV, AFPRSP,
  545. "FPNABS", LFCONV, AFPNABS,
  546. "FSMOVD", LFMOV, AFSMOVD,
  547. "FSCMP", LFCMP, AFSCMP,
  548. "FSABS", LFCONV, AFSABS,
  549. "FSNEG", LFCONV, AFSNEG,
  550. "FSNABS", LFCONV, AFSNABS,
  551. "FPCTIW", LFCONV, AFPCTIW,
  552. "FPCTIWZ", LFCONV, AFPCTIWZ,
  553. "FMOVSPD", LFCONV, AFMOVSPD,
  554. "FMOVPSD", LFCONV, AFMOVPSD,
  555. "FXCPNPMA", LFMA, AFXCPNPMA,
  556. "FXCSNPMA", LFMA, AFXCSNPMA,
  557. "FXCPNSMA", LFMA, AFXCPNSMA,
  558. "FXCSNSMA", LFMA, AFXCSNSMA,
  559. "FXCXNPMA", LFMA, AFXCXNPMA,
  560. "FXCXNSMA", LFMA, AFXCXNSMA,
  561. "FXCXMA", LFMA, AFXCXMA,
  562. "FXCXNMS", LFMA, AFXCXNMS,
  563. /* parallel, cross, and secondary load and store (fp2) */
  564. "FSMOVS", LFMOVX, AFSMOVS,
  565. "FSMOVSU", LFMOVX, AFSMOVSU,
  566. "FSMOVD", LFMOVX, AFSMOVD,
  567. "FSMOVDU", LFMOVX, AFSMOVDU,
  568. "FXMOVS", LFMOVX, AFXMOVS,
  569. "FXMOVSU", LFMOVX, AFXMOVSU,
  570. "FXMOVD", LFMOVX, AFXMOVD,
  571. "FXMOVDU", LFMOVX, AFXMOVDU,
  572. "FPMOVS", LFMOVX, AFPMOVS,
  573. "FPMOVSU", LFMOVX, AFPMOVSU,
  574. "FPMOVD", LFMOVX, AFPMOVD,
  575. "FPMOVDU", LFMOVX, AFPMOVDU,
  576. "FPMOVIW", LFMOVX, AFPMOVIW,
  577. "AFMOVSPD", LFMOV, AFMOVSPD,
  578. "AFMOVPSD", LFMOV, AFMOVPSD,
  579. /* special instructions */
  580. "DCBF", LXOP, ADCBF,
  581. "DCBI", LXOP, ADCBI,
  582. "DCBST", LXOP, ADCBST,
  583. "DCBT", LXOP, ADCBT,
  584. "DCBTST", LXOP, ADCBTST,
  585. "DCBZ", LXOP, ADCBZ,
  586. "ICBI", LXOP, AICBI,
  587. "ECIWX", LXLD, AECIWX,
  588. "ECOWX", LXST, AECOWX,
  589. "LWAR", LXLD, ALWAR,
  590. "STWCCC", LXST, ASTWCCC,
  591. "EIEIO", LRETRN, AEIEIO,
  592. "TLBIE", LNOP, ATLBIE,
  593. "LSW", LXLD, ALSW,
  594. "STSW", LXST, ASTSW,
  595. "ISYNC", LRETRN, AISYNC,
  596. "SYNC", LRETRN, ASYNC,
  597. /* "TW", LADDW, ATW,*/
  598. "WORD", LWORD, AWORD,
  599. "SCHED", LSCHED, 0,
  600. "NOSCHED", LSCHED, 0x80,
  601. 0
  602. };
  603. void
  604. cinit(void)
  605. {
  606. Sym *s;
  607. int i;
  608. nullgen.sym = S;
  609. nullgen.offset = 0;
  610. nullgen.type = D_NONE;
  611. nullgen.name = D_NONE;
  612. nullgen.reg = NREG;
  613. nullgen.xreg = NREG;
  614. if(FPCHIP)
  615. nullgen.dval = 0;
  616. for(i=0; i<sizeof(nullgen.sval); i++)
  617. nullgen.sval[i] = 0;
  618. nerrors = 0;
  619. iostack = I;
  620. iofree = I;
  621. peekc = IGN;
  622. nhunk = 0;
  623. for(i=0; i<NHASH; i++)
  624. hash[i] = S;
  625. for(i=0; itab[i].name; i++) {
  626. s = slookup(itab[i].name);
  627. s->type = itab[i].type;
  628. s->value = itab[i].value;
  629. }
  630. ALLOCN(pathname, 0, 100);
  631. if(mygetwd(pathname, 99) == 0) {
  632. ALLOCN(pathname, 100, 900);
  633. if(mygetwd(pathname, 999) == 0)
  634. strcpy(pathname, "/???");
  635. }
  636. }
  637. void
  638. syminit(Sym *s)
  639. {
  640. s->type = LNAME;
  641. s->value = 0;
  642. }
  643. void
  644. cclean(void)
  645. {
  646. outcode(AEND, &nullgen, NREG, &nullgen);
  647. Bflush(&obuf);
  648. }
  649. void
  650. zname(char *n, int t, int s)
  651. {
  652. Bputc(&obuf, ANAME);
  653. Bputc(&obuf, ANAME>>8);
  654. Bputc(&obuf, t); /* type */
  655. Bputc(&obuf, s); /* sym */
  656. while(*n) {
  657. Bputc(&obuf, *n);
  658. n++;
  659. }
  660. Bputc(&obuf, 0);
  661. }
  662. void
  663. zaddr(Gen *a, int s)
  664. {
  665. int32_t l;
  666. int i;
  667. char *n;
  668. Ieee e;
  669. Bputc(&obuf, a->type);
  670. Bputc(&obuf, a->reg);
  671. Bputc(&obuf, s);
  672. Bputc(&obuf, a->name);
  673. switch(a->type) {
  674. default:
  675. print("unknown type %d\n", a->type);
  676. exits("arg");
  677. case D_NONE:
  678. case D_REG:
  679. case D_FREG:
  680. case D_CREG:
  681. case D_FPSCR:
  682. case D_MSR:
  683. case D_SREG:
  684. case D_OPT:
  685. break;
  686. case D_DCR:
  687. case D_SPR:
  688. case D_OREG:
  689. case D_CONST:
  690. case D_BRANCH:
  691. l = a->offset;
  692. Bputc(&obuf, l);
  693. Bputc(&obuf, l>>8);
  694. Bputc(&obuf, l>>16);
  695. Bputc(&obuf, l>>24);
  696. break;
  697. case D_SCONST:
  698. n = a->sval;
  699. for(i=0; i<NSNAME; i++) {
  700. Bputc(&obuf, *n);
  701. n++;
  702. }
  703. break;
  704. case D_FCONST:
  705. ieeedtod(&e, a->dval);
  706. Bputc(&obuf, e.l);
  707. Bputc(&obuf, e.l>>8);
  708. Bputc(&obuf, e.l>>16);
  709. Bputc(&obuf, e.l>>24);
  710. Bputc(&obuf, e.h);
  711. Bputc(&obuf, e.h>>8);
  712. Bputc(&obuf, e.h>>16);
  713. Bputc(&obuf, e.h>>24);
  714. break;
  715. }
  716. }
  717. int
  718. outsim(Gen *g)
  719. {
  720. Sym *s;
  721. int sno, t;
  722. s = g->sym;
  723. if(s == S)
  724. return 0;
  725. sno = s->sym;
  726. if(sno < 0 || sno >= NSYM)
  727. sno = 0;
  728. t = g->name;
  729. if(h[sno].type == t && h[sno].sym == s)
  730. return sno;
  731. zname(s->name, t, sym);
  732. s->sym = sym;
  733. h[sym].sym = s;
  734. h[sym].type = t;
  735. sno = sym;
  736. sym++;
  737. if(sym >= NSYM)
  738. sym = 1;
  739. return sno;
  740. }
  741. void
  742. outcode(int a, Gen *g1, int reg, Gen *g2)
  743. {
  744. int sf, st;
  745. if(a != AGLOBL && a != ADATA)
  746. pc++;
  747. if(pass == 1)
  748. return;
  749. if(g1->xreg != NREG) {
  750. if(reg != NREG || g2->xreg != NREG)
  751. yyerror("bad addressing modes");
  752. reg = g1->xreg;
  753. } else
  754. if(g2->xreg != NREG) {
  755. if(reg != NREG)
  756. yyerror("bad addressing modes");
  757. reg = g2->xreg;
  758. }
  759. do {
  760. sf = outsim(g1);
  761. st = outsim(g2);
  762. } while(sf != 0 && st == sf);
  763. Bputc(&obuf, a);
  764. Bputc(&obuf, a>>8);
  765. Bputc(&obuf, reg|nosched);
  766. Bputc(&obuf, lineno);
  767. Bputc(&obuf, lineno>>8);
  768. Bputc(&obuf, lineno>>16);
  769. Bputc(&obuf, lineno>>24);
  770. zaddr(g1, sf);
  771. zaddr(g2, st);
  772. }
  773. void
  774. outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
  775. {
  776. int s1, s2, s3, flag;
  777. if(a != AGLOBL && a != ADATA)
  778. pc++;
  779. if(pass == 1)
  780. return;
  781. do {
  782. s1 = outsim(g1);
  783. s2 = outsim(g2);
  784. s3 = outsim(g3);
  785. } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
  786. flag = 0;
  787. if(g2->type != D_NONE)
  788. flag = 0x40; /* flags extra operand */
  789. Bputc(&obuf, a);
  790. Bputc(&obuf, a>>8);
  791. Bputc(&obuf, reg | nosched | flag);
  792. Bputc(&obuf, lineno);
  793. Bputc(&obuf, lineno>>8);
  794. Bputc(&obuf, lineno>>16);
  795. Bputc(&obuf, lineno>>24);
  796. zaddr(g1, s1);
  797. if(flag)
  798. zaddr(g2, s2);
  799. zaddr(g3, s3);
  800. }
  801. void
  802. outhist(void)
  803. {
  804. Gen g;
  805. Hist *h;
  806. char *p, *q, *op, c;
  807. int n;
  808. g = nullgen;
  809. c = pathchar();
  810. for(h = hist; h != H; h = h->link) {
  811. p = h->name;
  812. op = 0;
  813. /* on windows skip drive specifier in pathname */
  814. if(systemtype(Windows) && p && p[1] == ':'){
  815. p += 2;
  816. c = *p;
  817. }
  818. if(p && p[0] != c && h->offset == 0 && pathname){
  819. /* on windows skip drive specifier in pathname */
  820. if(systemtype(Windows) && pathname[1] == ':') {
  821. op = p;
  822. p = pathname+2;
  823. c = *p;
  824. } else if(pathname[0] == c){
  825. op = p;
  826. p = pathname;
  827. }
  828. }
  829. while(p) {
  830. q = strchr(p, c);
  831. if(q) {
  832. n = q-p;
  833. if(n == 0){
  834. n = 1; /* leading "/" */
  835. *p = '/'; /* don't emit "\" on windows */
  836. }
  837. q++;
  838. } else {
  839. n = strlen(p);
  840. q = 0;
  841. }
  842. if(n) {
  843. Bputc(&obuf, ANAME);
  844. Bputc(&obuf, ANAME>>8);
  845. Bputc(&obuf, D_FILE); /* type */
  846. Bputc(&obuf, 1); /* sym */
  847. Bputc(&obuf, '<');
  848. Bwrite(&obuf, p, n);
  849. Bputc(&obuf, 0);
  850. }
  851. p = q;
  852. if(p == 0 && op) {
  853. p = op;
  854. op = 0;
  855. }
  856. }
  857. g.offset = h->offset;
  858. Bputc(&obuf, AHISTORY);
  859. Bputc(&obuf, AHISTORY>>8);
  860. Bputc(&obuf, 0);
  861. Bputc(&obuf, h->line);
  862. Bputc(&obuf, h->line>>8);
  863. Bputc(&obuf, h->line>>16);
  864. Bputc(&obuf, h->line>>24);
  865. zaddr(&nullgen, 0);
  866. zaddr(&g, 0);
  867. }
  868. }
  869. #include "../cc/lexbody"
  870. #include "../cc/macbody"
  871. #include "../cc/compat"