Various llvm backend bugfixes
[hiphop-php.git] / hphp / runtime / vm / jit / code-gen-helpers.h
blob81e9ea5dcf431423c0497361af0cf4483f68714c
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-2014 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 #ifndef incl_HPHP_VM_CODEGENHELPERS_H_
18 #define incl_HPHP_VM_CODEGENHELPERS_H_
20 #include "hphp/runtime/vm/jit/type.h"
21 #include "hphp/runtime/vm/jit/phys-reg.h"
22 #include "hphp/runtime/vm/jit/vasm-x64.h"
23 #include "hphp/util/abi-cxx.h"
25 namespace HPHP { namespace jit {
28 * SaveFP uses rVmFp, as usual. SavePC requires the caller to have
29 * placed the PC offset of the instruction about to be executed in
30 * rdi.
32 enum class RegSaveFlags {
33 None = 0,
34 SaveFP = 1,
35 SavePC = 2
37 inline RegSaveFlags operator|(const RegSaveFlags& l, const RegSaveFlags& r) {
38 return RegSaveFlags(int(r) | int(l));
40 inline RegSaveFlags operator&(const RegSaveFlags& l, const RegSaveFlags& r) {
41 return RegSaveFlags(int(r) & int(l));
43 inline RegSaveFlags operator~(const RegSaveFlags& f) {
44 return RegSaveFlags(~int(f));
47 template <class T, class F>
48 Vreg cond(Vout& v, ConditionCode cc, Vreg sf, Vreg dst, T t, F f) {
49 auto fblock = v.makeBlock();
50 auto tblock = v.makeBlock();
51 auto done = v.makeBlock();
52 v << jcc{cc, sf, {fblock, tblock}};
53 v = tblock;
54 auto treg = t(v);
55 v << phijmp{done, v.makeTuple(VregList{treg})};
56 v = fblock;
57 auto freg = f(v);
58 v << phijmp{done, v.makeTuple(VregList{freg})};
59 v = done;
60 v << phidef{v.makeTuple(VregList{dst})};
61 return dst;
66 #endif