Merge remote-tracking branch 'redux/master' into sh4-pool
[tamarin-stm.git] / core / wopcodes.cpp
blob05d45736ee8636bb84486ac410b02b526d5cd69b
1 /* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4 -*- */
2 /* vi: set ts=4 sw=4 expandtab: (add to ~/.vimrc: set modeline modelines=5) */
3 /* ***** BEGIN LICENSE BLOCK *****
4 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 * http://www.mozilla.org/MPL/
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
16 * The Original Code is [Open Source Virtual Machine.].
18 * The Initial Developer of the Original Code is
19 * Adobe System Incorporated.
20 * Portions created by the Initial Developer are Copyright (C) 2004-2006
21 * the Initial Developer. All Rights Reserved.
23 * Contributor(s):
24 * Adobe AS3 Team
26 * Alternatively, the contents of this file may be used under the terms of
27 * either the GNU General Public License Version 2 or later (the "GPL"), or
28 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 * in which case the provisions of the GPL or the LGPL are applicable instead
30 * of those above. If you wish to allow use of your version of this file only
31 * under the terms of either the GPL or the LGPL, and not to allow others to
32 * use your version of this file under the terms of the MPL, indicate your
33 * decision by deleting the provisions above and replace them with the notice
34 * and other provisions required by the GPL or the LGPL. If you do not delete
35 * the provisions above, a recipient may use your version of this file under
36 * the terms of any one of the MPL, the GPL or the LGPL.
38 * ***** END LICENSE BLOCK ***** */
41 #include "avmplus.h"
43 namespace avmplus
46 #ifdef VMCFG_WORDCODE
48 #if defined _DEBUG || defined DEBUGGER || defined AVMPLUS_VERBOSE
49 # define N(x) , x
50 #else
51 # define N(x)
52 #endif
54 const WordOpcodeAttr wopAttrs[] =
56 // The table is sorted by WordOpcode (see wopcodes.h).
58 // The word opcodes will be re-sorted in the near future, please
59 // do not depend on ranges that are implicit in this table (eg for
60 // the jump opcodes). Always check the attribute bits.
62 // PLEASE NOTE that utils/peephole.as extract information from this
63 // table, so keep each row on a separate line, and keep the BEGIN
64 // and END lines in place. Comment lines, blank lines, and
65 // trailing '//' comments are OK. If you add fields you may also
66 // need to change the regex that parses this table, in peephole.as,
67 // as it knows the order and extracts some of them.
69 // DO NOT INSERT #ifdef ... #endif BLOCKS!!
71 // width=0 means the instruction is not used in the word-code interpreter; other
72 // attrs should be 0. Otherwise it's the width in words of the instruction
73 // including the opcode. Current limit is 7. Only lookupswitch is variable length
74 // jumps=1 means a branch relative to the end of the instruction, offset is 2nd word always
75 // term=1 means the instruction terminates control flow (return, throw, lookupswitch)
76 // thro=1 means the instruction may throw an exception
77 // calls=1 means the topmost value on the stack is an argument count
78 // push=n means the instruction pushes n values (after popping). Current limit is 7
79 // pop=n means the instruction pops n values. Current limit is 3
80 // pop_ex=1 means the instruction may pop more values than shown in the pop column,
81 // there is custom logic elsewhere to handle it. Usually it means there is a
82 // multiname operand
83 // use_l=1 means the instruction reads a local slot
84 // def_l=1 means the instruction writes a local slot
86 // You may assume that the instructions that may invoke user code comprise a subset of
87 // the ones that are marked as thro=1. A few of the latter will not call user code,
88 // but at this point we have no formal definition of whether e.g. embedders may
89 // or may not subclass MethodEnv in such a way that MethodEnv::findproperty()
90 // may call user code. So there is no separate column for whether such a call may
91 // take place.
93 // DO NOT ALTER OR MOVE THE NEXT LINE.
94 // BEGIN
95 // width jumps term thro calls push pop pop_ex use_l def_l name
96 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x00") },
97 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x01") },
98 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("nop") }, // nop
99 { 1, 0, 1, 1, 0, 0, 1, 0, 0, 0 N("throw") },
100 { 2, 0, 0, 1, 0, 1, 1, 1, 0, 0 N("getsuper") },
101 { 2, 0, 0, 1, 0, 0, 2, 1, 0, 0 N("setsuper") },
102 { 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 N("dxns") },
103 { 1, 0, 0, 1, 0, 0, 1, 0, 0, 0 N("dxnslate") },
104 { 2, 0, 0, 0, 0, 0, 0, 0, 1, 1 N("kill") },
105 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x09") }, // label
106 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x0A") },
107 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x0B") },
108 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifnlt") },
109 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifnle") },
110 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifngt") },
111 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifnge") },
112 { 2, 1, 1, 0, 0, 0, 0, 0, 0, 0 N("jump") }, // 0x10
113 { 2, 1, 0, 0, 0, 0, 1, 0, 0, 0 N("iftrue") },
114 { 2, 1, 0, 0, 0, 0, 1, 0, 0, 0 N("iffalse") },
115 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifeq") },
116 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifne") },
117 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("iflt") },
118 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifle") },
119 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifgt") },
120 { 2, 1, 0, 1, 0, 0, 2, 0, 0, 0 N("ifge") },
121 { 2, 1, 0, 0, 0, 0, 2, 0, 0, 0 N("ifstricteq") },
122 { 2, 1, 0, 0, 0, 0, 2, 0, 0, 0 N("ifstrictne") },
123 { 3, 1, 1, 0, 0, 0, 1, 0, 0, 0 N("lookupswitch") }, // NOTE, variable length beyond 3rd word
124 { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 N("pushwith") },
125 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("popscope") },
126 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("nextname") },
127 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("hasnext") },
128 { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushnull") }, // 0x20
129 { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushundefined") },
130 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x22") },
131 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("nextvalue") },
132 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x24") }, // pushbyte
133 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x25") }, // pushshort
134 { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushtrue") },
135 { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushfalse") },
136 { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushnan") },
137 { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 N("pop") },
138 { 1, 0, 0, 0, 0, 2, 1, 0, 0, 0 N("dup") },
139 { 1, 0, 0, 0, 0, 2, 2, 0, 0, 0 N("swap") },
140 { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushstring") },
141 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x2D") }, // pushint
142 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x2E") }, // pushuint
143 { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushdouble") },
144 { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 N("pushscope") }, // 0x30
145 { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushnamespace") },
146 { 3, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("hasnext2") },
147 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x33") },
148 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x34") },
149 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("li8") },
150 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("li16") },
151 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("li32") },
152 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("lf32") },
153 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("lf64") },
154 { 1, 0, 0, 1, 0, 0, 2, 0, 0, 0 N("si8") },
155 { 1, 0, 0, 1, 0, 0, 2, 0, 0, 0 N("si16") },
156 { 1, 0, 0, 1, 0, 0, 2, 0, 0, 0 N("si32") },
157 { 1, 0, 0, 1, 0, 0, 2, 0, 0, 0 N("sf32") },
158 { 1, 0, 0, 1, 0, 0, 2, 0, 0, 0 N("sf64") },
159 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x3F") },
160 { 2, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("newfunction") }, // 0x40
161 { 2, 0, 0, 1, 1, 1, 2, 0, 0, 0 N("call") },
162 { 2, 0, 0, 1, 1, 1, 1, 0, 0, 0 N("construct") },
163 { 3, 0, 0, 1, 1, 1, 1, 0, 0, 0 N("callmethod") },
164 { 3, 0, 0, 1, 1, 1, 1, 0, 0, 0 N("callstatic") },
165 { 3, 0, 0, 1, 1, 1, 1, 1, 0, 0 N("callsuper") },
166 { 3, 0, 0, 1, 1, 1, 1, 1, 0, 0 N("callproperty") },
167 { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0 N("returnvoid") },
168 { 1, 0, 1, 0, 0, 0, 1, 0, 0, 0 N("returnvalue") },
169 { 2, 0, 0, 1, 1, 0, 1, 0, 0, 0 N("constructsuper") },
170 { 3, 0, 0, 1, 1, 1, 1, 1, 0, 0 N("constructprop") },
171 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x4B") }, // callsuperid
172 { 3, 0, 0, 1, 1, 1, 1, 1, 0, 0 N("callproplex") },
173 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x4D") }, // callinterface
174 { 3, 0, 0, 1, 1, 0, 1, 1, 0, 0 N("callsupervoid") },
175 { 3, 0, 0, 1, 1, 0, 1, 1, 0, 0 N("callpropvoid") },
176 { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0 N("sxi1") },
177 { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0 N("sxi8") },
178 { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0 N("sxi16") },
179 { 2, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("applytype") },
180 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x54") },
181 { 2, 0, 0, 1, 1, 1, 0, 0, 0, 0 N("newobject") },
182 { 2, 0, 0, 1, 1, 1, 0, 0, 0, 0 N("newarray") },
183 { 1, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("newactivation") },
184 { 2, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("newclass") },
185 { 2, 0, 0, 1, 0, 1, 1, 1, 0, 0 N("getdescendants") },
186 { 2, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("newcatch") },
187 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x5B") },
188 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x5C") },
189 { 2, 0, 0, 1, 0, 1, 0, 1, 0, 0 N("findpropstrict") },
190 { 2, 0, 0, 1, 0, 1, 0, 1, 0, 0 N("findproperty") },
191 { 2, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("finddef") },
192 { 2, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("getlex") }, // 0x60
193 { 2, 0, 0, 1, 0, 0, 2, 1, 0, 0 N("setproperty") },
194 { 2, 0, 0, 0, 0, 1, 0, 0, 1, 0 N("getlocal") },
195 { 2, 0, 0, 0, 0, 0, 1, 0, 0, 1 N("setlocal") },
196 { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("getglobalscope") },
197 { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("getscopeobject") },
198 { 2, 0, 0, 1, 0, 1, 1, 1, 0, 0 N("getproperty") },
199 { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("getouterscope") },
200 { 2, 0, 0, 1, 0, 0, 2, 1, 0, 0 N("initproperty") },
201 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x69") },
202 { 2, 0, 0, 1, 0, 1, 1, 1, 0, 0 N("deleteproperty") },
203 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x6B") },
204 { 2, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("getslot") },
205 { 2, 0, 0, 1, 0, 0, 2, 0, 0, 0 N("setslot") },
206 { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("getglobalslot") },
207 { 2, 0, 0, 0, 0, 0, 1, 0, 0, 0 N("setglobalslot") },
208 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("convert_s") }, // 0x70
209 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("esc_xelem") },
210 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("esc_xattr") },
211 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("convert_i") },
212 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("convert_u") },
213 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("convert_d") },
214 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("convert_b") },
215 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("convert_o") },
216 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("checkfilter") },
217 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x79") },
218 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x7A") },
219 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x7B") },
220 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x7C") },
221 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x7D") },
222 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x7E") },
223 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x7F") },
224 { 2, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("coerce") }, // 0x80
225 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x81") },
226 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x82") },
227 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x83") },
228 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x84") },
229 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("coerce_s") },
230 { 2, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("astype") },
231 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("astypelate") },
232 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x88") },
233 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("coerce_o") },
234 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x8A") },
235 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x8B") },
236 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x8C") },
237 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x8D") },
238 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x8E") },
239 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x8F") },
240 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("negate") }, // 0x90
241 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("increment") },
242 { 2, 0, 0, 1, 0, 0, 0, 0, 1, 1 N("inclocal") },
243 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("decrement") },
244 { 2, 0, 0, 1, 0, 0, 0, 0, 1, 1 N("declocal") },
245 { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0 N("typeof") },
246 { 1, 0, 0, 0, 0, 1, 1, 0, 0, 0 N("not") },
247 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("bitnot") },
248 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x98") },
249 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x99") },
250 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x9A") },
251 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x9B") },
252 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x9C") },
253 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x9D") },
254 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x9E") },
255 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x9F") },
256 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("add") }, // 0xA0
257 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("subtract") },
258 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("multiply") },
259 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("divide") },
260 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("modulo") },
261 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("lshift") },
262 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("rshift") },
263 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("urshift") },
264 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("bitand") },
265 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("bitor") },
266 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("bitxor") },
267 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("equals") },
268 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("strictequals") },
269 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("lessthan") },
270 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("lessequals") },
271 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("greaterthan") },
272 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("greaterequals") }, // 0xB0
273 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("instanceof") },
274 { 2, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("istype") },
275 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("istypelate") },
276 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("in") },
277 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xB5") },
278 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xB6") },
279 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xB7") },
280 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xB8") },
281 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xB9") },
282 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xBA") },
283 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xBB") },
284 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xBC") },
285 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xBD") },
286 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xBE") },
287 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xBF") },
288 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("increment_i") }, // 0xC0
289 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("decrement_i") },
290 { 2, 0, 0, 1, 0, 0, 0, 0, 1, 1 N("inclocal_i") },
291 { 2, 0, 0, 1, 0, 0, 0, 0, 1, 1 N("declocal_i") },
292 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("negate_i") },
293 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("add_i") },
294 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("subtract_i") },
295 { 1, 0, 0, 1, 0, 1, 2, 0, 0, 0 N("multiply_i") },
296 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xC8") },
297 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xC9") },
298 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xCA") },
299 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xCB") },
300 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xCC") },
301 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xCD") },
302 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xCE") },
303 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xCF") },
304 { 1, 0, 0, 0, 0, 1, 0, 0, 1, 0 N("getlocal0") }, // 0xD0
305 { 1, 0, 0, 0, 0, 1, 0, 0, 1, 0 N("getlocal1") },
306 { 1, 0, 0, 0, 0, 1, 0, 0, 1, 0 N("getlocal2") },
307 { 1, 0, 0, 0, 0, 1, 0, 0, 1, 0 N("getlocal3") },
308 { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 N("setlocal0") },
309 { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 N("setlocal1") },
310 { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 N("setlocal2") },
311 { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 N("setlocal3") },
312 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xD8") },
313 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xD9") },
314 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xDA") },
315 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xDB") },
316 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xDC") },
317 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xDD") },
318 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xDE") },
319 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xDF") },
320 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE0") }, // 0xE0
321 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE1") },
322 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE2") },
323 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE3") },
324 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE4") },
325 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE5") },
326 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE6") },
327 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE7") },
328 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE8") },
329 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xE9") },
330 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xEA") },
331 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xEB") },
332 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xEC") },
333 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xED") },
334 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xEE") }, // formerly abs_jump
335 { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 N("debug") },
336 { 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 N("debugline") }, // 0xF0
337 { 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 N("debugfile") },
338 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF2") },
339 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF3") }, // timestamp
340 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF4") },
341 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF5") },
342 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF6") },
343 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF7") },
344 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF8") },
345 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xF9") },
346 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xFA") },
347 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xFB") },
348 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xFC") },
349 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xFD") },
350 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xFE") },
351 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0xFF") },
352 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("0x100") }, // 0x100
353 { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("pushbits") },
354 { 3, 0, 0, 0, 0, 1, 0, 0, 0, 0 N("push_doublebits") },
355 { 2, 0, 0, 0, 0, 2, 0, 0, 1, 0 N("get2locals") },
356 { 2, 0, 0, 0, 0, 3, 0, 0, 1, 0 N("get3locals") },
357 { 2, 0, 0, 0, 0, 4, 0, 0, 1, 0 N("get4locals") },
358 { 2, 0, 0, 0, 0, 5, 0, 0, 1, 0 N("get5locals") },
359 { 2, 0, 0, 0, 0, 0, 0, 0, 0, 1 N("storelocal") },
360 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("add_ll") },
361 { 2, 0, 0, 1, 0, 0, 0, 0, 1, 1 N("add_set_lll") },
362 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("subtract_ll") },
363 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("multiply_ll") },
364 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("divide_ll") },
365 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("modulo_ll") },
366 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("bitand_ll") },
367 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("bitor_ll") },
368 { 2, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("bitxor_ll") }, // 0x110
369 { 3, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("add_lb") },
370 { 3, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("subtract_lb") },
371 { 3, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("multiply_lb") },
372 { 3, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("divide_lb") },
373 { 3, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("bitand_lb") },
374 { 3, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("bitor_lb") },
375 { 3, 0, 0, 1, 0, 1, 0, 0, 1, 0 N("bitxor_lb") },
376 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("iflt_ll") },
377 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifnlt_ll") },
378 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifle_ll") },
379 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifnle_ll") },
380 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifgt_ll") },
381 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifngt_ll") },
382 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifge_ll") },
383 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifnge_ll") },
384 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifeq_ll") }, // 0x120
385 { 3, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifne_ll") },
386 { 3, 1, 0, 0, 0, 0, 0, 0, 1, 0 N("ifstricteq_ll") },
387 { 3, 1, 0, 0, 0, 0, 0, 0, 1, 0 N("ifstrictne_ll") },
388 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("iflt_lb") },
389 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifnlt_lb") },
390 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifle_lb") },
391 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifnle_lb") },
392 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifgt_lb") },
393 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifngt_lb") },
394 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifge_lb") },
395 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifnge_lb") },
396 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifeq_lb") },
397 { 4, 1, 0, 1, 0, 0, 0, 0, 1, 0 N("ifne_lb") },
398 { 4, 1, 0, 0, 0, 0, 0, 0, 1, 0 N("ifstricteq_lb") },
399 { 4, 1, 0, 0, 0, 0, 0, 0, 1, 0 N("ifstrictne_lb") },
400 { 1, 0, 0, 0, 0, 1, 2, 0, 0, 0 N("swap_pop") }, // 0x130
401 { 3, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("findpropglobal") },
402 { 3, 0, 0, 1, 0, 1, 0, 0, 0, 0 N("findpropglobalstrict") },
403 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("debugenter") },
404 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 N("debugexit") },
405 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("lix8") },
406 { 1, 0, 0, 1, 0, 1, 1, 0, 0, 0 N("lix16") },
407 // DO NOT ALTER OR MOVE THE NEXT LINE.
408 // END
411 #endif // VMCFG_WORDCODE