]>
git.saurik.com Git - apple/javascriptcore.git/blob - jit/SlowPathCall.h
   2  * Copyright (C) 2013 Apple Inc. All rights reserved. 
   4  * Redistribution and use in source and binary forms, with or without 
   5  * modification, are permitted provided that the following conditions 
   7  * 1. Redistributions of source code must retain the above copyright 
   8  *    notice, this list of conditions and the following disclaimer. 
   9  * 2. Redistributions in binary form must reproduce the above copyright 
  10  *    notice, this list of conditions and the following disclaimer in the 
  11  *    documentation and/or other materials provided with the distribution. 
  13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 
  14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR 
  17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
  21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
  22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
  26 #ifndef SlowPathCall_h 
  27 #define SlowPathCall_h 
  29 #include "CommonSlowPaths.h" 
  30 #include "MacroAssemblerCodeRef.h" 
  36 class JITSlowPathCall 
{ 
  38     JITSlowPathCall(JIT
* jit
, Instruction
* pc
, SlowPathReturnType (SLOW_PATH 
*stub
)(ExecState
* exec
, Instruction
* pc
)) 
  47 #if ENABLE(OPCODE_SAMPLING) 
  48         if (m_jit
->m_bytecodeOffset 
!= std::numeric_limits
<unsigned>::max()) 
  49             m_jit
->sampleInstruction(m_jit
->m_codeBlock
->instructions().begin() + m_jit
->m_bytecodeOffset
, true); 
  51         m_jit
->updateTopCallFrame(); 
  52 #if CPU(X86) && USE(JSVALUE32_64) 
  53         m_jit
->addPtr(MacroAssembler::TrustedImm32(-8), MacroAssembler::stackPointerRegister
); 
  54         m_jit
->push(JIT::TrustedImm32(JIT::TrustedImmPtr(m_pc
))); 
  55         m_jit
->push(JIT::callFrameRegister
); 
  56 #elif CPU(X86_64) && OS(WINDOWS) 
  57         m_jit
->addPtr(MacroAssembler::TrustedImm32(-16), MacroAssembler::stackPointerRegister
); 
  58         m_jit
->move(MacroAssembler::stackPointerRegister
, JIT::argumentGPR0
); 
  59         m_jit
->move(JIT::callFrameRegister
, JIT::argumentGPR1
); 
  60         m_jit
->move(JIT::TrustedImmPtr(m_pc
), JIT::argumentGPR2
); 
  62         m_jit
->move(JIT::callFrameRegister
, JIT::argumentGPR0
); 
  63         m_jit
->move(JIT::TrustedImmPtr(m_pc
), JIT::argumentGPR1
); 
  65         JIT::Call call 
= m_jit
->call(); 
  66         m_jit
->m_calls
.append(CallRecord(call
, m_jit
->m_bytecodeOffset
, m_stub
.value())); 
  68 #if CPU(X86) && USE(JSVALUE32_64) 
  69         m_jit
->addPtr(MacroAssembler::TrustedImm32(16), MacroAssembler::stackPointerRegister
); 
  70 #elif CPU(X86_64) && OS(WINDOWS) 
  71         m_jit
->pop(JIT::regT0
); // vPC 
  72         m_jit
->pop(JIT::regT1
); // callFrame register 
  75 #if ENABLE(OPCODE_SAMPLING) 
  76         if (m_jit
->m_bytecodeOffset 
!= std::numeric_limits
<unsigned>::max()) 
  77             m_jit
->sampleInstruction(m_jit
->m_codeBlock
->instructions().begin() + m_jit
->m_bytecodeOffset
, false); 
  80         m_jit
->exceptionCheck(); 
  94 #endif // SlowPathCall_h