xref: /php-src/Zend/zend_vm_opcodes.h (revision 631bc816)
1 /*
2    +----------------------------------------------------------------------+
3    | Zend Engine                                                          |
4    +----------------------------------------------------------------------+
5    | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
6    +----------------------------------------------------------------------+
7    | This source file is subject to version 2.00 of the Zend license,     |
8    | that is bundled with this package in the file LICENSE, and is        |
9    | available through the world-wide-web at the following url:           |
10    | http://www.zend.com/license/2_00.txt.                                |
11    | If you did not receive a copy of the Zend license and are unable to  |
12    | obtain it through the world-wide-web, please send a note to          |
13    | license@zend.com so we can mail you a copy immediately.              |
14    +----------------------------------------------------------------------+
15    | Authors: Andi Gutmans <andi@php.net>                                 |
16    |          Zeev Suraski <zeev@php.net>                                 |
17    |          Dmitry Stogov <dmitry@php.net>                              |
18    +----------------------------------------------------------------------+
19 */
20 
21 #ifndef ZEND_VM_OPCODES_H
22 #define ZEND_VM_OPCODES_H
23 
24 #define ZEND_VM_SPEC		1
25 #define ZEND_VM_LINES		0
26 #define ZEND_VM_KIND_CALL	1
27 #define ZEND_VM_KIND_SWITCH	2
28 #define ZEND_VM_KIND_GOTO	3
29 #define ZEND_VM_KIND_HYBRID	4
30 /* HYBRID requires support for computed GOTO and global register variables*/
31 #if (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))
32 # define ZEND_VM_KIND		ZEND_VM_KIND_HYBRID
33 #else
34 # define ZEND_VM_KIND		ZEND_VM_KIND_CALL
35 #endif
36 
37 #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) && !defined(__SANITIZE_ADDRESS__)
38 # if ((defined(i386) && !defined(__PIC__)) || defined(__x86_64__) || defined(_M_X64))
39 #  define ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE 48
40 # endif
41 #endif
42 
43 #define ZEND_VM_OP_SPEC          0x00000001
44 #define ZEND_VM_OP_CONST         0x00000002
45 #define ZEND_VM_OP_TMPVAR        0x00000004
46 #define ZEND_VM_OP_TMPVARCV      0x00000008
47 #define ZEND_VM_OP_MASK          0x000000f0
48 #define ZEND_VM_OP_NUM           0x00000010
49 #define ZEND_VM_OP_JMP_ADDR      0x00000020
50 #define ZEND_VM_OP_TRY_CATCH     0x00000030
51 #define ZEND_VM_OP_THIS          0x00000050
52 #define ZEND_VM_OP_NEXT          0x00000060
53 #define ZEND_VM_OP_CLASS_FETCH   0x00000070
54 #define ZEND_VM_OP_CONSTRUCTOR   0x00000080
55 #define ZEND_VM_OP_CONST_FETCH   0x00000090
56 #define ZEND_VM_OP_CACHE_SLOT    0x000000a0
57 #define ZEND_VM_EXT_VAR_FETCH    0x00010000
58 #define ZEND_VM_EXT_ISSET        0x00020000
59 #define ZEND_VM_EXT_CACHE_SLOT   0x00040000
60 #define ZEND_VM_EXT_ARRAY_INIT   0x00080000
61 #define ZEND_VM_EXT_REF          0x00100000
62 #define ZEND_VM_EXT_FETCH_REF    0x00200000
63 #define ZEND_VM_EXT_DIM_WRITE    0x00400000
64 #define ZEND_VM_EXT_MASK         0x0f000000
65 #define ZEND_VM_EXT_NUM          0x01000000
66 #define ZEND_VM_EXT_LAST_CATCH   0x02000000
67 #define ZEND_VM_EXT_JMP_ADDR     0x03000000
68 #define ZEND_VM_EXT_OP           0x04000000
69 #define ZEND_VM_EXT_TYPE         0x07000000
70 #define ZEND_VM_EXT_EVAL         0x08000000
71 #define ZEND_VM_EXT_TYPE_MASK    0x09000000
72 #define ZEND_VM_EXT_SRC          0x0b000000
73 #define ZEND_VM_NO_CONST_CONST   0x40000000
74 #define ZEND_VM_COMMUTATIVE      0x80000000
75 #define ZEND_VM_OP1_FLAGS(flags) (flags & 0xff)
76 #define ZEND_VM_OP2_FLAGS(flags) ((flags >> 8) & 0xff)
77 
78 BEGIN_EXTERN_C()
79 
80 ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(uint8_t opcode);
81 ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(uint8_t opcode);
82 ZEND_API uint8_t zend_get_opcode_id(const char *name, size_t length);
83 
84 END_EXTERN_C()
85 
86 #define ZEND_NOP                          0
87 #define ZEND_ADD                          1
88 #define ZEND_SUB                          2
89 #define ZEND_MUL                          3
90 #define ZEND_DIV                          4
91 #define ZEND_MOD                          5
92 #define ZEND_SL                           6
93 #define ZEND_SR                           7
94 #define ZEND_CONCAT                       8
95 #define ZEND_BW_OR                        9
96 #define ZEND_BW_AND                      10
97 #define ZEND_BW_XOR                      11
98 #define ZEND_POW                         12
99 #define ZEND_BW_NOT                      13
100 #define ZEND_BOOL_NOT                    14
101 #define ZEND_BOOL_XOR                    15
102 #define ZEND_IS_IDENTICAL                16
103 #define ZEND_IS_NOT_IDENTICAL            17
104 #define ZEND_IS_EQUAL                    18
105 #define ZEND_IS_NOT_EQUAL                19
106 #define ZEND_IS_SMALLER                  20
107 #define ZEND_IS_SMALLER_OR_EQUAL         21
108 #define ZEND_ASSIGN                      22
109 #define ZEND_ASSIGN_DIM                  23
110 #define ZEND_ASSIGN_OBJ                  24
111 #define ZEND_ASSIGN_STATIC_PROP          25
112 #define ZEND_ASSIGN_OP                   26
113 #define ZEND_ASSIGN_DIM_OP               27
114 #define ZEND_ASSIGN_OBJ_OP               28
115 #define ZEND_ASSIGN_STATIC_PROP_OP       29
116 #define ZEND_ASSIGN_REF                  30
117 #define ZEND_QM_ASSIGN                   31
118 #define ZEND_ASSIGN_OBJ_REF              32
119 #define ZEND_ASSIGN_STATIC_PROP_REF      33
120 #define ZEND_PRE_INC                     34
121 #define ZEND_PRE_DEC                     35
122 #define ZEND_POST_INC                    36
123 #define ZEND_POST_DEC                    37
124 #define ZEND_PRE_INC_STATIC_PROP         38
125 #define ZEND_PRE_DEC_STATIC_PROP         39
126 #define ZEND_POST_INC_STATIC_PROP        40
127 #define ZEND_POST_DEC_STATIC_PROP        41
128 #define ZEND_JMP                         42
129 #define ZEND_JMPZ                        43
130 #define ZEND_JMPNZ                       44
131 #define ZEND_JMPZ_EX                     46
132 #define ZEND_JMPNZ_EX                    47
133 #define ZEND_CASE                        48
134 #define ZEND_CHECK_VAR                   49
135 #define ZEND_SEND_VAR_NO_REF_EX          50
136 #define ZEND_CAST                        51
137 #define ZEND_BOOL                        52
138 #define ZEND_FAST_CONCAT                 53
139 #define ZEND_ROPE_INIT                   54
140 #define ZEND_ROPE_ADD                    55
141 #define ZEND_ROPE_END                    56
142 #define ZEND_BEGIN_SILENCE               57
143 #define ZEND_END_SILENCE                 58
144 #define ZEND_INIT_FCALL_BY_NAME          59
145 #define ZEND_DO_FCALL                    60
146 #define ZEND_INIT_FCALL                  61
147 #define ZEND_RETURN                      62
148 #define ZEND_RECV                        63
149 #define ZEND_RECV_INIT                   64
150 #define ZEND_SEND_VAL                    65
151 #define ZEND_SEND_VAR_EX                 66
152 #define ZEND_SEND_REF                    67
153 #define ZEND_NEW                         68
154 #define ZEND_INIT_NS_FCALL_BY_NAME       69
155 #define ZEND_FREE                        70
156 #define ZEND_INIT_ARRAY                  71
157 #define ZEND_ADD_ARRAY_ELEMENT           72
158 #define ZEND_INCLUDE_OR_EVAL             73
159 #define ZEND_UNSET_VAR                   74
160 #define ZEND_UNSET_DIM                   75
161 #define ZEND_UNSET_OBJ                   76
162 #define ZEND_FE_RESET_R                  77
163 #define ZEND_FE_FETCH_R                  78
164 #define ZEND_EXIT                        79
165 #define ZEND_FETCH_R                     80
166 #define ZEND_FETCH_DIM_R                 81
167 #define ZEND_FETCH_OBJ_R                 82
168 #define ZEND_FETCH_W                     83
169 #define ZEND_FETCH_DIM_W                 84
170 #define ZEND_FETCH_OBJ_W                 85
171 #define ZEND_FETCH_RW                    86
172 #define ZEND_FETCH_DIM_RW                87
173 #define ZEND_FETCH_OBJ_RW                88
174 #define ZEND_FETCH_IS                    89
175 #define ZEND_FETCH_DIM_IS                90
176 #define ZEND_FETCH_OBJ_IS                91
177 #define ZEND_FETCH_FUNC_ARG              92
178 #define ZEND_FETCH_DIM_FUNC_ARG          93
179 #define ZEND_FETCH_OBJ_FUNC_ARG          94
180 #define ZEND_FETCH_UNSET                 95
181 #define ZEND_FETCH_DIM_UNSET             96
182 #define ZEND_FETCH_OBJ_UNSET             97
183 #define ZEND_FETCH_LIST_R                98
184 #define ZEND_FETCH_CONSTANT              99
185 #define ZEND_CHECK_FUNC_ARG             100
186 #define ZEND_EXT_STMT                   101
187 #define ZEND_EXT_FCALL_BEGIN            102
188 #define ZEND_EXT_FCALL_END              103
189 #define ZEND_EXT_NOP                    104
190 #define ZEND_TICKS                      105
191 #define ZEND_SEND_VAR_NO_REF            106
192 #define ZEND_CATCH                      107
193 #define ZEND_THROW                      108
194 #define ZEND_FETCH_CLASS                109
195 #define ZEND_CLONE                      110
196 #define ZEND_RETURN_BY_REF              111
197 #define ZEND_INIT_METHOD_CALL           112
198 #define ZEND_INIT_STATIC_METHOD_CALL    113
199 #define ZEND_ISSET_ISEMPTY_VAR          114
200 #define ZEND_ISSET_ISEMPTY_DIM_OBJ      115
201 #define ZEND_SEND_VAL_EX                116
202 #define ZEND_SEND_VAR                   117
203 #define ZEND_INIT_USER_CALL             118
204 #define ZEND_SEND_ARRAY                 119
205 #define ZEND_SEND_USER                  120
206 #define ZEND_STRLEN                     121
207 #define ZEND_DEFINED                    122
208 #define ZEND_TYPE_CHECK                 123
209 #define ZEND_VERIFY_RETURN_TYPE         124
210 #define ZEND_FE_RESET_RW                125
211 #define ZEND_FE_FETCH_RW                126
212 #define ZEND_FE_FREE                    127
213 #define ZEND_INIT_DYNAMIC_CALL          128
214 #define ZEND_DO_ICALL                   129
215 #define ZEND_DO_UCALL                   130
216 #define ZEND_DO_FCALL_BY_NAME           131
217 #define ZEND_PRE_INC_OBJ                132
218 #define ZEND_PRE_DEC_OBJ                133
219 #define ZEND_POST_INC_OBJ               134
220 #define ZEND_POST_DEC_OBJ               135
221 #define ZEND_ECHO                       136
222 #define ZEND_OP_DATA                    137
223 #define ZEND_INSTANCEOF                 138
224 #define ZEND_GENERATOR_CREATE           139
225 #define ZEND_MAKE_REF                   140
226 #define ZEND_DECLARE_FUNCTION           141
227 #define ZEND_DECLARE_LAMBDA_FUNCTION    142
228 #define ZEND_DECLARE_CONST              143
229 #define ZEND_DECLARE_CLASS              144
230 #define ZEND_DECLARE_CLASS_DELAYED      145
231 #define ZEND_DECLARE_ANON_CLASS         146
232 #define ZEND_ADD_ARRAY_UNPACK           147
233 #define ZEND_ISSET_ISEMPTY_PROP_OBJ     148
234 #define ZEND_HANDLE_EXCEPTION           149
235 #define ZEND_USER_OPCODE                150
236 #define ZEND_ASSERT_CHECK               151
237 #define ZEND_JMP_SET                    152
238 #define ZEND_UNSET_CV                   153
239 #define ZEND_ISSET_ISEMPTY_CV           154
240 #define ZEND_FETCH_LIST_W               155
241 #define ZEND_SEPARATE                   156
242 #define ZEND_FETCH_CLASS_NAME           157
243 #define ZEND_CALL_TRAMPOLINE            158
244 #define ZEND_DISCARD_EXCEPTION          159
245 #define ZEND_YIELD                      160
246 #define ZEND_GENERATOR_RETURN           161
247 #define ZEND_FAST_CALL                  162
248 #define ZEND_FAST_RET                   163
249 #define ZEND_RECV_VARIADIC              164
250 #define ZEND_SEND_UNPACK                165
251 #define ZEND_YIELD_FROM                 166
252 #define ZEND_COPY_TMP                   167
253 #define ZEND_BIND_GLOBAL                168
254 #define ZEND_COALESCE                   169
255 #define ZEND_SPACESHIP                  170
256 #define ZEND_FUNC_NUM_ARGS              171
257 #define ZEND_FUNC_GET_ARGS              172
258 #define ZEND_FETCH_STATIC_PROP_R        173
259 #define ZEND_FETCH_STATIC_PROP_W        174
260 #define ZEND_FETCH_STATIC_PROP_RW       175
261 #define ZEND_FETCH_STATIC_PROP_IS       176
262 #define ZEND_FETCH_STATIC_PROP_FUNC_ARG 177
263 #define ZEND_FETCH_STATIC_PROP_UNSET    178
264 #define ZEND_UNSET_STATIC_PROP          179
265 #define ZEND_ISSET_ISEMPTY_STATIC_PROP  180
266 #define ZEND_FETCH_CLASS_CONSTANT       181
267 #define ZEND_BIND_LEXICAL               182
268 #define ZEND_BIND_STATIC                183
269 #define ZEND_FETCH_THIS                 184
270 #define ZEND_SEND_FUNC_ARG              185
271 #define ZEND_ISSET_ISEMPTY_THIS         186
272 #define ZEND_SWITCH_LONG                187
273 #define ZEND_SWITCH_STRING              188
274 #define ZEND_IN_ARRAY                   189
275 #define ZEND_COUNT                      190
276 #define ZEND_GET_CLASS                  191
277 #define ZEND_GET_CALLED_CLASS           192
278 #define ZEND_GET_TYPE                   193
279 #define ZEND_ARRAY_KEY_EXISTS           194
280 #define ZEND_MATCH                      195
281 #define ZEND_CASE_STRICT                196
282 #define ZEND_MATCH_ERROR                197
283 #define ZEND_JMP_NULL                   198
284 #define ZEND_CHECK_UNDEF_ARGS           199
285 #define ZEND_FETCH_GLOBALS              200
286 #define ZEND_VERIFY_NEVER_TYPE          201
287 #define ZEND_CALLABLE_CONVERT           202
288 #define ZEND_BIND_INIT_STATIC_OR_JMP    203
289 #define ZEND_FRAMELESS_ICALL_0          204
290 #define ZEND_FRAMELESS_ICALL_1          205
291 #define ZEND_FRAMELESS_ICALL_2          206
292 #define ZEND_FRAMELESS_ICALL_3          207
293 #define ZEND_JMP_FRAMELESS              208
294 
295 #define ZEND_VM_LAST_OPCODE             208
296 
297 #endif
298