Rename RefcountProfile to IncRefProfile
[hiphop-php.git] / hphp / runtime / vm / jit / vasm-instr.cpp
blob3d195dc4a9e6d7bac70b219abb2f821260e0aa77
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::jmpr:
47 case Vinstr::jmpm:
48 case Vinstr::jmpi:
49 case Vinstr::phijmp:
50 case Vinstr::debugguardjmp:
51 // terminal calls
52 case Vinstr::tailcallstub:
53 case Vinstr::callphp:
54 case Vinstr::tailcallphp:
55 case Vinstr::calltc:
56 case Vinstr::resumetc:
57 // exception edges
58 case Vinstr::unwind:
59 case Vinstr::vinvoke:
60 case Vinstr::vcallunpack:
61 case Vinstr::contenter:
62 // terminal
63 case Vinstr::trap:
64 case Vinstr::ret:
65 case Vinstr::stubret:
66 case Vinstr::phpret:
67 case Vinstr::leavetc:
68 case Vinstr::fallthru:
69 return true;
70 default:
71 return false;
75 bool isCall(Vinstr::Opcode op) {
76 switch (op) {
77 case Vinstr::call:
78 case Vinstr::callunpack:
79 case Vinstr::callfaststub:
80 case Vinstr::callm:
81 case Vinstr::callphp:
82 case Vinstr::callr:
83 case Vinstr::calls:
84 case Vinstr::callstub:
85 case Vinstr::calltc:
86 case Vinstr::tailcallphp:
87 case Vinstr::tailcallstub:
88 case Vinstr::vcall:
89 case Vinstr::vcallunpack:
90 case Vinstr::vinvoke:
91 return true;
92 default:
93 return false;
97 Width width(Vinstr::Opcode op) {
98 switch (op) {
99 // service requests
100 case Vinstr::bindjmp:
101 case Vinstr::bindjcc:
102 case Vinstr::bindaddr:
103 case Vinstr::fallback:
104 case Vinstr::fallbackcc:
105 case Vinstr::retransopt:
106 // vasm intrinsics
107 case Vinstr::conjure:
108 case Vinstr::conjureuse:
109 case Vinstr::copy:
110 case Vinstr::copy2:
111 case Vinstr::copyargs:
112 case Vinstr::debugguardjmp:
113 case Vinstr::debugtrap:
114 case Vinstr::fallthru:
115 case Vinstr::ldimmb:
116 case Vinstr::ldimmw:
117 case Vinstr::ldimml:
118 case Vinstr::ldimmq:
119 case Vinstr::load:
120 case Vinstr::store:
121 case Vinstr::mcprep:
122 case Vinstr::phidef:
123 case Vinstr::phijmp:
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
131 case Vinstr::vcall:
132 case Vinstr::vinvoke:
133 case Vinstr::call:
134 case Vinstr::callm:
135 case Vinstr::callr:
136 case Vinstr::calls:
137 case Vinstr::ret:
138 // stub function abi
139 case Vinstr::stublogue:
140 case Vinstr::stubret:
141 case Vinstr::callstub:
142 case Vinstr::callfaststub:
143 case Vinstr::tailcallstub:
144 case Vinstr::stubunwind:
145 // php function abi
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:
155 case Vinstr::phpret:
156 case Vinstr::callphp:
157 case Vinstr::tailcallphp:
158 case Vinstr::callunpack:
159 case Vinstr::vcallunpack:
160 case Vinstr::contenter:
161 // vm entry abi
162 case Vinstr::calltc:
163 case Vinstr::resumetc:
164 case Vinstr::inittc:
165 case Vinstr::leavetc:
166 // exception intrinsics
167 case Vinstr::landingpad:
168 case Vinstr::nothrow:
169 case Vinstr::syncpoint:
170 case Vinstr::unwind:
171 // nop and trap
172 case Vinstr::nop:
173 case Vinstr::trap:
174 // restrict/unrestrict new virtuals
175 case Vinstr::vregrestrict:
176 case Vinstr::vregunrestrict:
177 // sign/zero-extending/truncating copies
178 case Vinstr::movsbl:
179 case Vinstr::movswl:
180 case Vinstr::movsbq:
181 case Vinstr::movswq:
182 case Vinstr::movslq:
183 case Vinstr::movzbw:
184 case Vinstr::movzbl:
185 case Vinstr::movzbq:
186 case Vinstr::movzwl:
187 case Vinstr::movzwq:
188 case Vinstr::movzlq:
189 case Vinstr::movtqb:
190 case Vinstr::movtdb:
191 case Vinstr::movtdq:
192 case Vinstr::movtql:
193 case Vinstr::movtqw:
194 // branches
195 case Vinstr::jcc:
196 case Vinstr::jcci:
197 case Vinstr::jmp:
198 case Vinstr::jmpr:
199 case Vinstr::jmpm:
200 case Vinstr::jmpi:
201 // push/pop
202 case Vinstr::pop:
203 case Vinstr::popf:
204 case Vinstr::popm:
205 case Vinstr::popp:
206 case Vinstr::poppm:
207 case Vinstr::push:
208 case Vinstr::pushf:
209 case Vinstr::pushm:
210 case Vinstr::pushp:
211 case Vinstr::pushpm:
212 // floating-point conversions
213 case Vinstr::cvttsd2siq:
214 case Vinstr::cvtsi2sd:
215 case Vinstr::cvtsi2sdm:
216 case Vinstr::unpcklpd:
217 // x64 instructions
218 case Vinstr::cqo:
219 case Vinstr::idiv:
220 case Vinstr::sarq:
221 case Vinstr::shlq:
222 // arm instructions
223 case Vinstr::fcvtzs:
224 case Vinstr::mrs:
225 case Vinstr::msr:
226 // ppc64 instructions
227 case Vinstr::fcmpo:
228 case Vinstr::fcmpu:
229 case Vinstr::fctidz:
230 case Vinstr::mflr:
231 case Vinstr::mtlr:
232 return Width::AnyNF;
234 case Vinstr::andb:
235 case Vinstr::andbi:
236 case Vinstr::andbim:
237 case Vinstr::notb:
238 case Vinstr::orbim:
239 case Vinstr::xorb:
240 case Vinstr::xorbi:
241 case Vinstr::cmpb:
242 case Vinstr::cmpbi:
243 case Vinstr::cmpbim:
244 case Vinstr::cmpbm:
245 case Vinstr::testb:
246 case Vinstr::testbi:
247 case Vinstr::testbim:
248 case Vinstr::cmovb:
249 case Vinstr::csincb:
250 case Vinstr::setcc:
251 case Vinstr::movb:
252 case Vinstr::loadb:
253 case Vinstr::loadtqb:
254 case Vinstr::storeb:
255 case Vinstr::storebi:
256 return Width::Byte;
258 case Vinstr::addwm:
259 case Vinstr::incw:
260 case Vinstr::incwm:
261 case Vinstr::orwim:
262 case Vinstr::cmovw:
263 case Vinstr::csincw:
264 case Vinstr::cmpw:
265 case Vinstr::cmpwi:
266 case Vinstr::cmpwim:
267 case Vinstr::cmpwm:
268 case Vinstr::testw:
269 case Vinstr::testwi:
270 case Vinstr::testwim:
271 case Vinstr::loadw:
272 case Vinstr::movw:
273 case Vinstr::storew:
274 case Vinstr::storewi:
275 return Width::Word;
277 case Vinstr::addl:
278 case Vinstr::addli:
279 case Vinstr::addlm:
280 case Vinstr::addlim:
281 case Vinstr::andl:
282 case Vinstr::andli:
283 case Vinstr::decl:
284 case Vinstr::declm:
285 case Vinstr::incl:
286 case Vinstr::inclm:
287 case Vinstr::shlli:
288 case Vinstr::shrli:
289 case Vinstr::subl:
290 case Vinstr::subli:
291 case Vinstr::xorl:
292 case Vinstr::orlim:
293 case Vinstr::cmovl:
294 case Vinstr::csincl:
295 case Vinstr::cmpl:
296 case Vinstr::cmpli:
297 case Vinstr::cmplm:
298 case Vinstr::cmplim:
299 case Vinstr::testl:
300 case Vinstr::testli:
301 case Vinstr::testlim:
302 case Vinstr::movl:
303 case Vinstr::loadl:
304 case Vinstr::loadzbl:
305 case Vinstr::loadsbl:
306 case Vinstr::loadtql:
307 case Vinstr::storel:
308 case Vinstr::storeli:
309 case Vinstr::ubfmli:
310 return Width::Long;
312 case Vinstr::addq:
313 case Vinstr::addqi:
314 case Vinstr::addqmr:
315 case Vinstr::addqrm:
316 case Vinstr::addqim:
317 case Vinstr::andq:
318 case Vinstr::andqi:
319 case Vinstr::andqi64:
320 case Vinstr::decq:
321 case Vinstr::decqm:
322 case Vinstr::decqmlock:
323 case Vinstr::incq:
324 case Vinstr::incqm:
325 case Vinstr::imul:
326 case Vinstr::divint:
327 case Vinstr::srem:
328 case Vinstr::neg:
329 case Vinstr::not:
330 case Vinstr::orq:
331 case Vinstr::orqi:
332 case Vinstr::orqim:
333 case Vinstr::sar:
334 case Vinstr::shl:
335 case Vinstr::sarqi:
336 case Vinstr::shlqi:
337 case Vinstr::shrqi:
338 case Vinstr::subq:
339 case Vinstr::subqi:
340 case Vinstr::xorq:
341 case Vinstr::xorqi:
342 case Vinstr::cmpq:
343 case Vinstr::cmpqi:
344 case Vinstr::cmpqm:
345 case Vinstr::cmpqim:
346 case Vinstr::testq:
347 case Vinstr::testqi:
348 case Vinstr::testqm:
349 case Vinstr::testqim:
350 case Vinstr::cloadq:
351 case Vinstr::cmovq:
352 case Vinstr::csincq:
353 case Vinstr::lea:
354 case Vinstr::leap:
355 case Vinstr::lead:
356 case Vinstr::loadqp:
357 case Vinstr::loadqd:
358 case Vinstr::loadzbq:
359 case Vinstr::loadzlq:
360 case Vinstr::loadsbq:
361 case Vinstr::storeqi:
362 case Vinstr::addsd:
363 case Vinstr::subsd:
364 case Vinstr::cmpsd:
365 case Vinstr::ucomisd:
366 case Vinstr::loadsd:
367 case Vinstr::storesd:
368 case Vinstr::absdbl:
369 case Vinstr::divsd:
370 case Vinstr::mulsd:
371 case Vinstr::roundsd:
372 case Vinstr::sqrtsd:
373 return Width::Quad;
375 case Vinstr::loadups:
376 case Vinstr::storeups:
377 return Width::Octa;
379 not_reached();
382 ///////////////////////////////////////////////////////////////////////////////