Reland D23318594 and D23318592 add recordbasenativesp instr
[hiphop-php.git] / hphp / runtime / vm / jit / vasm-instr.cpp
blobca6e5a5b6d93694d9773cd2d32d5c3e45cf8e2b8
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-present Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP 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.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
17 #include "hphp/runtime/vm/jit/vasm-instr.h"
19 namespace HPHP { namespace jit {
20 ///////////////////////////////////////////////////////////////////////////////
22 #define O(name, ...) \
23 static_assert(sizeof(name) <= 48, "vasm struct " #name " is too big");
24 VASM_OPCODES
25 #undef O
26 static_assert(sizeof(Vinstr) <= 64, "Vinstr should be <= 64 bytes");
28 const char* vinst_names[] = {
29 #define O(name, imms, uses, defs) #name,
30 VASM_OPCODES
31 #undef O
34 ///////////////////////////////////////////////////////////////////////////////
36 bool isBlockEnd(const Vinstr& inst) {
37 switch (inst.op) {
38 // service request-y things
39 case Vinstr::bindjmp:
40 case Vinstr::fallback:
41 case Vinstr::retransopt:
42 // control flow
43 case Vinstr::jcc:
44 case Vinstr::jcci:
45 case Vinstr::jmp:
46 case Vinstr::jmps:
47 case Vinstr::jmpr:
48 case Vinstr::jmpm:
49 case Vinstr::jmpi:
50 case Vinstr::phijmp:
51 case Vinstr::debugguardjmp:
52 // terminal calls
53 case Vinstr::tailcallstub:
54 case Vinstr::tailcallstubr:
55 case Vinstr::resumetc:
56 // exception edges
57 case Vinstr::unwind:
58 case Vinstr::vinvoke:
59 case Vinstr::contenter:
60 // terminal
61 case Vinstr::trap:
62 case Vinstr::ret:
63 case Vinstr::stubret:
64 case Vinstr::phpret:
65 case Vinstr::leavetc:
66 case Vinstr::fallthru:
67 return true;
68 default:
69 return false;
73 bool isCall(Vinstr::Opcode op) {
74 switch (op) {
75 case Vinstr::call:
76 case Vinstr::callfaststub:
77 case Vinstr::callm:
78 case Vinstr::callphp:
79 case Vinstr::callphpr:
80 case Vinstr::callphps:
81 case Vinstr::callr:
82 case Vinstr::calls:
83 case Vinstr::callstub:
84 case Vinstr::tailcallstub:
85 case Vinstr::tailcallstubr:
86 case Vinstr::vcall:
87 case Vinstr::vinvoke:
88 return true;
89 default:
90 return false;
94 Width width(Vinstr::Opcode op) {
95 switch (op) {
96 // service requests
97 case Vinstr::bindjmp:
98 case Vinstr::bindjcc:
99 case Vinstr::bindaddr:
100 case Vinstr::fallback:
101 case Vinstr::fallbackcc:
102 case Vinstr::retransopt:
103 // vasm intrinsics
104 case Vinstr::conjure:
105 case Vinstr::conjureuse:
106 case Vinstr::copy:
107 case Vinstr::copy2:
108 case Vinstr::copyargs:
109 case Vinstr::debugguardjmp:
110 case Vinstr::debugtrap:
111 case Vinstr::fallthru:
112 case Vinstr::ldimmb:
113 case Vinstr::ldimmw:
114 case Vinstr::ldimml:
115 case Vinstr::ldimmq:
116 case Vinstr::ldundefq:
117 case Vinstr::movqs:
118 case Vinstr::load:
119 case Vinstr::store:
120 case Vinstr::mcprep:
121 case Vinstr::phidef:
122 case Vinstr::phijmp:
123 case Vinstr::inlinestart:
124 case Vinstr::inlineend:
125 case Vinstr::pushframe:
126 case Vinstr::popframe:
127 case Vinstr::recordstack:
128 case Vinstr::recordbasenativesp:
129 case Vinstr::spill:
130 case Vinstr::spillbi:
131 case Vinstr::spillli:
132 case Vinstr::spillqi:
133 case Vinstr::spillundefq:
134 case Vinstr::reload:
135 case Vinstr::ssaalias:
136 // native function abi
137 case Vinstr::vcall:
138 case Vinstr::vinvoke:
139 case Vinstr::call:
140 case Vinstr::callm:
141 case Vinstr::callr:
142 case Vinstr::calls:
143 case Vinstr::ret:
144 // stub function abi
145 case Vinstr::stublogue:
146 case Vinstr::unstublogue:
147 case Vinstr::stubret:
148 case Vinstr::callstub:
149 case Vinstr::callfaststub:
150 case Vinstr::tailcallstub:
151 case Vinstr::tailcallstubr:
152 case Vinstr::stubunwind:
153 // php function abi
154 case Vinstr::defvmsp:
155 case Vinstr::defvmfp:
156 case Vinstr::pushvmfp:
157 case Vinstr::popvmfp:
158 case Vinstr::syncvmsp:
159 case Vinstr::defvmretdata:
160 case Vinstr::defvmrettype:
161 case Vinstr::syncvmret:
162 case Vinstr::syncvmrettype:
163 case Vinstr::phplogue:
164 case Vinstr::stubtophp:
165 case Vinstr::loadstubret:
166 case Vinstr::phpret:
167 case Vinstr::callphp:
168 case Vinstr::callphpr:
169 case Vinstr::callphps:
170 case Vinstr::contenter:
171 // vm entry abi
172 case Vinstr::resumetc:
173 case Vinstr::inittc:
174 case Vinstr::leavetc:
175 // exception intrinsics
176 case Vinstr::landingpad:
177 case Vinstr::nothrow:
178 case Vinstr::syncpoint:
179 case Vinstr::unwind:
180 // nop and trap
181 case Vinstr::nop:
182 case Vinstr::trap:
183 // restrict/unrestrict new virtuals
184 case Vinstr::vregrestrict:
185 case Vinstr::vregunrestrict:
186 // sign/zero-extending/truncating copies
187 case Vinstr::movsbl:
188 case Vinstr::movswl:
189 case Vinstr::movsbq:
190 case Vinstr::movswq:
191 case Vinstr::movslq:
192 case Vinstr::movzbw:
193 case Vinstr::movzbl:
194 case Vinstr::movzbq:
195 case Vinstr::movzwl:
196 case Vinstr::movzwq:
197 case Vinstr::movzlq:
198 case Vinstr::movtqb:
199 case Vinstr::movtdb:
200 case Vinstr::movtdq:
201 case Vinstr::movtql:
202 case Vinstr::movtqw:
203 // branches
204 case Vinstr::jcc:
205 case Vinstr::jcci:
206 case Vinstr::jmp:
207 case Vinstr::jmps:
208 case Vinstr::jmpr:
209 case Vinstr::jmpm:
210 case Vinstr::jmpi:
211 // push/pop
212 case Vinstr::pop:
213 case Vinstr::popf:
214 case Vinstr::popm:
215 case Vinstr::popp:
216 case Vinstr::poppm:
217 case Vinstr::push:
218 case Vinstr::pushf:
219 case Vinstr::pushm:
220 case Vinstr::pushp:
221 case Vinstr::pushpm:
222 // floating-point conversions
223 case Vinstr::cvttsd2siq:
224 case Vinstr::cvtsi2sd:
225 case Vinstr::cvtsi2sdm:
226 case Vinstr::unpcklpd:
227 // x64 instructions
228 case Vinstr::cqo:
229 case Vinstr::idiv:
230 case Vinstr::sarq:
231 case Vinstr::shlq:
232 case Vinstr::shrq:
233 // arm instructions
234 case Vinstr::fcvtzs:
235 case Vinstr::mrs:
236 case Vinstr::msr:
237 // ppc64 instructions
238 case Vinstr::fcmpo:
239 case Vinstr::fcmpu:
240 case Vinstr::fctidz:
241 case Vinstr::mflr:
242 case Vinstr::mtlr:
243 return Width::AnyNF;
245 case Vinstr::andb:
246 case Vinstr::andbi:
247 case Vinstr::andbim:
248 case Vinstr::notb:
249 case Vinstr::orbi:
250 case Vinstr::orbim:
251 case Vinstr::xorb:
252 case Vinstr::xorbi:
253 case Vinstr::cmpb:
254 case Vinstr::cmpbi:
255 case Vinstr::cmpbim:
256 case Vinstr::cmpbm:
257 case Vinstr::testb:
258 case Vinstr::testbi:
259 case Vinstr::testbim:
260 case Vinstr::testbm:
261 case Vinstr::cmovb:
262 case Vinstr::csincb:
263 case Vinstr::setcc:
264 case Vinstr::movb:
265 case Vinstr::loadb:
266 case Vinstr::loadtqb:
267 case Vinstr::storeb:
268 case Vinstr::storebi:
269 return Width::Byte;
271 case Vinstr::addwm:
272 case Vinstr::andw:
273 case Vinstr::andwi:
274 case Vinstr::incw:
275 case Vinstr::incwm:
276 case Vinstr::orwim:
277 case Vinstr::cmovw:
278 case Vinstr::csincw:
279 case Vinstr::cmpw:
280 case Vinstr::cmpwi:
281 case Vinstr::cmpwim:
282 case Vinstr::cmpwm:
283 case Vinstr::testw:
284 case Vinstr::testwi:
285 case Vinstr::testwim:
286 case Vinstr::testwm:
287 case Vinstr::loadw:
288 case Vinstr::movw:
289 case Vinstr::storew:
290 case Vinstr::storewi:
291 return Width::Word;
293 case Vinstr::addl:
294 case Vinstr::addli:
295 case Vinstr::addlm:
296 case Vinstr::addlim:
297 case Vinstr::andl:
298 case Vinstr::andli:
299 case Vinstr::decl:
300 case Vinstr::declm:
301 case Vinstr::incl:
302 case Vinstr::inclm:
303 case Vinstr::shlli:
304 case Vinstr::shrli:
305 case Vinstr::subl:
306 case Vinstr::subli:
307 case Vinstr::xorl:
308 case Vinstr::orlim:
309 case Vinstr::cmovl:
310 case Vinstr::csincl:
311 case Vinstr::cmpl:
312 case Vinstr::cmpli:
313 case Vinstr::cmplm:
314 case Vinstr::cmplim:
315 case Vinstr::testl:
316 case Vinstr::testli:
317 case Vinstr::testlim:
318 case Vinstr::testlm:
319 case Vinstr::movl:
320 case Vinstr::loadl:
321 case Vinstr::loadzbl:
322 case Vinstr::loadsbl:
323 case Vinstr::loadtql:
324 case Vinstr::storel:
325 case Vinstr::storeli:
326 case Vinstr::ubfmli:
327 return Width::Long;
329 case Vinstr::addq:
330 case Vinstr::addqi:
331 case Vinstr::addqmr:
332 case Vinstr::addqrm:
333 case Vinstr::addqim:
334 case Vinstr::andq:
335 case Vinstr::andqi:
336 case Vinstr::andqi64:
337 case Vinstr::decq:
338 case Vinstr::decqm:
339 case Vinstr::decqmlock:
340 case Vinstr::incq:
341 case Vinstr::incqm:
342 case Vinstr::imul:
343 case Vinstr::divint:
344 case Vinstr::srem:
345 case Vinstr::neg:
346 case Vinstr::not:
347 case Vinstr::orwi:
348 case Vinstr::orli:
349 case Vinstr::orq:
350 case Vinstr::orqi:
351 case Vinstr::orqim:
352 case Vinstr::sar:
353 case Vinstr::shl:
354 case Vinstr::shr:
355 case Vinstr::sarqi:
356 case Vinstr::shlqi:
357 case Vinstr::shrqi:
358 case Vinstr::subq:
359 case Vinstr::subqi:
360 case Vinstr::xorq:
361 case Vinstr::xorqi:
362 case Vinstr::cmpq:
363 case Vinstr::cmpqi:
364 case Vinstr::cmpqm:
365 case Vinstr::cmpqim:
366 case Vinstr::testq:
367 case Vinstr::testqi:
368 case Vinstr::testqm:
369 case Vinstr::testqim:
370 case Vinstr::cloadq:
371 case Vinstr::cmovq:
372 case Vinstr::csincq:
373 case Vinstr::lea:
374 case Vinstr::leap:
375 case Vinstr::leav:
376 case Vinstr::lead:
377 case Vinstr::loadqp:
378 case Vinstr::loadqd:
379 case Vinstr::loadzbq:
380 case Vinstr::loadzlq:
381 case Vinstr::loadsbq:
382 case Vinstr::storeqi:
383 case Vinstr::addsd:
384 case Vinstr::subsd:
385 case Vinstr::cmpsd:
386 case Vinstr::ucomisd:
387 case Vinstr::loadsd:
388 case Vinstr::storesd:
389 case Vinstr::absdbl:
390 case Vinstr::divsd:
391 case Vinstr::mulsd:
392 case Vinstr::roundsd:
393 case Vinstr::sqrtsd:
394 case Vinstr::crc32q:
395 return Width::Quad;
397 case Vinstr::loadups:
398 case Vinstr::storeups:
399 return Width::Octa;
401 not_reached();
404 ///////////////////////////////////////////////////////////////////////////////