1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 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. 12 * 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. 24 */ 25 26#ifndef DFGSaneStringGetByValSlowPathGenerator_h 27#define DFGSaneStringGetByValSlowPathGenerator_h 28 29#if ENABLE(DFG_JIT) 30 31#include "DFGCommon.h" 32#include "DFGOperations.h" 33#include "DFGSlowPathGenerator.h" 34#include "DFGSpeculativeJIT.h" 35#include <wtf/Vector.h> 36 37namespace JSC { namespace DFG { 38 39class SaneStringGetByValSlowPathGenerator : public JumpingSlowPathGenerator<MacroAssembler::Jump> { 40public: 41 SaneStringGetByValSlowPathGenerator( 42 const MacroAssembler::Jump& from, SpeculativeJIT* jit, JSValueRegs resultRegs, 43 GPRReg baseReg, GPRReg propertyReg) 44 : JumpingSlowPathGenerator<MacroAssembler::Jump>(from, jit) 45 , m_resultRegs(resultRegs) 46 , m_baseReg(baseReg) 47 , m_propertyReg(propertyReg) 48 { 49 jit->silentSpillAllRegistersImpl(false, m_plans, extractResult(resultRegs)); 50 } 51 52protected: 53 virtual void generateInternal(SpeculativeJIT* jit) override 54 { 55 linkFrom(jit); 56 57 MacroAssembler::Jump isNeg = jit->m_jit.branch32( 58 MacroAssembler::LessThan, m_propertyReg, MacroAssembler::TrustedImm32(0)); 59 60#if USE(JSVALUE64) 61 jit->m_jit.move( 62 MacroAssembler::TrustedImm64(JSValue::encode(jsUndefined())), m_resultRegs.gpr()); 63#else 64 jit->m_jit.move( 65 MacroAssembler::TrustedImm32(JSValue::UndefinedTag), m_resultRegs.tagGPR()); 66 jit->m_jit.move( 67 MacroAssembler::TrustedImm32(0), m_resultRegs.payloadGPR()); 68#endif 69 jumpTo(jit); 70 71 isNeg.link(&jit->m_jit); 72 73 for (unsigned i = 0; i < m_plans.size(); ++i) 74 jit->silentSpill(m_plans[i]); 75 jit->callOperation(operationGetByValStringInt, extractResult(m_resultRegs), m_baseReg, m_propertyReg); 76 GPRReg canTrample = SpeculativeJIT::pickCanTrample(extractResult(m_resultRegs)); 77 for (unsigned i = m_plans.size(); i--;) 78 jit->silentFill(m_plans[i], canTrample); 79 80 jumpTo(jit); 81 } 82 83private: 84 JSValueRegs m_resultRegs; 85 GPRReg m_baseReg; 86 GPRReg m_propertyReg; 87 Vector<SilentRegisterSavePlan, 2> m_plans; 88}; 89 90} } // namespace JSC::DFG 91 92#endif // ENABLE(DFG_JIT) 93 94#endif // DFGSaneStringGetByValSlowPathGenerator_h 95 96