JITLeftShiftGenerator.cpp [plain text]
#include "config.h"
#include "JITLeftShiftGenerator.h"
#if ENABLE(JIT)
namespace JSC {
void JITLeftShiftGenerator::generateFastPath(CCallHelpers& jit)
{
ASSERT(m_scratchGPR != InvalidGPRReg);
ASSERT(m_scratchGPR != m_left.payloadGPR());
ASSERT(m_scratchGPR != m_right.payloadGPR());
#if USE(JSVALUE32_64)
ASSERT(m_scratchGPR != m_left.tagGPR());
ASSERT(m_scratchGPR != m_right.tagGPR());
#endif
ASSERT(!m_leftOperand.isConstInt32() || !m_rightOperand.isConstInt32());
m_didEmitFastPath = true;
if (m_rightOperand.isConstInt32()) {
m_slowPathJumpList.append(jit.branchIfNotInt32(m_left));
jit.moveValueRegs(m_left, m_result);
jit.lshift32(CCallHelpers::Imm32(m_rightOperand.asConstInt32()), m_result.payloadGPR());
} else {
m_slowPathJumpList.append(jit.branchIfNotInt32(m_right));
GPRReg rightOperandGPR = m_right.payloadGPR();
if (rightOperandGPR == m_result.payloadGPR()) {
jit.move(rightOperandGPR, m_scratchGPR);
rightOperandGPR = m_scratchGPR;
}
if (m_leftOperand.isConstInt32()) {
#if USE(JSVALUE32_64)
jit.move(m_right.tagGPR(), m_result.tagGPR());
#endif
jit.move(CCallHelpers::Imm32(m_leftOperand.asConstInt32()), m_result.payloadGPR());
} else {
m_slowPathJumpList.append(jit.branchIfNotInt32(m_left));
jit.moveValueRegs(m_left, m_result);
}
jit.lshift32(rightOperandGPR, m_result.payloadGPR());
}
#if USE(JSVALUE64)
jit.or64(GPRInfo::tagTypeNumberRegister, m_result.payloadGPR());
#endif
}
}
#endif // ENABLE(JIT)