1 // Copyright 2014 Wouter van Oortmerssen. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef LOBSTER_IL
16 #define LOBSTER_IL
17 
18 // FlatBuffers takes care of backwards compatibility of all metadata, but not the actual bytecode.
19 // This needs to be bumped each time we make changes to the format.
20 
21 namespace lobster {
22 
23 const int LOBSTER_BYTECODE_FORMAT_VERSION = 15;
24 const int MAX_RETURN_VALUES = 64;
25 
26 // Any type specialized ops below must always have this ordering.
27 enum MathOp {
28     MOP_ADD, MOP_SUB, MOP_MUL, MOP_DIV, MOP_MOD, MOP_LT, MOP_GT, MOP_LE, MOP_GE, MOP_EQ, MOP_NE
29 };
30 
31 #define ILUNKNOWNARITY 9
32 
33 #define ILBASENAMES \
34     F(PUSHINT, 1) \
35     F(PUSHINT64, 2) \
36     F(PUSHFLT, 1) \
37     F(PUSHFLT64, 2) \
38     F(PUSHSTR, 1) \
39     F(PUSHNIL, 0) \
40     F(PUSHVAR, 1) \
41     F(PUSHVARV, 2) \
42     F(VPUSHIDXI, 0) F(VPUSHIDXV, 1) F(VPUSHIDXIS, 2) F(VPUSHIDXVS, 3) F(NPUSHIDXI, 1) F(SPUSHIDXI, 0) \
43     F(PUSHFLD, 1) F(PUSHFLDMREF, 1) F(PUSHFLDV, 2) F(PUSHFLD2V, 2) F(PUSHFLDV2V, 3) \
44     F(PUSHLOC, 1) F(PUSHLOCV, 2) \
45     F(BCALLRETV, 1) F(BCALLREFV, 1) F(BCALLUNBV, 1) \
46     F(BCALLRET0, 1) F(BCALLREF0, 1) F(BCALLUNB0, 1) \
47     F(BCALLRET1, 1) F(BCALLREF1, 1) F(BCALLUNB1, 1) \
48     F(BCALLRET2, 1) F(BCALLREF2, 1) F(BCALLUNB2, 1) \
49     F(BCALLRET3, 1) F(BCALLREF3, 1) F(BCALLUNB3, 1) \
50     F(BCALLRET4, 1) F(BCALLREF4, 1) F(BCALLUNB4, 1) \
51     F(BCALLRET5, 1) F(BCALLREF5, 1) F(BCALLUNB5, 1) \
52     F(BCALLRET6, 1) F(BCALLREF6, 1) F(BCALLUNB6, 1) \
53     F(BCALLRET7, 1) F(BCALLREF7, 1) F(BCALLUNB7, 1) \
54     F(ASSERT, 3) F(ASSERTR, 3) \
55     F(CONT1, 1) \
56     F(FUNSTART, ILUNKNOWNARITY) \
57     F(ENDSTATEMENT, 2) \
58     F(NEWVEC, 2) F(NEWOBJECT, 1) \
59     F(POP, 0) F(POPREF, 0) F(POPV, 1) F(POPVREF, 1) \
60     F(DUP, 0) \
61     F(EXIT, 1) F(ABORT, 0) \
62     F(IADD, 0)  F(ISUB, 0)  F(IMUL, 0)  F(IDIV, 0)  F(IMOD, 0) \
63     F(ILT, 0)  F(IGT, 0)  F(ILE, 0)  F(IGE, 0)  F(IEQ, 0) F(INE, 0) \
64     F(FADD, 0)  F(FSUB, 0)  F(FMUL, 0)  F(FDIV, 0)  F(FMOD, 0) \
65     F(FLT, 0)  F(FGT, 0)  F(FLE, 0)  F(FGE, 0)  F(FEQ, 0) F(FNE, 0) \
66     F(SADD, 0)  F(SSUB, 0)  F(SMUL, 0)  F(SDIV, 0)  F(SMOD, 0) \
67     F(SLT, 0)  F(SGT, 0)  F(SLE, 0)  F(SGE, 0)  F(SEQ, 0) F(SNE, 0) \
68     F(IVVADD, 1) F(IVVSUB, 1) F(IVVMUL, 1) F(IVVDIV, 1) F(IVVMOD, 1) \
69     F(IVVLT, 1) F(IVVGT, 1) F(IVVLE, 1) F(IVVGE, 1) \
70     F(FVVADD, 1) F(FVVSUB, 1) F(FVVMUL, 1) F(FVVDIV, 1) F(FVVMOD, 1) \
71     F(FVVLT, 1) F(FVVGT, 1) F(FVVLE, 1) F(FVVGE, 1) \
72     F(IVSADD, 1) F(IVSSUB, 1) F(IVSMUL, 1) F(IVSDIV, 1) F(IVSMOD, 1) \
73     F(IVSLT, 1) F(IVSGT, 1) F(IVSLE, 1) F(IVSGE, 1) \
74     F(FVSADD, 1) F(FVSSUB, 1) F(FVSMUL, 1) F(FVSDIV, 1) F(FVSMOD, 1) \
75     F(FVSLT, 1) F(FVSGT, 1) F(FVSLE, 1) F(FVSGE, 1) \
76     F(AEQ, 0) F(ANE, 0) \
77     F(STEQ, 1) F(STNE, 1) \
78     F(LEQ, 0) F(LNE, 0) \
79     F(IUMINUS, 0) F(FUMINUS, 0) F(IVUMINUS, 1) F(FVUMINUS, 1) \
80     F(LOGNOT, 0) F(LOGNOTREF, 0) \
81     F(BINAND, 0) F(BINOR, 0) F(XOR, 0) F(ASL, 0) F(ASR, 0) F(NEG, 0) \
82     F(I2F, 0) F(A2S, 1) F(E2B, 0) F(E2BREF, 0) F(ST2S, 1) \
83     F(RETURN, 2) \
84     F(ISTYPE, 1) F(COCL, 0) F(COEND, 0) \
85     F(LOGREAD, 1) F(LOGWRITE, 2) \
86     F(FORLOOPI, 0) F(IFORELEM, 0) F(SFORELEM, 0) F(VFORELEM, 0) F(VFORELEMREF, 0) \
87     F(INCREF, 1) F(KEEPREF, 2)
88 
89 #define ILCALLNAMES \
90     F(CALL, 1) F(CALLV, 0) F(CALLVCOND, 0) F(DDCALL, 2) \
91     F(PUSHFUN, 1) F(CORO, ILUNKNOWNARITY) F(YIELD, 0)
92 
93 #define ILJUMPNAMES \
94     F(JUMP, 1) \
95     F(JUMPFAIL, 1) F(JUMPFAILR, 1) F(JUMPFAILN, 1) \
96     F(JUMPNOFAIL, 1) F(JUMPNOFAILR, 1) \
97     F(IFOR, 1) F(SFOR, 1) F(VFOR, 1)
98 
99 #define LVALOPNAMES \
100     LVAL(WRITE, 0)  LVAL(WRITER, 0)  LVAL(WRITEREF, 0)  LVAL(WRITERREF, 0) \
101     LVAL(WRITEV, 1) LVAL(WRITERV, 1) LVAL(WRITEREFV, 1) LVAL(WRITERREFV, 1) \
102     LVAL(IADD, 0)   LVAL(IADDR, 0)   LVAL(ISUB, 0)   LVAL(ISUBR, 0)   LVAL(IMUL, 0)   LVAL(IMULR, 0)   LVAL(IDIV, 0)   LVAL(IDIVR, 0) \
103     LVAL(IMOD, 0)   LVAL(IMODR, 0) \
104     LVAL(FADD, 0)   LVAL(FADDR, 0)   LVAL(FSUB, 0)   LVAL(FSUBR, 0)   LVAL(FMUL, 0)   LVAL(FMULR, 0)   LVAL(FDIV, 0)   LVAL(FDIVR, 0) \
105     LVAL(IVVADD, 1) LVAL(IVVADDR, 1) LVAL(IVVSUB, 1) LVAL(IVVSUBR, 1) LVAL(IVVMUL, 1) LVAL(IVVMULR, 1) LVAL(IVVDIV, 1) LVAL(IVVDIVR, 1) \
106     LVAL(IVVMOD, 1) LVAL(IVVMODR, 1) \
107     LVAL(FVVADD, 1) LVAL(FVVADDR, 1) LVAL(FVVSUB, 1) LVAL(FVVSUBR, 1) LVAL(FVVMUL, 1) LVAL(FVVMULR, 1) LVAL(FVVDIV, 1) LVAL(FVVDIVR, 1) \
108     LVAL(IVSADD, 1) LVAL(IVSADDR, 1) LVAL(IVSSUB, 1) LVAL(IVSSUBR, 1) LVAL(IVSMUL, 1) LVAL(IVSMULR, 1) LVAL(IVSDIV, 1) LVAL(IVSDIVR, 1) \
109     LVAL(IVSMOD, 1) LVAL(IVSMODR, 1) \
110     LVAL(FVSADD, 1) LVAL(FVSADDR, 1) LVAL(FVSSUB, 1) LVAL(FVSSUBR, 1) LVAL(FVSMUL, 1) LVAL(FVSMULR, 1) LVAL(FVSDIV, 1) LVAL(FVSDIVR, 1) \
111     LVAL(SADD, 0)   LVAL(SADDR, 0) \
112     LVAL(IPP, 0) LVAL(IPPR, 0) LVAL(IMM, 0) LVAL(IMMR, 0) LVAL(IPPP, 0) LVAL(IPPPR, 0) LVAL(IMMP, 0) LVAL(IMMPR, 0) \
113     LVAL(FPP, 0) LVAL(FPPR, 0) LVAL(FMM, 0) LVAL(FMMR, 0) LVAL(FPPP, 0) LVAL(FPPPR, 0) LVAL(FMMP, 0) LVAL(FMMPR, 0)
114 
115 enum LVALOP {
116     #define LVAL(N, V) LVO_##N,
117         LVALOPNAMES
118     #undef LVAL
119 };
120 
121 #define NUMBASELVALOPS 6  // HAS to match LVAL below!
122 #define GENLVALOP(LV, OP) (IL_##LV##_WRITE + (OP) * NUMBASELVALOPS)  // WRITE assumed to be first!
123 #define ILADD00 0
124 #define ILADD01 1
125 #define ILADD10 1
126 #define ILADD11 2
127 #define ILADD(X, Y) ILADD##X##Y
128 #define LVAL(N, V) F(VAR_##N, ILADD(1, V)) F(FLD_##N, ILADD(1, V)) F(LOC_##N, ILADD(1, V)) \
129                    F(IDXVI_##N, ILADD(0, V)) F(IDXVV_##N, ILADD(1, V)) F(IDXNI_##N, ILADD(0, V))
130 // This assumes VAR is first!
131 #define ISLVALVARINS(O) O >= IL_VAR_WRITE && O <= IL_VAR_FMMPR && (O % NUMBASELVALOPS) == 0
132 
133 #define ISBCALL(O) (O >= IL_BCALLRETV && O <= IL_BCALLUNB7)
134 
135 #define ILNAMES LVALOPNAMES ILBASENAMES ILCALLNAMES ILJUMPNAMES
136 
137 enum ILOP {
138     #define F(N, A) IL_##N,
139         ILNAMES
140     #undef F
141     IL_MAX_OPS
142 };
143 
ILNames()144 inline const char **ILNames() {
145     #define F(N, A) #N,
146         static const char *ilnames[] = { ILNAMES };
147     #undef F
148     return ilnames;
149 }
150 
ILArity()151 inline const int *ILArity() {
152     #define F(N, A) A,
153         static const int ilarity[] = { ILNAMES };
154     #undef F
155     return ilarity;
156 }
157 
158 }
159 
160 #endif  // LOBSTER_IL
161