xref: /php-src/Zend/zend_vm_opcodes.h (revision a79c70f5)
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_FETCH_R                         80
165 #define ZEND_FETCH_DIM_R                     81
166 #define ZEND_FETCH_OBJ_R                     82
167 #define ZEND_FETCH_W                         83
168 #define ZEND_FETCH_DIM_W                     84
169 #define ZEND_FETCH_OBJ_W                     85
170 #define ZEND_FETCH_RW                        86
171 #define ZEND_FETCH_DIM_RW                    87
172 #define ZEND_FETCH_OBJ_RW                    88
173 #define ZEND_FETCH_IS                        89
174 #define ZEND_FETCH_DIM_IS                    90
175 #define ZEND_FETCH_OBJ_IS                    91
176 #define ZEND_FETCH_FUNC_ARG                  92
177 #define ZEND_FETCH_DIM_FUNC_ARG              93
178 #define ZEND_FETCH_OBJ_FUNC_ARG              94
179 #define ZEND_FETCH_UNSET                     95
180 #define ZEND_FETCH_DIM_UNSET                 96
181 #define ZEND_FETCH_OBJ_UNSET                 97
182 #define ZEND_FETCH_LIST_R                    98
183 #define ZEND_FETCH_CONSTANT                  99
184 #define ZEND_CHECK_FUNC_ARG                 100
185 #define ZEND_EXT_STMT                       101
186 #define ZEND_EXT_FCALL_BEGIN                102
187 #define ZEND_EXT_FCALL_END                  103
188 #define ZEND_EXT_NOP                        104
189 #define ZEND_TICKS                          105
190 #define ZEND_SEND_VAR_NO_REF                106
191 #define ZEND_CATCH                          107
192 #define ZEND_THROW                          108
193 #define ZEND_FETCH_CLASS                    109
194 #define ZEND_CLONE                          110
195 #define ZEND_RETURN_BY_REF                  111
196 #define ZEND_INIT_METHOD_CALL               112
197 #define ZEND_INIT_STATIC_METHOD_CALL        113
198 #define ZEND_ISSET_ISEMPTY_VAR              114
199 #define ZEND_ISSET_ISEMPTY_DIM_OBJ          115
200 #define ZEND_SEND_VAL_EX                    116
201 #define ZEND_SEND_VAR                       117
202 #define ZEND_INIT_USER_CALL                 118
203 #define ZEND_SEND_ARRAY                     119
204 #define ZEND_SEND_USER                      120
205 #define ZEND_STRLEN                         121
206 #define ZEND_DEFINED                        122
207 #define ZEND_TYPE_CHECK                     123
208 #define ZEND_VERIFY_RETURN_TYPE             124
209 #define ZEND_FE_RESET_RW                    125
210 #define ZEND_FE_FETCH_RW                    126
211 #define ZEND_FE_FREE                        127
212 #define ZEND_INIT_DYNAMIC_CALL              128
213 #define ZEND_DO_ICALL                       129
214 #define ZEND_DO_UCALL                       130
215 #define ZEND_DO_FCALL_BY_NAME               131
216 #define ZEND_PRE_INC_OBJ                    132
217 #define ZEND_PRE_DEC_OBJ                    133
218 #define ZEND_POST_INC_OBJ                   134
219 #define ZEND_POST_DEC_OBJ                   135
220 #define ZEND_ECHO                           136
221 #define ZEND_OP_DATA                        137
222 #define ZEND_INSTANCEOF                     138
223 #define ZEND_GENERATOR_CREATE               139
224 #define ZEND_MAKE_REF                       140
225 #define ZEND_DECLARE_FUNCTION               141
226 #define ZEND_DECLARE_LAMBDA_FUNCTION        142
227 #define ZEND_DECLARE_CONST                  143
228 #define ZEND_DECLARE_CLASS                  144
229 #define ZEND_DECLARE_CLASS_DELAYED          145
230 #define ZEND_DECLARE_ANON_CLASS             146
231 #define ZEND_ADD_ARRAY_UNPACK               147
232 #define ZEND_ISSET_ISEMPTY_PROP_OBJ         148
233 #define ZEND_HANDLE_EXCEPTION               149
234 #define ZEND_USER_OPCODE                    150
235 #define ZEND_ASSERT_CHECK                   151
236 #define ZEND_JMP_SET                        152
237 #define ZEND_UNSET_CV                       153
238 #define ZEND_ISSET_ISEMPTY_CV               154
239 #define ZEND_FETCH_LIST_W                   155
240 #define ZEND_SEPARATE                       156
241 #define ZEND_FETCH_CLASS_NAME               157
242 #define ZEND_CALL_TRAMPOLINE                158
243 #define ZEND_DISCARD_EXCEPTION              159
244 #define ZEND_YIELD                          160
245 #define ZEND_GENERATOR_RETURN               161
246 #define ZEND_FAST_CALL                      162
247 #define ZEND_FAST_RET                       163
248 #define ZEND_RECV_VARIADIC                  164
249 #define ZEND_SEND_UNPACK                    165
250 #define ZEND_YIELD_FROM                     166
251 #define ZEND_COPY_TMP                       167
252 #define ZEND_BIND_GLOBAL                    168
253 #define ZEND_COALESCE                       169
254 #define ZEND_SPACESHIP                      170
255 #define ZEND_FUNC_NUM_ARGS                  171
256 #define ZEND_FUNC_GET_ARGS                  172
257 #define ZEND_FETCH_STATIC_PROP_R            173
258 #define ZEND_FETCH_STATIC_PROP_W            174
259 #define ZEND_FETCH_STATIC_PROP_RW           175
260 #define ZEND_FETCH_STATIC_PROP_IS           176
261 #define ZEND_FETCH_STATIC_PROP_FUNC_ARG     177
262 #define ZEND_FETCH_STATIC_PROP_UNSET        178
263 #define ZEND_UNSET_STATIC_PROP              179
264 #define ZEND_ISSET_ISEMPTY_STATIC_PROP      180
265 #define ZEND_FETCH_CLASS_CONSTANT           181
266 #define ZEND_BIND_LEXICAL                   182
267 #define ZEND_BIND_STATIC                    183
268 #define ZEND_FETCH_THIS                     184
269 #define ZEND_SEND_FUNC_ARG                  185
270 #define ZEND_ISSET_ISEMPTY_THIS             186
271 #define ZEND_SWITCH_LONG                    187
272 #define ZEND_SWITCH_STRING                  188
273 #define ZEND_IN_ARRAY                       189
274 #define ZEND_COUNT                          190
275 #define ZEND_GET_CLASS                      191
276 #define ZEND_GET_CALLED_CLASS               192
277 #define ZEND_GET_TYPE                       193
278 #define ZEND_ARRAY_KEY_EXISTS               194
279 #define ZEND_MATCH                          195
280 #define ZEND_CASE_STRICT                    196
281 #define ZEND_MATCH_ERROR                    197
282 #define ZEND_JMP_NULL                       198
283 #define ZEND_CHECK_UNDEF_ARGS               199
284 #define ZEND_FETCH_GLOBALS                  200
285 #define ZEND_VERIFY_NEVER_TYPE              201
286 #define ZEND_CALLABLE_CONVERT               202
287 #define ZEND_BIND_INIT_STATIC_OR_JMP        203
288 #define ZEND_FRAMELESS_ICALL_0              204
289 #define ZEND_FRAMELESS_ICALL_1              205
290 #define ZEND_FRAMELESS_ICALL_2              206
291 #define ZEND_FRAMELESS_ICALL_3              207
292 #define ZEND_JMP_FRAMELESS                  208
293 #define ZEND_INIT_PARENT_PROPERTY_HOOK_CALL 209
294 
295 #define ZEND_VM_LAST_OPCODE                 209
296 
297 #endif
298