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