123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658 |
- #include "limbo.h"
- uchar movetab[Mend][Tend] =
- {
- /* Mas */
- {
- /* Tnone */ 0,
- /* Tadt */ IMOVM,
- /* Tadtpick */ IMOVM,
- /* Tarray */ IMOVP,
- /* Tbig */ IMOVL,
- /* Tbyte */ IMOVB,
- /* Tchan */ IMOVP,
- /* Treal */ IMOVF,
- /* Tfn */ 0,
- /* Tint */ IMOVW,
- /* Tlist */ IMOVP,
- /* Tmodule */ IMOVP,
- /* Tref */ IMOVP,
- /* Tstring */ IMOVP,
- /* Ttuple */ IMOVM,
- /* Texception */ IMOVM,
- /* Tfix */ IMOVW,
- /* Tpoly */ IMOVP,
- /* Tainit */ 0,
- /* Talt */ 0,
- /* Tany */ IMOVP,
- /* Tarrow */ 0,
- /* Tcase */ 0,
- /* Tcasel */ 0,
- /* Tcasec */ 0,
- /* Tdot */ 0,
- /* Terror */ 0,
- /* Tgoto */ 0,
- /* Tid */ 0,
- },
- /* Mcons */
- {
- /* Tnone */ 0,
- /* Tadt */ ICONSM,
- /* Tadtpick */ 0,
- /* Tarray */ ICONSP,
- /* Tbig */ ICONSL,
- /* Tbyte */ ICONSB,
- /* Tchan */ ICONSP,
- /* Treal */ ICONSF,
- /* Tfn */ 0,
- /* Tint */ ICONSW,
- /* Tlist */ ICONSP,
- /* Tmodule */ ICONSP,
- /* Tref */ ICONSP,
- /* Tstring */ ICONSP,
- /* Ttuple */ ICONSM,
- /* Texception */ ICONSM,
- /* Tfix */ ICONSW,
- /* Tpoly */ ICONSP,
- /* Tainit */ 0,
- /* Talt */ 0,
- /* Tany */ ICONSP,
- /* Tarrow */ 0,
- /* Tcase */ 0,
- /* Tcasel */ 0,
- /* Tcasec */ 0,
- /* Tdot */ 0,
- /* Terror */ 0,
- /* Tgoto */ 0,
- /* Tid */ 0,
- },
- /* Mhd */
- {
- /* Tnone */ 0,
- /* Tadt */ IHEADM,
- /* Tadtpick */ 0,
- /* Tarray */ IHEADP,
- /* Tbig */ IHEADL,
- /* Tbyte */ IHEADB,
- /* Tchan */ IHEADP,
- /* Treal */ IHEADF,
- /* Tfn */ 0,
- /* Tint */ IHEADW,
- /* Tlist */ IHEADP,
- /* Tmodule */ IHEADP,
- /* Tref */ IHEADP,
- /* Tstring */ IHEADP,
- /* Ttuple */ IHEADM,
- /* Texception */ IHEADM,
- /* Tfix */ IHEADW,
- /* Tpoly */ IHEADP,
- /* Tainit */ 0,
- /* Talt */ 0,
- /* Tany */ IHEADP,
- /* Tarrow */ 0,
- /* Tcase */ 0,
- /* Tcasel */ 0,
- /* Tcasec */ 0,
- /* Tdot*/ 0,
- /* Terror */ 0,
- /* Tgoto */ 0,
- /* Tid */ 0,
- },
- /* Mtl */
- {
- /* Tnone */ 0,
- /* Tadt */ 0,
- /* Tadtpick */ 0,
- /* Tarray */ 0,
- /* Tbig */ 0,
- /* Tbyte */ 0,
- /* Tchan */ 0,
- /* Treal */ 0,
- /* Tfn */ 0,
- /* Tint */ 0,
- /* Tlist */ ITAIL,
- /* Tmodule */ 0,
- /* Tref */ 0,
- /* Tstring */ 0,
- /* Ttuple */ 0,
- /* Texception */ 0,
- /* Tfix */ 0,
- /* Tpoly */ 0,
- /* Tainit */ 0,
- /* Talt */ 0,
- /* Tany */ 0,
- /* Tarrow */ 0,
- /* Tcase */ 0,
- /* Tcasel */ 0,
- /* Tcasec */ 0,
- /* Tdot */ 0,
- /* Terror */ 0,
- /* Tgoto */ 0,
- /* Tid */ 0,
- },
- };
- uchar chantab[Tend] =
- {
- /* Tnone */ 0,
- /* Tadt */ INEWCM,
- /* Tadtpick */ 0,
- /* Tarray */ INEWCP,
- /* Tbig */ INEWCL,
- /* Tbyte */ INEWCB,
- /* Tchan */ INEWCP,
- /* Treal */ INEWCF,
- /* Tfn */ 0,
- /* Tint */ INEWCW,
- /* Tlist */ INEWCP,
- /* Tmodule */ INEWCP,
- /* Tref */ INEWCP,
- /* Tstring */ INEWCP,
- /* Ttuple */ INEWCM,
- /* Texception */ INEWCM,
- /* Tfix */ INEWCW,
- /* Tpoly */ INEWCP,
- /* Tainit */ 0,
- /* Talt */ 0,
- /* Tany */ INEWCP,
- /* Tarrow */ 0,
- /* Tcase */ 0,
- /* Tcasel */ 0,
- /* Tcasec */ 0,
- /* Tdot */ 0,
- /* Terror */ 0,
- /* Tgoto */ 0,
- /* Tid */ 0,
- };
- uchar disoptab[Oend+1][7] = {
- /* opcode default byte word big real string fixed */
- {0},
- /* Oadd */ {0, IADDB, IADDW, IADDL, IADDF, IADDC, IADDW,},
- /* Oaddas */ {0, IADDB, IADDW, IADDL, IADDF, IADDC, IADDW,},
- /* Oadr */ {0},
- /* Oadtdecl */ {0},
- /* Oalt */ {0},
- /* Oand */ {0, IANDB, IANDW, IANDL, 0, 0, 0,},
- /* Oandand */ {0},
- /* Oandas */ {0, IANDB, IANDW, IANDL, 0, 0, 0,},
- /* Oarray */ {0},
- /* Oas */ {0},
- /* Obreak */ {0},
- /* Ocall */ {0},
- /* Ocase */ {0},
- /* Ocast */ {0},
- /* Ochan */ {0},
- /* Ocomma */ {0},
- /* Ocomp */ {0},
- /* Ocondecl */ {0},
- /* Ocons */ {0},
- /* Oconst */ {0},
- /* Ocont */ {0},
- /* Odas */ {0},
- /* Odec */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,},
- /* Odiv */ {0, IDIVB, IDIVW, IDIVL, IDIVF, 0, IDIVX,},
- /* Odivas */ {0, IDIVB, IDIVW, IDIVL, IDIVF, 0, IDIVX,},
- /* Odo */ {0},
- /* Odot */ {0},
- /* Oelem */ {0},
- /* Oeq */ {IBEQW, IBEQB, IBEQW, IBEQL, IBEQF, IBEQC, IBEQW,},
- /* Oexcept */ {0},
- /* Oexdecl */ {0},
- /* Oexit */ {0},
- /* Oexp */ {0, 0, IEXPW, IEXPL, IEXPF, 0, 0,},
- /* Oexpas */ {0, 0, IEXPW, IEXPL, IEXPF, 0, 0,},
- /* Oexstmt */ {0},
- /* Ofielddecl */{0},
- /* Ofnptr */ {0},
- /* Ofor */ {0},
- /* Ofunc */ {0},
- /* Ogeq */ {0, IBGEB, IBGEW, IBGEL, IBGEF, IBGEC, IBGEW,},
- /* Ogt */ {0, IBGTB, IBGTW, IBGTL, IBGTF, IBGTC, IBGTW,},
- /* Ohd */ {0},
- /* Oif */ {0},
- /* Oimport */ {0},
- /* Oinc */ {0, IADDB, IADDW, IADDL, IADDF, 0, IADDW,},
- /* Oind */ {0},
- /* Oindex */ {0,},
- /* Oinds */ {0, 0, IINDC, 0, 0, 0, 0,},
- /* Oindx */ {0, 0, IINDX, 0, 0, 0, 0,},
- /* Oinv */ {0},
- /* Ojmp */ {0},
- /* Olabel */ {0},
- /* Olen */ {ILENA, 0, 0, 0, 0, ILENC, 0,},
- /* Oleq */ {0, IBLEB, IBLEW, IBLEL, IBLEF, IBLEC, IBLEW,},
- /* Oload */ {0},
- /* Olsh */ {0, ISHLB, ISHLW, ISHLL, 0, 0, 0,},
- /* Olshas */ {0, ISHLB, ISHLW, ISHLL, 0, 0, 0,},
- /* Olt */ {0, IBLTB, IBLTW, IBLTL, IBLTF, IBLTC, IBLTW,},
- /* Omdot */ {0},
- /* Omod */ {0, IMODB, IMODW, IMODL, 0, 0, 0,},
- /* Omodas */ {0, IMODB, IMODW, IMODL, 0, 0, 0,},
- /* Omoddecl */ {0},
- /* Omul */ {0, IMULB, IMULW, IMULL, IMULF, 0, IMULX,},
- /* Omulas */ {0, IMULB, IMULW, IMULL, IMULF, 0, IMULX,},
- /* Oname */ {0},
- /* Oneg */ {0, 0, 0, 0, INEGF, 0, 0,},
- /* Oneq */ {IBNEW, IBNEB, IBNEW, IBNEL, IBNEF, IBNEC, IBNEW,},
- /* Onot */ {0},
- /* Onothing */ {0},
- /* Oor */ {0, IORB, IORW, IORL, 0, 0, 0,},
- /* Ooras */ {0, IORB, IORW, IORL, 0, 0, 0,},
- /* Ooror */ {0},
- /* Opick */ {0},
- /* Opickdecl */ {0},
- /* Opredec */ {0},
- /* Opreinc */ {0},
- /* Oraise */ {0},
- /* Orange */ {0},
- /* Orcv */ {0},
- /* Oref */ {0},
- /* Oret */ {0},
- /* Orsh */ {0, ISHRB, ISHRW, ISHRL, 0, 0, 0,},
- /* Orshas */ {0, ISHRB, ISHRW, ISHRL, 0, 0, 0,},
- /* Oscope */ {0},
- /* Oself */ {0},
- /* Oseq */ {0},
- /* Oslice */ {ISLICEA,0, 0, 0, 0, ISLICEC, 0,},
- /* Osnd */ {0},
- /* Ospawn */ {0},
- /* Osub */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,},
- /* Osubas */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,},
- /* Otagof */ {0},
- /* Otl */ {0},
- /* Otuple */ {0},
- /* Otype */ {0},
- /* Otypedecl */ {0},
- /* Oused */ {0},
- /* Ovardecl */ {0},
- /* Ovardecli */ {0},
- /* Owild */ {0},
- /* Oxor */ {0, IXORB, IXORW, IXORL, 0, 0, 0,},
- /* Oxoras */ {0, IXORB, IXORW, IXORL, 0, 0, 0,},
- /* Oend */ {0}
- };
- int setisused[] = {
- Oas,
- Odas,
- Oaddas,
- Osubas,
- Omulas,
- Odivas,
- Omodas,
- Oexpas,
- Oandas,
- Ooras,
- Oxoras,
- Olshas,
- Onothing,
- Orshas,
- Oinc,
- Odec,
- Opreinc,
- Opredec,
- Ocall,
- Oraise,
- Ospawn,
- Osnd,
- Orcv,
- -1
- };
- int setsideeffect[] = {
- Oas,
- Odas,
- Oaddas,
- Osubas,
- Omulas,
- Odivas,
- Omodas,
- Oexpas,
- Oandas,
- Ooras,
- Oxoras,
- Olshas,
- Orshas,
- Oinc,
- Odec,
- Opreinc,
- Opredec,
- Ocall,
- Oraise,
- Ospawn,
- Osnd,
- Orcv,
- Oadr,
- Oarray,
- Ocast,
- Ochan,
- Ocons,
- Odiv,
- Odot,
- Oind,
- Oindex,
- Oinds,
- Oindx,
- Olen,
- Oload,
- Omod,
- Oref,
- -1
- };
- char *opname[Oend+1] = {
- "unknown",
- /* Oadd */ "+",
- /* Oaddas */ "+=",
- /* Oadr */ "adr",
- /* Oadtdecl */ "adtdecl",
- /* Oalt */ "alt",
- /* Oand */ "&",
- /* Oandand */ "&&",
- /* Oandas */ "&=",
- /* Oarray */ "array",
- /* Oas */ "=",
- /* Obreak */ "break",
- /* Ocall */ "call",
- /* Ocase */ "case",
- /* Ocast */ "cast",
- /* Ochan */ "chan",
- /* Ocomma */ ",",
- /* Ocomp */ "~",
- /* Ocondecl */ "condecl",
- /* Ocons */ "::",
- /* Oconst */ "const",
- /* Ocont */ "continue",
- /* Odas */ ":=",
- /* Odec */ "--",
- /* Odiv */ "/",
- /* Odivas */ "/=",
- /* Odo */ "do",
- /* Odot */ ".",
- /* Oelem */ "elem",
- /* Oeq */ "==",
- /* Oexcept */ "except",
- /* Oexdecl */ "exdecl",
- /* Oexit */ "exit",
- /* Oexp */ "**",
- /* Oexpas */ "**=",
- /* Oexstmt */ "exstat",
- /* Ofielddecl */"fielddecl",
- /* Ofnptr */ "fnptr",
- /* Ofor */ "for",
- /* Ofunc */ "fn(){}",
- /* Ogeq */ ">=",
- /* Ogt */ ">",
- /* Ohd */ "hd",
- /* Oif */ "if",
- /* Oimport */ "import",
- /* Oinc */ "++",
- /* Oind */ "*",
- /* Oindex */ "index",
- /* Oinds */ "inds",
- /* Oindx */ "indx",
- /* Oinv */ "inv",
- /* Ojmp */ "jmp",
- /* Olabel */ "label",
- /* Olen */ "len",
- /* Oleq */ "<=",
- /* Oload */ "load",
- /* Olsh */ "<<",
- /* Olshas */ "<<=",
- /* Olt */ "<",
- /* Omdot */ "->",
- /* Omod */ "%",
- /* Omodas */ "%=",
- /* Omoddecl */ "moddecl",
- /* Omul */ "*",
- /* Omulas */ "*=",
- /* Oname */ "name",
- /* Oneg */ "-",
- /* Oneq */ "!=",
- /* Onot */ "!",
- /* Onothing */ "nothing",
- /* Oor */ "|",
- /* Ooras */ "|=",
- /* Ooror */ "||",
- /* Opick */ "pick",
- /* Opickdecl */ "pickdecl",
- /* Opredec */ "--",
- /* Opreinc */ "++",
- /* Oraise */ "raise",
- /* Orange */ "range",
- /* Orcv */ "<-",
- /* Oref */ "ref",
- /* Oret */ "return",
- /* Orsh */ ">>",
- /* Orshas */ ">>=",
- /* Oscope */ "scope",
- /* Oself */ "self",
- /* Oseq */ "seq",
- /* Oslice */ "slice",
- /* Osnd */ "<-=",
- /* Ospawn */ "spawn",
- /* Osub */ "-",
- /* Osubas */ "-=",
- /* Otl */ "tagof",
- /* Otl */ "tl",
- /* Otuple */ "tuple",
- /* Otype */ "type",
- /* Otypedecl */ "typedecl",
- /* Oused */ "used",
- /* Ovardecl */ "vardecl",
- /* Ovardecli */ "vardecli",
- /* Owild */ "*",
- /* Oxor */ "^",
- /* Oxoras */ "^=",
- /* Oend */ "unknown"
- };
- int setisbyteinst[] = {
- IMULB,
- ISUBB,
- IADDB,
- IDIVB,
- IORB,
- IXORB,
- ISHLB,
- ISHRB,
- IMODB,
- IANDB,
- IBEQB,
- IBNEB,
- IBLTB,
- IBLEB,
- IBGTB,
- IBGEB,
- -1
- };
- char *instname[256] = {
- "nop",
- "alt",
- "nbalt",
- "goto",
- "call",
- "frame",
- "spawn",
- "runt",
- "load",
- "mcall",
- "mspawn",
- "mframe",
- "ret",
- "jmp",
- "case",
- "exit",
- "new",
- "newa",
- "newcb",
- "newcw",
- "newcf",
- "newcp",
- "newcm",
- "newcmp",
- "send",
- "recv",
- "consb",
- "consw",
- "consp",
- "consf",
- "consm",
- "consmp",
- "headb",
- "headw",
- "headp",
- "headf",
- "headm",
- "headmp",
- "tail",
- "lea",
- "indx",
- "movp",
- "movm",
- "movmp",
- "movb",
- "movw",
- "movf",
- "cvtbw",
- "cvtwb",
- "cvtfw",
- "cvtwf",
- "cvtca",
- "cvtac",
- "cvtwc",
- "cvtcw",
- "cvtfc",
- "cvtcf",
- "addb",
- "addw",
- "addf",
- "subb",
- "subw",
- "subf",
- "mulb",
- "mulw",
- "mulf",
- "divb",
- "divw",
- "divf",
- "modw",
- "modb",
- "andb",
- "andw",
- "orb",
- "orw",
- "xorb",
- "xorw",
- "shlb",
- "shlw",
- "shrb",
- "shrw",
- "insc",
- "indc",
- "addc",
- "lenc",
- "lena",
- "lenl",
- "beqb",
- "bneb",
- "bltb",
- "bleb",
- "bgtb",
- "bgeb",
- "beqw",
- "bnew",
- "bltw",
- "blew",
- "bgtw",
- "bgew",
- "beqf",
- "bnef",
- "bltf",
- "blef",
- "bgtf",
- "bgef",
- "beqc",
- "bnec",
- "bltc",
- "blec",
- "bgtc",
- "bgec",
- "slicea",
- "slicela",
- "slicec",
- "indw",
- "indf",
- "indb",
- "negf",
- "movl",
- "addl",
- "subl",
- "divl",
- "modl",
- "mull",
- "andl",
- "orl",
- "xorl",
- "shll",
- "shrl",
- "bnel",
- "bltl",
- "blel",
- "bgtl",
- "bgel",
- "beql",
- "cvtlf",
- "cvtfl",
- "cvtlw",
- "cvtwl",
- "cvtlc",
- "cvtcl",
- "headl",
- "consl",
- "newcl",
- "casec",
- "indl",
- "movpc",
- "tcmp",
- "mnewz",
- "cvtrf",
- "cvtfr",
- "cvtws",
- "cvtsw",
- "lsrw",
- "lsrl",
- "eclr",
- "newz",
- "newaz",
- "raise",
- "casel",
- "mulx",
- "divx",
- "cvtxx",
- "mulx0",
- "divx0",
- "cvtxx0",
- "mulx1",
- "divx1",
- "cvtxx1",
- "cvtfx",
- "cvtxf",
- "expw",
- "expl",
- "expf",
- "self",
- };
|