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