Split ArrayType from Type.
1 /* vim: set ts=4 sw=4 tw=99 et:
3 * Copyright (C) 2012 David Anderson
5 * This file is part of JITCraft.
7 * JITCraft is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 3 of the License, or (at your option)
12 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with
17 * JITCraft. If not, see http://www.gnu.org/licenses/.
20 // NAME TEXT LENGTH USES DEFS
24 // F = 32-bit IEEE-754 float
25 // O = object reference
28 OPDEF(OP_NOP, "nop", 1, 0, 0)
30 // Pushes a signed integer immediate onto the stack.
31 OPDEF(OP_INT, "int", 5, 0, 1)
33 // Returns from the current routine, propagating the value at the top of the
34 // stack to the caller.
35 OPDEF(OP_RETURN, "return", 1, 1, 0)
38 // if (value == [true, false])
40 OPDEF(OP_JT, "jt", 5, 1, 0)
41 OPDEF(OP_JF, "jf", 5, 1, 0)
43 // Unconditional jump.
44 OPDEF(OP_JUMP, "jump", 5, 0, 0)
46 // Gets or sets the value of a local variable onto the stack. The local
47 // variable is given by an immediate index.
48 OPDEF(OP_GETLOCAL, "getlocal", 5, 0, 1)
49 OPDEF(OP_SETLOCAL, "setlocal", 5, 1, 1)
51 // Stack transitions for these binary operators:
55 OPDEF(OP_ADD, "add", 1, 2, 1)
56 OPDEF(OP_SUB, "sub", 1, 2, 1)
57 OPDEF(OP_MUL, "mul", 1, 2, 1)
58 OPDEF(OP_DIV, "div", 1, 2, 1)
59 OPDEF(OP_MOD, "mod", 1, 2, 1)
61 OPDEF(OP_LT, "lt", 1, 2, 1)
62 OPDEF(OP_LE, "le", 1, 2, 1)
63 OPDEF(OP_GE, "ge", 1, 2, 1)
64 OPDEF(OP_GT, "gt", 1, 2, 1)
65 OPDEF(OP_EQ, "eq", 1, 2, 1)
66 OPDEF(OP_NE, "ne", 1, 2, 1)
68 OPDEF(OP_NOT, "not", 1, 1, 1)
69 OPDEF(OP_NEG, "neg", 1, 1, 1)
71 OPDEF(OP_POP, "pop", 1, 1, 0)
73 // Unconditional terminator placed at the end of code. If a function returns
74 // void, this acts as a RETURNVOID. Otherwise, it must be unreachable.
75 OPDEF(OP_STOP, "stop", 1, 0, 0)
77 // Call a function with N arguments. The target function must be the last item
79 OPDEF(OP_CALL, "call", 1, -1, 1)
81 // Similar to GET/LOCAL, except for arguments.
82 OPDEF(OP_GETARG, "getarg", 5, 0, 1)
83 OPDEF(OP_SETARG, "setarg", 5, 1, 1)
87 // A 0-length dynamic array, or
88 // A dynamic array whose size is specified on the stack.
90 // The HeapTenure is stored as a byte following the pc. The ArrayMap to use
91 // is specified as an index into the script's object table.
94 // [u8 op] [u8 tenure] [u32 index]
95 OPDEF(OP_NEWFIXED, "newfixed", 6, 0, 1)
96 OPDEF(OP_NEWEMPTY, "newempty", 6, 0, 1)
97 OPDEF(OP_NEWSIZED, "newsized", 6, -1, 1)
99 // Performs an array-to-array assignment.
104 OPDEF(OP_COPYARRAY, "arraycopy", 1, 2, 1)
106 // Reads or writes an integer element to an unsafe array.
111 OPDEF(OP_GETELEM, "getelem", 1, 2, 1)
112 OPDEF(OP_SETELEM, "setelem", 1, 3, 1)
114 // Pushes a 32-bit IEEE-754 floating point immediate onto the stack.
115 OPDEF(OP_FLOAT, "float", 5, 0, 1)
117 // Converts an integer to a 32-bit IEEE-754 floating point immediate.
118 OPDEF(OP_CVT_I2F, "cvt.i2f", 1, 1, 1)
119 OPDEF(OP_CVT_I2B, "cvt.i2b", 1, 1, 1)
121 // Stack transitions for these binary operators:
125 OPDEF(OP_ADD_F, "add.f", 1, 2, 1)
126 OPDEF(OP_SUB_F, "sub.f", 1, 2, 1)
127 OPDEF(OP_MUL_F, "mul.f", 1, 2, 1)
128 OPDEF(OP_DIV_F, "div.f", 1, 2, 1)
130 OPDEF(OP_LT_F, "lt.f", 1, 2, 1)
131 OPDEF(OP_LE_F, "le.f", 1, 2, 1)
132 OPDEF(OP_GE_F, "ge.f", 1, 2, 1)
133 OPDEF(OP_GT_F, "gt.f", 1, 2, 1)
134 OPDEF(OP_EQ_F, "eq.f", 1, 2, 1)
135 OPDEF(OP_NE_F, "ne.f", 1, 2, 1)
137 OPDEF(OP_NOT_F, "not.f", 1, 1, 1)
138 OPDEF(OP_NEG_F, "neg.f", 1, 1, 1)
140 // Bitwise operators.
141 OPDEF(OP_SHL, "shl", 1, 2, 1)
142 OPDEF(OP_SHR, "shr", 1, 2, 1)
143 OPDEF(OP_USHR, "ushr", 1, 2, 1)
144 OPDEF(OP_BITAND, "bitand", 1, 2, 1)
145 OPDEF(OP_BITOR, "bitor", 1, 2, 1)
146 OPDEF(OP_BITXOR, "bitxor", 1, 2, 1)
147 OPDEF(OP_BITNOT, "bitnot", 1, 1, 1)
149 // Saves or restores the position of the LIFO heap to/from a local slot.
150 OPDEF(OP_SAVELIFO, "savelifo", 5, 0, 0)
151 OPDEF(OP_UNWINDLIFO, "unwindlifo", 5, 0, 0)
153 // Composes a variable reference to a stack slot or argument.
154 OPDEF(OP_VARREF_LIFO, "varref.lifo", 5, 0, 1)
155 OPDEF(OP_ARGREF_LIFO, "argref.lifo", 5, 0, 1)
156 OPDEF(OP_SLOTREF_LIFO, "slotref.lifo", 1, 1, 1)
157 OPDEF(OP_GETREF_I, "getref.i", 1, 1, 1)
158 OPDEF(OP_SETREF_I, "setref.i", 1, 2, 1)
159 OPDEF(OP_GETREF_F, "getref.f", 1, 1, 1)
160 OPDEF(OP_SETREF_F, "setref.f", 1, 2, 1)
162 // Pushes an object reference onto the stack.
163 OPDEF(OP_OBJECT, "object", 5, 0, 1)
165 // Duplicates the top item on the stack.
166 OPDEF(OP_DUP, "dup", 1, 1, 2)
168 // Duplicates the top two items on the stack.
169 OPDEF(OP_DUP2, "dup2", 1, 2, 4)
171 // Swaps the two items at the top of the stack.
172 OPDEF(OP_SWAP, "swap", 1, 2, 2)
174 // Roll operation is the same as Forth. It steals a value on the stack,
175 // shifting all stack values down, and then places the stolen value back at
176 // the top of the stack.
182 OPDEF(OP_ROLL3, "roll3", 1, 3, 3)
184 // Pick operation is the same as Forth. It pushes a copy of a slot at a
188 OPDEF(OP_PICK2, "pick2", 1, 2, 3)
189 OPDEF(OP_PICK3, "pick3", 1, 3, 4)
191 // Calls a native function. During the course of calling a native, arguments
192 // on the stack are re-pushed to match the cell-based native calling
193 // convention expected by ISourcePawnEngine.
195 // Unlike the normal CALL instruction, natives take truly variadic arguments
196 // and so we must specify the number of arguments.
198 // [u8 Opcode] [u32 ArgCount]
200 OPDEF(OP_CALLNATIVE, "callnative", 5, -1, 1)
202 // Returns from a function that does return a value.
203 OPDEF(OP_RETURNVOID, "returnvoid", 1, 0, 0)
205 // Opcodes for accessing an environment slot in the global scope. The index
206 // maps into the code object's string table, and represents the name of the
208 OPDEF(OP_SETGLOBAL, "setglobal", 5, 1, 1)
209 OPDEF(OP_GETGLOBAL, "getglobal", 5, 0, 1)
211 // Reinterprets a 32-bit integer as a float, or vice-versa.
212 OPDEF(OP_BITS_I2F, "bits.i2f", 1, 1, 1)
213 OPDEF(OP_BITS_F2I, "bits.f2i", 1, 1, 1)
215 // Pushes a boolean value.
216 OPDEF(OP_TRUE, "true", 1, 0, 1)
217 OPDEF(OP_FALSE, "false", 1, 0, 1)
219 // Allocate a struct. The HeapTenure is stored as a byte following pc. The
220 // StructMap to use is specified as an index into the script's Map table.
223 // [u8 op] [u8 tenure] [u32 index]
224 OPDEF(OP_NEWSTRUCT, "newstruct", 6, 0, 1)
226 // Performs a struct-to-struct assignment.
231 OPDEF(OP_COPYSTRUCT, "structcopy", 1, 2, 1)
233 // Sets or gets a property in a struct. The index of the field is specified as
234 // a 32-bit integer. Note that these opcodes follow a new style of deriving
235 // their types at runtime.
236 OPDEF(OP_GETFIELD, "getfield", 5, 1, 1)
237 OPDEF(OP_SETFIELD, "setfield", 5, 2, 1)
240 // [u8 op] [i32 low] [i32 high] [u32 jump] [u32 jumps...]
241 OPDEF(OP_TABLESWITCH, "tableswitch", 9, 1, 0)
243 OPDEF(OP_SIZEOF, "sizeof", 1, 1, 1)
245 // Registers a function as a publicly exported name.
246 OPDEF(OP_PUBLIC, "public", 1, 1, 0)