2 +----------------------------------------------------------------------+
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");
26 static_assert(sizeof(Vinstr
) <= 64, "Vinstr should be <= 64 bytes");
28 const char* vinst_names
[] = {
29 #define O(name, imms, uses, defs) #name,
34 ///////////////////////////////////////////////////////////////////////////////
36 bool isBlockEnd(const Vinstr
& inst
) {
38 // service request-y things
40 case Vinstr::fallback
:
41 case Vinstr::retransopt
:
50 case Vinstr::debugguardjmp
:
52 case Vinstr::tailcallstub
:
54 case Vinstr::tailcallphp
:
56 case Vinstr::resumetc
:
60 case Vinstr::vcallunpack
:
61 case Vinstr::contenter
:
68 case Vinstr::fallthru
:
75 bool isCall(Vinstr::Opcode op
) {
78 case Vinstr::callunpack
:
79 case Vinstr::callfaststub
:
84 case Vinstr::callstub
:
86 case Vinstr::tailcallphp
:
87 case Vinstr::tailcallstub
:
89 case Vinstr::vcallunpack
:
97 Width
width(Vinstr::Opcode op
) {
100 case Vinstr::bindjmp
:
101 case Vinstr::bindjcc
:
102 case Vinstr::bindaddr
:
103 case Vinstr::fallback
:
104 case Vinstr::fallbackcc
:
105 case Vinstr::retransopt
:
107 case Vinstr::conjure
:
108 case Vinstr::conjureuse
:
111 case Vinstr::copyargs
:
112 case Vinstr::debugguardjmp
:
113 case Vinstr::debugtrap
:
114 case Vinstr::fallthru
:
124 case Vinstr::funcguard
:
125 case Vinstr::inlinestart
:
126 case Vinstr::inlineend
:
127 case Vinstr::pushframe
:
128 case Vinstr::popframe
:
129 case Vinstr::recordstack
:
130 // native function abi
132 case Vinstr::vinvoke
:
139 case Vinstr::stublogue
:
140 case Vinstr::stubret
:
141 case Vinstr::callstub
:
142 case Vinstr::callfaststub
:
143 case Vinstr::tailcallstub
:
144 case Vinstr::stubunwind
:
146 case Vinstr::defvmsp
:
147 case Vinstr::syncvmsp
:
148 case Vinstr::defvmretdata
:
149 case Vinstr::defvmrettype
:
150 case Vinstr::syncvmret
:
151 case Vinstr::syncvmrettype
:
152 case Vinstr::phplogue
:
153 case Vinstr::stubtophp
:
154 case Vinstr::loadstubret
:
156 case Vinstr::callphp
:
157 case Vinstr::tailcallphp
:
158 case Vinstr::callunpack
:
159 case Vinstr::vcallunpack
:
160 case Vinstr::contenter
:
163 case Vinstr::resumetc
:
165 case Vinstr::leavetc
:
166 // exception intrinsics
167 case Vinstr::landingpad
:
168 case Vinstr::nothrow
:
169 case Vinstr::syncpoint
:
174 // restrict/unrestrict new virtuals
175 case Vinstr::vregrestrict
:
176 case Vinstr::vregunrestrict
:
177 // sign/zero-extending/truncating copies
212 // floating-point conversions
213 case Vinstr::cvttsd2siq
:
214 case Vinstr::cvtsi2sd
:
215 case Vinstr::cvtsi2sdm
:
216 case Vinstr::unpcklpd
:
226 // ppc64 instructions
247 case Vinstr::testbim
:
253 case Vinstr::loadtqb
:
255 case Vinstr::storebi
:
270 case Vinstr::testwim
:
274 case Vinstr::storewi
:
301 case Vinstr::testlim
:
304 case Vinstr::loadzbl
:
305 case Vinstr::loadsbl
:
306 case Vinstr::loadtql
:
308 case Vinstr::storeli
:
319 case Vinstr::andqi64
:
322 case Vinstr::decqmlock
:
349 case Vinstr::testqim
:
358 case Vinstr::loadzbq
:
359 case Vinstr::loadzlq
:
360 case Vinstr::loadsbq
:
361 case Vinstr::storeqi
:
365 case Vinstr::ucomisd
:
367 case Vinstr::storesd
:
371 case Vinstr::roundsd
:
375 case Vinstr::loadups
:
376 case Vinstr::storeups
:
382 ///////////////////////////////////////////////////////////////////////////////