ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /limbo/optab.c/
#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",
};