Arquivos
hhvm/hphp/runtime/vm/jit/physreg.cpp
T
bsimmers cf197fee81 Collapse runtime/vm/translator's contents into runtime/vm/jit
Facebook: ~bsimmers/bin/move-vm-files.sh
2013-06-03 10:54:43 -07:00

63 linhas
2.0 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#include "hphp/runtime/vm/jit/physreg.h"
namespace HPHP { namespace Transl {
PhysRegSaverParity::PhysRegSaverParity(int parity, X64Assembler& as,
RegSet regs)
: m_as(as)
, m_regs(regs)
, m_adjust((parity & 0x1) == (regs.size() & 0x1) ? 8 : 0)
{
m_regs.forEach([&] (PhysReg pr) {
m_as. push (pr);
});
if (m_adjust) {
// Maintain stack evenness for SIMD compatibility.
m_as. subq (m_adjust, reg::rsp);
}
}
PhysRegSaverParity::~PhysRegSaverParity() {
if (m_adjust) {
// See above; stack parity.
m_as. addq (m_adjust, reg::rsp);
}
emitPops(m_as, m_regs);
}
void PhysRegSaverParity::emitPops(X64Assembler& as, RegSet regs) {
regs.forEachR([&] (PhysReg pr) {
as. pop (pr);
});
}
int PhysRegSaverParity::rspAdjustment() const {
return m_adjust;
}
int PhysRegSaverParity::rspTotalAdjustmentRegs() const {
return m_regs.size() + m_adjust / sizeof(int64_t);
}
void PhysRegSaverParity::bytesPushed(int64_t bytes) {
m_adjust += bytes;
}
} }