summaryrefslogtreecommitdiff
path: root/limbo/optab.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
commit37da2899f40661e3e9631e497da8dc59b971cbd0 (patch)
treecbc6d4680e347d906f5fa7fca73214418741df72 /limbo/optab.c
parent54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff)
20060303a
Diffstat (limited to 'limbo/optab.c')
-rw-r--r--limbo/optab.c658
1 files changed, 658 insertions, 0 deletions
diff --git a/limbo/optab.c b/limbo/optab.c
new file mode 100644
index 00000000..77b086f4
--- /dev/null
+++ b/limbo/optab.c
@@ -0,0 +1,658 @@
+#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",
+};