optab.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. #include "limbo.h"
  2. uchar movetab[Mend][Tend] =
  3. {
  4. /* Mas */
  5. {
  6. /* Tnone */ 0,
  7. /* Tadt */ IMOVM,
  8. /* Tadtpick */ IMOVM,
  9. /* Tarray */ IMOVP,
  10. /* Tbig */ IMOVL,
  11. /* Tbyte */ IMOVB,
  12. /* Tchan */ IMOVP,
  13. /* Treal */ IMOVF,
  14. /* Tfn */ 0,
  15. /* Tint */ IMOVW,
  16. /* Tlist */ IMOVP,
  17. /* Tmodule */ IMOVP,
  18. /* Tref */ IMOVP,
  19. /* Tstring */ IMOVP,
  20. /* Ttuple */ IMOVM,
  21. /* Texception */ IMOVM,
  22. /* Tfix */ IMOVW,
  23. /* Tpoly */ IMOVP,
  24. /* Tainit */ 0,
  25. /* Talt */ 0,
  26. /* Tany */ IMOVP,
  27. /* Tarrow */ 0,
  28. /* Tcase */ 0,
  29. /* Tcasel */ 0,
  30. /* Tcasec */ 0,
  31. /* Tdot */ 0,
  32. /* Terror */ 0,
  33. /* Tgoto */ 0,
  34. /* Tid */ 0,
  35. },
  36. /* Mcons */
  37. {
  38. /* Tnone */ 0,
  39. /* Tadt */ ICONSM,
  40. /* Tadtpick */ 0,
  41. /* Tarray */ ICONSP,
  42. /* Tbig */ ICONSL,
  43. /* Tbyte */ ICONSB,
  44. /* Tchan */ ICONSP,
  45. /* Treal */ ICONSF,
  46. /* Tfn */ 0,
  47. /* Tint */ ICONSW,
  48. /* Tlist */ ICONSP,
  49. /* Tmodule */ ICONSP,
  50. /* Tref */ ICONSP,
  51. /* Tstring */ ICONSP,
  52. /* Ttuple */ ICONSM,
  53. /* Texception */ ICONSM,
  54. /* Tfix */ ICONSW,
  55. /* Tpoly */ ICONSP,
  56. /* Tainit */ 0,
  57. /* Talt */ 0,
  58. /* Tany */ ICONSP,
  59. /* Tarrow */ 0,
  60. /* Tcase */ 0,
  61. /* Tcasel */ 0,
  62. /* Tcasec */ 0,
  63. /* Tdot */ 0,
  64. /* Terror */ 0,
  65. /* Tgoto */ 0,
  66. /* Tid */ 0,
  67. },
  68. /* Mhd */
  69. {
  70. /* Tnone */ 0,
  71. /* Tadt */ IHEADM,
  72. /* Tadtpick */ 0,
  73. /* Tarray */ IHEADP,
  74. /* Tbig */ IHEADL,
  75. /* Tbyte */ IHEADB,
  76. /* Tchan */ IHEADP,
  77. /* Treal */ IHEADF,
  78. /* Tfn */ 0,
  79. /* Tint */ IHEADW,
  80. /* Tlist */ IHEADP,
  81. /* Tmodule */ IHEADP,
  82. /* Tref */ IHEADP,
  83. /* Tstring */ IHEADP,
  84. /* Ttuple */ IHEADM,
  85. /* Texception */ IHEADM,
  86. /* Tfix */ IHEADW,
  87. /* Tpoly */ IHEADP,
  88. /* Tainit */ 0,
  89. /* Talt */ 0,
  90. /* Tany */ IHEADP,
  91. /* Tarrow */ 0,
  92. /* Tcase */ 0,
  93. /* Tcasel */ 0,
  94. /* Tcasec */ 0,
  95. /* Tdot*/ 0,
  96. /* Terror */ 0,
  97. /* Tgoto */ 0,
  98. /* Tid */ 0,
  99. },
  100. /* Mtl */
  101. {
  102. /* Tnone */ 0,
  103. /* Tadt */ 0,
  104. /* Tadtpick */ 0,
  105. /* Tarray */ 0,
  106. /* Tbig */ 0,
  107. /* Tbyte */ 0,
  108. /* Tchan */ 0,
  109. /* Treal */ 0,
  110. /* Tfn */ 0,
  111. /* Tint */ 0,
  112. /* Tlist */ ITAIL,
  113. /* Tmodule */ 0,
  114. /* Tref */ 0,
  115. /* Tstring */ 0,
  116. /* Ttuple */ 0,
  117. /* Texception */ 0,
  118. /* Tfix */ 0,
  119. /* Tpoly */ 0,
  120. /* Tainit */ 0,
  121. /* Talt */ 0,
  122. /* Tany */ 0,
  123. /* Tarrow */ 0,
  124. /* Tcase */ 0,
  125. /* Tcasel */ 0,
  126. /* Tcasec */ 0,
  127. /* Tdot */ 0,
  128. /* Terror */ 0,
  129. /* Tgoto */ 0,
  130. /* Tid */ 0,
  131. },
  132. };
  133. uchar chantab[Tend] =
  134. {
  135. /* Tnone */ 0,
  136. /* Tadt */ INEWCM,
  137. /* Tadtpick */ 0,
  138. /* Tarray */ INEWCP,
  139. /* Tbig */ INEWCL,
  140. /* Tbyte */ INEWCB,
  141. /* Tchan */ INEWCP,
  142. /* Treal */ INEWCF,
  143. /* Tfn */ 0,
  144. /* Tint */ INEWCW,
  145. /* Tlist */ INEWCP,
  146. /* Tmodule */ INEWCP,
  147. /* Tref */ INEWCP,
  148. /* Tstring */ INEWCP,
  149. /* Ttuple */ INEWCM,
  150. /* Texception */ INEWCM,
  151. /* Tfix */ INEWCW,
  152. /* Tpoly */ INEWCP,
  153. /* Tainit */ 0,
  154. /* Talt */ 0,
  155. /* Tany */ INEWCP,
  156. /* Tarrow */ 0,
  157. /* Tcase */ 0,
  158. /* Tcasel */ 0,
  159. /* Tcasec */ 0,
  160. /* Tdot */ 0,
  161. /* Terror */ 0,
  162. /* Tgoto */ 0,
  163. /* Tid */ 0,
  164. };
  165. uchar disoptab[Oend+1][7] = {
  166. /* opcode default byte word big real string fixed */
  167. {0},
  168. /* Oadd */ {0, IADDB, IADDW, IADDL, IADDF, IADDC, IADDW,},
  169. /* Oaddas */ {0, IADDB, IADDW, IADDL, IADDF, IADDC, IADDW,},
  170. /* Oadr */ {0},
  171. /* Oadtdecl */ {0},
  172. /* Oalt */ {0},
  173. /* Oand */ {0, IANDB, IANDW, IANDL, 0, 0, 0,},
  174. /* Oandand */ {0},
  175. /* Oandas */ {0, IANDB, IANDW, IANDL, 0, 0, 0,},
  176. /* Oarray */ {0},
  177. /* Oas */ {0},
  178. /* Obreak */ {0},
  179. /* Ocall */ {0},
  180. /* Ocase */ {0},
  181. /* Ocast */ {0},
  182. /* Ochan */ {0},
  183. /* Ocomma */ {0},
  184. /* Ocomp */ {0},
  185. /* Ocondecl */ {0},
  186. /* Ocons */ {0},
  187. /* Oconst */ {0},
  188. /* Ocont */ {0},
  189. /* Odas */ {0},
  190. /* Odec */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,},
  191. /* Odiv */ {0, IDIVB, IDIVW, IDIVL, IDIVF, 0, IDIVX,},
  192. /* Odivas */ {0, IDIVB, IDIVW, IDIVL, IDIVF, 0, IDIVX,},
  193. /* Odo */ {0},
  194. /* Odot */ {0},
  195. /* Oelem */ {0},
  196. /* Oeq */ {IBEQW, IBEQB, IBEQW, IBEQL, IBEQF, IBEQC, IBEQW,},
  197. /* Oexcept */ {0},
  198. /* Oexdecl */ {0},
  199. /* Oexit */ {0},
  200. /* Oexp */ {0, 0, IEXPW, IEXPL, IEXPF, 0, 0,},
  201. /* Oexpas */ {0, 0, IEXPW, IEXPL, IEXPF, 0, 0,},
  202. /* Oexstmt */ {0},
  203. /* Ofielddecl */{0},
  204. /* Ofnptr */ {0},
  205. /* Ofor */ {0},
  206. /* Ofunc */ {0},
  207. /* Ogeq */ {0, IBGEB, IBGEW, IBGEL, IBGEF, IBGEC, IBGEW,},
  208. /* Ogt */ {0, IBGTB, IBGTW, IBGTL, IBGTF, IBGTC, IBGTW,},
  209. /* Ohd */ {0},
  210. /* Oif */ {0},
  211. /* Oimport */ {0},
  212. /* Oinc */ {0, IADDB, IADDW, IADDL, IADDF, 0, IADDW,},
  213. /* Oind */ {0},
  214. /* Oindex */ {0,},
  215. /* Oinds */ {0, 0, IINDC, 0, 0, 0, 0,},
  216. /* Oindx */ {0, 0, IINDX, 0, 0, 0, 0,},
  217. /* Oinv */ {0},
  218. /* Ojmp */ {0},
  219. /* Olabel */ {0},
  220. /* Olen */ {ILENA, 0, 0, 0, 0, ILENC, 0,},
  221. /* Oleq */ {0, IBLEB, IBLEW, IBLEL, IBLEF, IBLEC, IBLEW,},
  222. /* Oload */ {0},
  223. /* Olsh */ {0, ISHLB, ISHLW, ISHLL, 0, 0, 0,},
  224. /* Olshas */ {0, ISHLB, ISHLW, ISHLL, 0, 0, 0,},
  225. /* Olt */ {0, IBLTB, IBLTW, IBLTL, IBLTF, IBLTC, IBLTW,},
  226. /* Omdot */ {0},
  227. /* Omod */ {0, IMODB, IMODW, IMODL, 0, 0, 0,},
  228. /* Omodas */ {0, IMODB, IMODW, IMODL, 0, 0, 0,},
  229. /* Omoddecl */ {0},
  230. /* Omul */ {0, IMULB, IMULW, IMULL, IMULF, 0, IMULX,},
  231. /* Omulas */ {0, IMULB, IMULW, IMULL, IMULF, 0, IMULX,},
  232. /* Oname */ {0},
  233. /* Oneg */ {0, 0, 0, 0, INEGF, 0, 0,},
  234. /* Oneq */ {IBNEW, IBNEB, IBNEW, IBNEL, IBNEF, IBNEC, IBNEW,},
  235. /* Onot */ {0},
  236. /* Onothing */ {0},
  237. /* Oor */ {0, IORB, IORW, IORL, 0, 0, 0,},
  238. /* Ooras */ {0, IORB, IORW, IORL, 0, 0, 0,},
  239. /* Ooror */ {0},
  240. /* Opick */ {0},
  241. /* Opickdecl */ {0},
  242. /* Opredec */ {0},
  243. /* Opreinc */ {0},
  244. /* Oraise */ {0},
  245. /* Orange */ {0},
  246. /* Orcv */ {0},
  247. /* Oref */ {0},
  248. /* Oret */ {0},
  249. /* Orsh */ {0, ISHRB, ISHRW, ISHRL, 0, 0, 0,},
  250. /* Orshas */ {0, ISHRB, ISHRW, ISHRL, 0, 0, 0,},
  251. /* Oscope */ {0},
  252. /* Oself */ {0},
  253. /* Oseq */ {0},
  254. /* Oslice */ {ISLICEA,0, 0, 0, 0, ISLICEC, 0,},
  255. /* Osnd */ {0},
  256. /* Ospawn */ {0},
  257. /* Osub */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,},
  258. /* Osubas */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,},
  259. /* Otagof */ {0},
  260. /* Otl */ {0},
  261. /* Otuple */ {0},
  262. /* Otype */ {0},
  263. /* Otypedecl */ {0},
  264. /* Oused */ {0},
  265. /* Ovardecl */ {0},
  266. /* Ovardecli */ {0},
  267. /* Owild */ {0},
  268. /* Oxor */ {0, IXORB, IXORW, IXORL, 0, 0, 0,},
  269. /* Oxoras */ {0, IXORB, IXORW, IXORL, 0, 0, 0,},
  270. /* Oend */ {0}
  271. };
  272. int setisused[] = {
  273. Oas,
  274. Odas,
  275. Oaddas,
  276. Osubas,
  277. Omulas,
  278. Odivas,
  279. Omodas,
  280. Oexpas,
  281. Oandas,
  282. Ooras,
  283. Oxoras,
  284. Olshas,
  285. Onothing,
  286. Orshas,
  287. Oinc,
  288. Odec,
  289. Opreinc,
  290. Opredec,
  291. Ocall,
  292. Oraise,
  293. Ospawn,
  294. Osnd,
  295. Orcv,
  296. -1
  297. };
  298. int setsideeffect[] = {
  299. Oas,
  300. Odas,
  301. Oaddas,
  302. Osubas,
  303. Omulas,
  304. Odivas,
  305. Omodas,
  306. Oexpas,
  307. Oandas,
  308. Ooras,
  309. Oxoras,
  310. Olshas,
  311. Orshas,
  312. Oinc,
  313. Odec,
  314. Opreinc,
  315. Opredec,
  316. Ocall,
  317. Oraise,
  318. Ospawn,
  319. Osnd,
  320. Orcv,
  321. Oadr,
  322. Oarray,
  323. Ocast,
  324. Ochan,
  325. Ocons,
  326. Odiv,
  327. Odot,
  328. Oind,
  329. Oindex,
  330. Oinds,
  331. Oindx,
  332. Olen,
  333. Oload,
  334. Omod,
  335. Oref,
  336. -1
  337. };
  338. char *opname[Oend+1] = {
  339. "unknown",
  340. /* Oadd */ "+",
  341. /* Oaddas */ "+=",
  342. /* Oadr */ "adr",
  343. /* Oadtdecl */ "adtdecl",
  344. /* Oalt */ "alt",
  345. /* Oand */ "&",
  346. /* Oandand */ "&&",
  347. /* Oandas */ "&=",
  348. /* Oarray */ "array",
  349. /* Oas */ "=",
  350. /* Obreak */ "break",
  351. /* Ocall */ "call",
  352. /* Ocase */ "case",
  353. /* Ocast */ "cast",
  354. /* Ochan */ "chan",
  355. /* Ocomma */ ",",
  356. /* Ocomp */ "~",
  357. /* Ocondecl */ "condecl",
  358. /* Ocons */ "::",
  359. /* Oconst */ "const",
  360. /* Ocont */ "continue",
  361. /* Odas */ ":=",
  362. /* Odec */ "--",
  363. /* Odiv */ "/",
  364. /* Odivas */ "/=",
  365. /* Odo */ "do",
  366. /* Odot */ ".",
  367. /* Oelem */ "elem",
  368. /* Oeq */ "==",
  369. /* Oexcept */ "except",
  370. /* Oexdecl */ "exdecl",
  371. /* Oexit */ "exit",
  372. /* Oexp */ "**",
  373. /* Oexpas */ "**=",
  374. /* Oexstmt */ "exstat",
  375. /* Ofielddecl */"fielddecl",
  376. /* Ofnptr */ "fnptr",
  377. /* Ofor */ "for",
  378. /* Ofunc */ "fn(){}",
  379. /* Ogeq */ ">=",
  380. /* Ogt */ ">",
  381. /* Ohd */ "hd",
  382. /* Oif */ "if",
  383. /* Oimport */ "import",
  384. /* Oinc */ "++",
  385. /* Oind */ "*",
  386. /* Oindex */ "index",
  387. /* Oinds */ "inds",
  388. /* Oindx */ "indx",
  389. /* Oinv */ "inv",
  390. /* Ojmp */ "jmp",
  391. /* Olabel */ "label",
  392. /* Olen */ "len",
  393. /* Oleq */ "<=",
  394. /* Oload */ "load",
  395. /* Olsh */ "<<",
  396. /* Olshas */ "<<=",
  397. /* Olt */ "<",
  398. /* Omdot */ "->",
  399. /* Omod */ "%",
  400. /* Omodas */ "%=",
  401. /* Omoddecl */ "moddecl",
  402. /* Omul */ "*",
  403. /* Omulas */ "*=",
  404. /* Oname */ "name",
  405. /* Oneg */ "-",
  406. /* Oneq */ "!=",
  407. /* Onot */ "!",
  408. /* Onothing */ "nothing",
  409. /* Oor */ "|",
  410. /* Ooras */ "|=",
  411. /* Ooror */ "||",
  412. /* Opick */ "pick",
  413. /* Opickdecl */ "pickdecl",
  414. /* Opredec */ "--",
  415. /* Opreinc */ "++",
  416. /* Oraise */ "raise",
  417. /* Orange */ "range",
  418. /* Orcv */ "<-",
  419. /* Oref */ "ref",
  420. /* Oret */ "return",
  421. /* Orsh */ ">>",
  422. /* Orshas */ ">>=",
  423. /* Oscope */ "scope",
  424. /* Oself */ "self",
  425. /* Oseq */ "seq",
  426. /* Oslice */ "slice",
  427. /* Osnd */ "<-=",
  428. /* Ospawn */ "spawn",
  429. /* Osub */ "-",
  430. /* Osubas */ "-=",
  431. /* Otl */ "tagof",
  432. /* Otl */ "tl",
  433. /* Otuple */ "tuple",
  434. /* Otype */ "type",
  435. /* Otypedecl */ "typedecl",
  436. /* Oused */ "used",
  437. /* Ovardecl */ "vardecl",
  438. /* Ovardecli */ "vardecli",
  439. /* Owild */ "*",
  440. /* Oxor */ "^",
  441. /* Oxoras */ "^=",
  442. /* Oend */ "unknown"
  443. };
  444. int setisbyteinst[] = {
  445. IMULB,
  446. ISUBB,
  447. IADDB,
  448. IDIVB,
  449. IORB,
  450. IXORB,
  451. ISHLB,
  452. ISHRB,
  453. IMODB,
  454. IANDB,
  455. IBEQB,
  456. IBNEB,
  457. IBLTB,
  458. IBLEB,
  459. IBGTB,
  460. IBGEB,
  461. -1
  462. };
  463. char *instname[256] = {
  464. "nop",
  465. "alt",
  466. "nbalt",
  467. "goto",
  468. "call",
  469. "frame",
  470. "spawn",
  471. "runt",
  472. "load",
  473. "mcall",
  474. "mspawn",
  475. "mframe",
  476. "ret",
  477. "jmp",
  478. "case",
  479. "exit",
  480. "new",
  481. "newa",
  482. "newcb",
  483. "newcw",
  484. "newcf",
  485. "newcp",
  486. "newcm",
  487. "newcmp",
  488. "send",
  489. "recv",
  490. "consb",
  491. "consw",
  492. "consp",
  493. "consf",
  494. "consm",
  495. "consmp",
  496. "headb",
  497. "headw",
  498. "headp",
  499. "headf",
  500. "headm",
  501. "headmp",
  502. "tail",
  503. "lea",
  504. "indx",
  505. "movp",
  506. "movm",
  507. "movmp",
  508. "movb",
  509. "movw",
  510. "movf",
  511. "cvtbw",
  512. "cvtwb",
  513. "cvtfw",
  514. "cvtwf",
  515. "cvtca",
  516. "cvtac",
  517. "cvtwc",
  518. "cvtcw",
  519. "cvtfc",
  520. "cvtcf",
  521. "addb",
  522. "addw",
  523. "addf",
  524. "subb",
  525. "subw",
  526. "subf",
  527. "mulb",
  528. "mulw",
  529. "mulf",
  530. "divb",
  531. "divw",
  532. "divf",
  533. "modw",
  534. "modb",
  535. "andb",
  536. "andw",
  537. "orb",
  538. "orw",
  539. "xorb",
  540. "xorw",
  541. "shlb",
  542. "shlw",
  543. "shrb",
  544. "shrw",
  545. "insc",
  546. "indc",
  547. "addc",
  548. "lenc",
  549. "lena",
  550. "lenl",
  551. "beqb",
  552. "bneb",
  553. "bltb",
  554. "bleb",
  555. "bgtb",
  556. "bgeb",
  557. "beqw",
  558. "bnew",
  559. "bltw",
  560. "blew",
  561. "bgtw",
  562. "bgew",
  563. "beqf",
  564. "bnef",
  565. "bltf",
  566. "blef",
  567. "bgtf",
  568. "bgef",
  569. "beqc",
  570. "bnec",
  571. "bltc",
  572. "blec",
  573. "bgtc",
  574. "bgec",
  575. "slicea",
  576. "slicela",
  577. "slicec",
  578. "indw",
  579. "indf",
  580. "indb",
  581. "negf",
  582. "movl",
  583. "addl",
  584. "subl",
  585. "divl",
  586. "modl",
  587. "mull",
  588. "andl",
  589. "orl",
  590. "xorl",
  591. "shll",
  592. "shrl",
  593. "bnel",
  594. "bltl",
  595. "blel",
  596. "bgtl",
  597. "bgel",
  598. "beql",
  599. "cvtlf",
  600. "cvtfl",
  601. "cvtlw",
  602. "cvtwl",
  603. "cvtlc",
  604. "cvtcl",
  605. "headl",
  606. "consl",
  607. "newcl",
  608. "casec",
  609. "indl",
  610. "movpc",
  611. "tcmp",
  612. "mnewz",
  613. "cvtrf",
  614. "cvtfr",
  615. "cvtws",
  616. "cvtsw",
  617. "lsrw",
  618. "lsrl",
  619. "eclr",
  620. "newz",
  621. "newaz",
  622. "raise",
  623. "casel",
  624. "mulx",
  625. "divx",
  626. "cvtxx",
  627. "mulx0",
  628. "divx0",
  629. "cvtxx0",
  630. "mulx1",
  631. "divx1",
  632. "cvtxx1",
  633. "cvtfx",
  634. "cvtxf",
  635. "expw",
  636. "expl",
  637. "expf",
  638. "self",
  639. };