void JIT::emit_op_bitand(Instruction* currentInstruction) { unsigned result = currentInstruction[1].u.operand; unsigned op1 = currentInstruction[2].u.operand; unsigned op2 = currentInstruction[3].u.operand; if (isOperandConstantImmediateInt(op1)) { emitGetVirtualRegister(op2, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); int32_t imm = getConstantOperandImmediateInt(op1); andPtr(Imm32(imm), regT0); if (imm >= 0) emitFastArithIntToImmNoCheck(regT0, regT0); } else if (isOperandConstantImmediateInt(op2)) { emitGetVirtualRegister(op1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); int32_t imm = getConstantOperandImmediateInt(op2); andPtr(Imm32(imm), regT0); if (imm >= 0) emitFastArithIntToImmNoCheck(regT0, regT0); } else { emitGetVirtualRegisters(op1, regT0, op2, regT1); andPtr(regT1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); } emitPutVirtualRegister(result); }
void JITCompiler::compileExceptionHandlers() { if (m_exceptionChecks.empty() && m_exceptionChecksWithCallFrameRollback.empty()) return; Jump doLookup; if (!m_exceptionChecksWithCallFrameRollback.empty()) { // Remove hostCallFrameFlag from caller. m_exceptionChecksWithCallFrameRollback.link(this); emitGetCallerFrameFromCallFrameHeaderPtr(GPRInfo::argumentGPR0); andPtr(TrustedImm32(safeCast<int32_t>(~CallFrame::hostCallFrameFlag())), GPRInfo::argumentGPR0); doLookup = jump(); } if (!m_exceptionChecks.empty()) m_exceptionChecks.link(this); // lookupExceptionHandler is passed one argument, the exec (the CallFrame*). move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); if (doLookup.isSet()) doLookup.link(this); #if CPU(X86) // FIXME: should use the call abstraction, but this is currently in the SpeculativeJIT layer! poke(GPRInfo::argumentGPR0); #endif m_calls.append(CallLinkRecord(call(), lookupExceptionHandler)); jumpToExceptionHandler(); }