12bde8e466a4451c7319e3a072d118917957d6554Steve Block/*
22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Apple Inc. All rights reserved.
32bde8e466a4451c7319e3a072d118917957d6554Steve Block *
42bde8e466a4451c7319e3a072d118917957d6554Steve Block * Redistribution and use in source and binary forms, with or without
52bde8e466a4451c7319e3a072d118917957d6554Steve Block * modification, are permitted provided that the following conditions
62bde8e466a4451c7319e3a072d118917957d6554Steve Block * are met:
72bde8e466a4451c7319e3a072d118917957d6554Steve Block * 1. Redistributions of source code must retain the above copyright
82bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer.
92bde8e466a4451c7319e3a072d118917957d6554Steve Block * 2. Redistributions in binary form must reproduce the above copyright
102bde8e466a4451c7319e3a072d118917957d6554Steve Block *    notice, this list of conditions and the following disclaimer in the
112bde8e466a4451c7319e3a072d118917957d6554Steve Block *    documentation and/or other materials provided with the distribution.
122bde8e466a4451c7319e3a072d118917957d6554Steve Block *
132bde8e466a4451c7319e3a072d118917957d6554Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
142bde8e466a4451c7319e3a072d118917957d6554Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
152bde8e466a4451c7319e3a072d118917957d6554Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162bde8e466a4451c7319e3a072d118917957d6554Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
172bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
182bde8e466a4451c7319e3a072d118917957d6554Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
192bde8e466a4451c7319e3a072d118917957d6554Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
202bde8e466a4451c7319e3a072d118917957d6554Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
212bde8e466a4451c7319e3a072d118917957d6554Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
222bde8e466a4451c7319e3a072d118917957d6554Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
232bde8e466a4451c7319e3a072d118917957d6554Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
242bde8e466a4451c7319e3a072d118917957d6554Steve Block */
252bde8e466a4451c7319e3a072d118917957d6554Steve Block
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "config.h"
272bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DFGJITCodeGenerator.h"
282bde8e466a4451c7319e3a072d118917957d6554Steve Block
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(DFG_JIT)
302bde8e466a4451c7319e3a072d118917957d6554Steve Block
312bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DFGNonSpeculativeJIT.h"
322bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "DFGSpeculativeJIT.h"
332bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "LinkBuffer.h"
342bde8e466a4451c7319e3a072d118917957d6554Steve Block
352bde8e466a4451c7319e3a072d118917957d6554Steve Blocknamespace JSC { namespace DFG {
362bde8e466a4451c7319e3a072d118917957d6554Steve Block
372bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRReg JITCodeGenerator::fillInteger(NodeIndex nodeIndex, DataFormat& returnFormat)
382bde8e466a4451c7319e3a072d118917957d6554Steve Block{
392bde8e466a4451c7319e3a072d118917957d6554Steve Block    Node& node = m_jit.graph()[nodeIndex];
402bde8e466a4451c7319e3a072d118917957d6554Steve Block    VirtualRegister virtualRegister = node.virtualRegister;
412bde8e466a4451c7319e3a072d118917957d6554Steve Block    GenerationInfo& info = m_generationInfo[virtualRegister];
422bde8e466a4451c7319e3a072d118917957d6554Steve Block
432bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (info.registerFormat() == DataFormatNone) {
442bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = allocate();
452bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(gpr);
462bde8e466a4451c7319e3a072d118917957d6554Steve Block
472bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (node.isConstant()) {
482bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
492bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (isInt32Constant(nodeIndex)) {
502bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::Imm32(valueOfInt32Constant(nodeIndex)), reg);
512bde8e466a4451c7319e3a072d118917957d6554Steve Block                info.fillInteger(gpr);
522bde8e466a4451c7319e3a072d118917957d6554Steve Block                returnFormat = DataFormatInteger;
532bde8e466a4451c7319e3a072d118917957d6554Steve Block                return gpr;
542bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
552bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (isDoubleConstant(nodeIndex)) {
562bde8e466a4451c7319e3a072d118917957d6554Steve Block                JSValue jsValue = jsNumber(valueOfDoubleConstant(nodeIndex));
572bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), reg);
582bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else {
592bde8e466a4451c7319e3a072d118917957d6554Steve Block                ASSERT(isJSConstant(nodeIndex));
602bde8e466a4451c7319e3a072d118917957d6554Steve Block                JSValue jsValue = valueOfJSConstant(nodeIndex);
612bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), reg);
622bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
632bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else {
642bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(info.spillFormat() == DataFormatJS || info.spillFormat() == DataFormatJSInteger);
652bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
662bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_jit.loadPtr(JITCompiler::addressFor(virtualRegister), reg);
672bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
682bde8e466a4451c7319e3a072d118917957d6554Steve Block
692bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Since we statically know that we're filling an integer, and values
702bde8e466a4451c7319e3a072d118917957d6554Steve Block        // in the RegisterFile are boxed, this must be DataFormatJSInteger.
712bde8e466a4451c7319e3a072d118917957d6554Steve Block        // We will check this with a jitAssert below.
722bde8e466a4451c7319e3a072d118917957d6554Steve Block        info.fillJSValue(gpr, DataFormatJSInteger);
732bde8e466a4451c7319e3a072d118917957d6554Steve Block        unlock(gpr);
742bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
752bde8e466a4451c7319e3a072d118917957d6554Steve Block
762bde8e466a4451c7319e3a072d118917957d6554Steve Block    switch (info.registerFormat()) {
772bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatNone:
782bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Should have filled, above.
792bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSDouble:
802bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatDouble:
812bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJS:
822bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatCell:
832bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSCell:
842bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Should only be calling this function if we know this operand to be integer.
852bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT_NOT_REACHED();
862bde8e466a4451c7319e3a072d118917957d6554Steve Block
872bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSInteger: {
882bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = info.gpr();
892bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.lock(gpr);
902bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.jitAssertIsJSInt32(gpr);
912bde8e466a4451c7319e3a072d118917957d6554Steve Block        returnFormat = DataFormatJSInteger;
922bde8e466a4451c7319e3a072d118917957d6554Steve Block        return gpr;
932bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
942bde8e466a4451c7319e3a072d118917957d6554Steve Block
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatInteger: {
962bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = info.gpr();
972bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.lock(gpr);
982bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.jitAssertIsInt32(gpr);
992bde8e466a4451c7319e3a072d118917957d6554Steve Block        returnFormat = DataFormatInteger;
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block        return gpr;
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT_NOT_REACHED();
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block    return InvalidGPRReg;
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block
1082bde8e466a4451c7319e3a072d118917957d6554Steve BlockFPRReg JITCodeGenerator::fillDouble(NodeIndex nodeIndex)
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block    Node& node = m_jit.graph()[nodeIndex];
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block    VirtualRegister virtualRegister = node.virtualRegister;
1122bde8e466a4451c7319e3a072d118917957d6554Steve Block    GenerationInfo& info = m_generationInfo[virtualRegister];
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (info.registerFormat() == DataFormatNone) {
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = allocate();
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(gpr);
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (node.isConstant()) {
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (isInt32Constant(nodeIndex)) {
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block                // FIXME: should not be reachable?
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::Imm32(valueOfInt32Constant(nodeIndex)), reg);
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block                info.fillInteger(gpr);
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block                unlock(gpr);
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else if (isDoubleConstant(nodeIndex)) {
1262bde8e466a4451c7319e3a072d118917957d6554Steve Block                FPRReg fpr = fprAllocate();
1272bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfDoubleConstant(nodeIndex)))), reg);
1282bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.movePtrToDouble(reg, JITCompiler::fprToRegisterID(fpr));
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block                unlock(gpr);
1302bde8e466a4451c7319e3a072d118917957d6554Steve Block
1312bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
1322bde8e466a4451c7319e3a072d118917957d6554Steve Block                info.fillDouble(fpr);
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block                return fpr;
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else {
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block                // FIXME: should not be reachable?
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block                ASSERT(isJSConstant(nodeIndex));
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block                JSValue jsValue = valueOfJSConstant(nodeIndex);
1382bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), reg);
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
1402bde8e466a4451c7319e3a072d118917957d6554Steve Block                info.fillJSValue(gpr, DataFormatJS);
1412bde8e466a4451c7319e3a072d118917957d6554Steve Block                unlock(gpr);
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
1432bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else {
1442bde8e466a4451c7319e3a072d118917957d6554Steve Block            DataFormat spillFormat = info.spillFormat();
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(spillFormat & DataFormatJS);
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_jit.loadPtr(JITCompiler::addressFor(virtualRegister), reg);
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block            info.fillJSValue(gpr, m_isSpeculative ? spillFormat : DataFormatJS);
1492bde8e466a4451c7319e3a072d118917957d6554Steve Block            unlock(gpr);
1502bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1522bde8e466a4451c7319e3a072d118917957d6554Steve Block
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block    switch (info.registerFormat()) {
1542bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatNone:
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Should have filled, above.
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatCell:
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSCell:
1582bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Should only be calling this function if we know this operand to be numeric.
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT_NOT_REACHED();
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block
1612bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJS: {
1622bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg jsValueGpr = info.gpr();
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.lock(jsValueGpr);
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block        FPRReg fpr = fprAllocate();
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg tempGpr = allocate(); // FIXME: can we skip this allocation on the last use of the virtual register?
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::RegisterID jsValueReg = JITCompiler::gprToRegisterID(jsValueGpr);
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::FPRegisterID fpReg = JITCompiler::fprToRegisterID(fpr);
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::RegisterID tempReg = JITCompiler::gprToRegisterID(tempGpr);
1702bde8e466a4451c7319e3a072d118917957d6554Steve Block
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::Jump isInteger = m_jit.branchPtr(MacroAssembler::AboveOrEqual, jsValueReg, JITCompiler::tagTypeNumberRegister);
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block
1732bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.jitAssertIsJSDouble(jsValueGpr);
1742bde8e466a4451c7319e3a072d118917957d6554Steve Block
1752bde8e466a4451c7319e3a072d118917957d6554Steve Block        // First, if we get here we have a double encoded as a JSValue
1762bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.move(jsValueReg, tempReg);
1772bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.addPtr(JITCompiler::tagTypeNumberRegister, tempReg);
1782bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.movePtrToDouble(tempReg, fpReg);
1792bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::Jump hasUnboxedDouble = m_jit.jump();
1802bde8e466a4451c7319e3a072d118917957d6554Steve Block
1812bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Finally, handle integers.
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block        isInteger.link(&m_jit);
1832bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.convertInt32ToDouble(jsValueReg, fpReg);
1842bde8e466a4451c7319e3a072d118917957d6554Steve Block        hasUnboxedDouble.link(&m_jit);
1852bde8e466a4451c7319e3a072d118917957d6554Steve Block
1862bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.release(jsValueGpr);
1872bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.unlock(jsValueGpr);
1882bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.unlock(tempGpr);
1892bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
1902bde8e466a4451c7319e3a072d118917957d6554Steve Block        info.fillDouble(fpr);
1912bde8e466a4451c7319e3a072d118917957d6554Steve Block        return fpr;
1922bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSInteger:
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatInteger: {
1962bde8e466a4451c7319e3a072d118917957d6554Steve Block        FPRReg fpr = fprAllocate();
1972bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = info.gpr();
1982bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.lock(gpr);
1992bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(gpr);
2002bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::FPRegisterID fpReg = JITCompiler::fprToRegisterID(fpr);
2012bde8e466a4451c7319e3a072d118917957d6554Steve Block
2022bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.convertInt32ToDouble(reg, fpReg);
2032bde8e466a4451c7319e3a072d118917957d6554Steve Block
2042bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.release(gpr);
2052bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.unlock(gpr);
2062bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
2072bde8e466a4451c7319e3a072d118917957d6554Steve Block        info.fillDouble(fpr);
2082bde8e466a4451c7319e3a072d118917957d6554Steve Block        return fpr;
2092bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2102bde8e466a4451c7319e3a072d118917957d6554Steve Block
2112bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Unbox the double
2122bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSDouble: {
2132bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = info.gpr();
2142bde8e466a4451c7319e3a072d118917957d6554Steve Block        FPRReg fpr = unboxDouble(gpr);
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block
2162bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.release(gpr);
2172bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fprs.retain(fpr, virtualRegister, SpillOrderDouble);
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block
2192bde8e466a4451c7319e3a072d118917957d6554Steve Block        info.fillDouble(fpr);
2202bde8e466a4451c7319e3a072d118917957d6554Steve Block        return fpr;
2212bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2222bde8e466a4451c7319e3a072d118917957d6554Steve Block
2232bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatDouble: {
2242bde8e466a4451c7319e3a072d118917957d6554Steve Block        FPRReg fpr = info.fpr();
2252bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fprs.lock(fpr);
2262bde8e466a4451c7319e3a072d118917957d6554Steve Block        return fpr;
2272bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2282bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2292bde8e466a4451c7319e3a072d118917957d6554Steve Block
2302bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT_NOT_REACHED();
2312bde8e466a4451c7319e3a072d118917957d6554Steve Block    return InvalidFPRReg;
2322bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2332bde8e466a4451c7319e3a072d118917957d6554Steve Block
2342bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRReg JITCodeGenerator::fillJSValue(NodeIndex nodeIndex)
2352bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2362bde8e466a4451c7319e3a072d118917957d6554Steve Block    Node& node = m_jit.graph()[nodeIndex];
2372bde8e466a4451c7319e3a072d118917957d6554Steve Block    VirtualRegister virtualRegister = node.virtualRegister;
2382bde8e466a4451c7319e3a072d118917957d6554Steve Block    GenerationInfo& info = m_generationInfo[virtualRegister];
2392bde8e466a4451c7319e3a072d118917957d6554Steve Block
2402bde8e466a4451c7319e3a072d118917957d6554Steve Block    switch (info.registerFormat()) {
2412bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatNone: {
2422bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = allocate();
2432bde8e466a4451c7319e3a072d118917957d6554Steve Block        JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(gpr);
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block
2452bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (node.isConstant()) {
2462bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (isInt32Constant(nodeIndex)) {
2472bde8e466a4451c7319e3a072d118917957d6554Steve Block                info.fillJSValue(gpr, DataFormatJSInteger);
2482bde8e466a4451c7319e3a072d118917957d6554Steve Block                JSValue jsValue = jsNumber(valueOfInt32Constant(nodeIndex));
2492bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), reg);
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else if (isDoubleConstant(nodeIndex)) {
2512bde8e466a4451c7319e3a072d118917957d6554Steve Block                info.fillJSValue(gpr, DataFormatJSDouble);
2522bde8e466a4451c7319e3a072d118917957d6554Steve Block                JSValue jsValue(JSValue::EncodeAsDouble, valueOfDoubleConstant(nodeIndex));
2532bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), reg);
2542bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else {
2552bde8e466a4451c7319e3a072d118917957d6554Steve Block                ASSERT(isJSConstant(nodeIndex));
2562bde8e466a4451c7319e3a072d118917957d6554Steve Block                JSValue jsValue = valueOfJSConstant(nodeIndex);
2572bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), reg);
2582bde8e466a4451c7319e3a072d118917957d6554Steve Block                info.fillJSValue(gpr, DataFormatJS);
2592bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
2602bde8e466a4451c7319e3a072d118917957d6554Steve Block
2612bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
2622bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else {
2632bde8e466a4451c7319e3a072d118917957d6554Steve Block            DataFormat spillFormat = info.spillFormat();
2642bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(spillFormat & DataFormatJS);
2652bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_gprs.retain(gpr, virtualRegister, SpillOrderSpilled);
2662bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_jit.loadPtr(JITCompiler::addressFor(virtualRegister), reg);
2672bde8e466a4451c7319e3a072d118917957d6554Steve Block            info.fillJSValue(gpr, m_isSpeculative ? spillFormat : DataFormatJS);
2682bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
2692bde8e466a4451c7319e3a072d118917957d6554Steve Block        return gpr;
2702bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2712bde8e466a4451c7319e3a072d118917957d6554Steve Block
2722bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatInteger: {
2732bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = info.gpr();
2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // If the register has already been locked we need to take a copy.
2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // If not, we'll zero extend in place, so mark on the info that this is now type DataFormatInteger, not DataFormatJSInteger.
2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_gprs.isLocked(gpr)) {
2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            GPRReg result = allocate();
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_jit.orPtr(JITCompiler::tagTypeNumberRegister, JITCompiler::gprToRegisterID(gpr), JITCompiler::gprToRegisterID(result));
2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return result;
2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
2812bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.lock(gpr);
2822bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_jit.orPtr(JITCompiler::tagTypeNumberRegister, JITCompiler::gprToRegisterID(gpr));
2832bde8e466a4451c7319e3a072d118917957d6554Steve Block        info.fillJSValue(gpr, DataFormatJSInteger);
2842bde8e466a4451c7319e3a072d118917957d6554Steve Block        return gpr;
2852bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2862bde8e466a4451c7319e3a072d118917957d6554Steve Block
2872bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatDouble: {
2882bde8e466a4451c7319e3a072d118917957d6554Steve Block        FPRReg fpr = info.fpr();
2892bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = boxDouble(fpr);
2902bde8e466a4451c7319e3a072d118917957d6554Steve Block
2912bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Update all info
2922bde8e466a4451c7319e3a072d118917957d6554Steve Block        info.fillJSValue(gpr, DataFormatJSDouble);
2932bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fprs.release(fpr);
2942bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.retain(gpr, virtualRegister, SpillOrderJS);
2952bde8e466a4451c7319e3a072d118917957d6554Steve Block
2962bde8e466a4451c7319e3a072d118917957d6554Steve Block        return gpr;
2972bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
2982bde8e466a4451c7319e3a072d118917957d6554Steve Block
2992bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatCell:
3002bde8e466a4451c7319e3a072d118917957d6554Steve Block        // No retag required on JSVALUE64!
3012bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJS:
3022bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSInteger:
3032bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSDouble:
3042bde8e466a4451c7319e3a072d118917957d6554Steve Block    case DataFormatJSCell: {
3052bde8e466a4451c7319e3a072d118917957d6554Steve Block        GPRReg gpr = info.gpr();
3062bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gprs.lock(gpr);
3072bde8e466a4451c7319e3a072d118917957d6554Steve Block        return gpr;
3082bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
3092bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
3102bde8e466a4451c7319e3a072d118917957d6554Steve Block
3112bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT_NOT_REACHED();
3122bde8e466a4451c7319e3a072d118917957d6554Steve Block    return InvalidGPRReg;
3132bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3142bde8e466a4451c7319e3a072d118917957d6554Steve Block
3152bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid JITCodeGenerator::useChildren(Node& node)
3162bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3172bde8e466a4451c7319e3a072d118917957d6554Steve Block    NodeIndex child1 = node.child1;
3182bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (child1 == NoNode) {
3192bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(node.child2 == NoNode && node.child3 == NoNode);
3202bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
3212bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
3222bde8e466a4451c7319e3a072d118917957d6554Steve Block    use(child1);
3232bde8e466a4451c7319e3a072d118917957d6554Steve Block
3242bde8e466a4451c7319e3a072d118917957d6554Steve Block    NodeIndex child2 = node.child2;
3252bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (child2 == NoNode) {
3262bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(node.child3 == NoNode);
3272bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
3282bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
3292bde8e466a4451c7319e3a072d118917957d6554Steve Block    use(child2);
3302bde8e466a4451c7319e3a072d118917957d6554Steve Block
3312bde8e466a4451c7319e3a072d118917957d6554Steve Block    NodeIndex child3 = node.child3;
3322bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (child3 == NoNode)
3332bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
3342bde8e466a4451c7319e3a072d118917957d6554Steve Block    use(child3);
3352bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3362bde8e466a4451c7319e3a072d118917957d6554Steve Block
3372bde8e466a4451c7319e3a072d118917957d6554Steve Block#ifndef NDEBUG
3382bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic const char* dataFormatString(DataFormat format)
3392bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3402bde8e466a4451c7319e3a072d118917957d6554Steve Block    // These values correspond to the DataFormat enum.
3412bde8e466a4451c7319e3a072d118917957d6554Steve Block    const char* strings[] = {
3422bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[  ]",
3432bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[ i]",
3442bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[ d]",
3452bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[ c]",
3462bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3472bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3482bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3492bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3502bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[J ]",
3512bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[Ji]",
3522bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[Jd]",
3532bde8e466a4451c7319e3a072d118917957d6554Steve Block        "[Jc]",
3542bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3552bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3562bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3572bde8e466a4451c7319e3a072d118917957d6554Steve Block        "Err!",
3582bde8e466a4451c7319e3a072d118917957d6554Steve Block    };
3592bde8e466a4451c7319e3a072d118917957d6554Steve Block    return strings[format];
3602bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3612bde8e466a4451c7319e3a072d118917957d6554Steve Block
3622bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid JITCodeGenerator::dump(const char* label)
3632bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3642bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (label)
3652bde8e466a4451c7319e3a072d118917957d6554Steve Block        fprintf(stderr, "<%s>\n", label);
3662bde8e466a4451c7319e3a072d118917957d6554Steve Block
3672bde8e466a4451c7319e3a072d118917957d6554Steve Block    fprintf(stderr, "  gprs:\n");
3682bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_gprs.dump();
3692bde8e466a4451c7319e3a072d118917957d6554Steve Block    fprintf(stderr, "  fprs:\n");
3702bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_fprs.dump();
3712bde8e466a4451c7319e3a072d118917957d6554Steve Block    fprintf(stderr, "  VirtualRegisters:\n");
3722bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (unsigned i = 0; i < m_generationInfo.size(); ++i) {
3732bde8e466a4451c7319e3a072d118917957d6554Steve Block        GenerationInfo& info = m_generationInfo[i];
3742bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (info.alive())
3752bde8e466a4451c7319e3a072d118917957d6554Steve Block            fprintf(stderr, "    % 3d:%s%s\n", i, dataFormatString(info.registerFormat()), dataFormatString(info.spillFormat()));
3762bde8e466a4451c7319e3a072d118917957d6554Steve Block        else
3772bde8e466a4451c7319e3a072d118917957d6554Steve Block            fprintf(stderr, "    % 3d:[__][__]\n", i);
3782bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
3792bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (label)
3802bde8e466a4451c7319e3a072d118917957d6554Steve Block        fprintf(stderr, "</%s>\n", label);
3812bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3822bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
3832bde8e466a4451c7319e3a072d118917957d6554Steve Block
3842bde8e466a4451c7319e3a072d118917957d6554Steve Block
3852bde8e466a4451c7319e3a072d118917957d6554Steve Block#if DFG_CONSISTENCY_CHECK
3862bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid JITCodeGenerator::checkConsistency()
3872bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3882bde8e466a4451c7319e3a072d118917957d6554Steve Block    VirtualRegister grpContents[numberOfGPRs];
3892bde8e466a4451c7319e3a072d118917957d6554Steve Block    VirtualRegister frpContents[numberOfFPRs];
3902bde8e466a4451c7319e3a072d118917957d6554Steve Block
3912bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (unsigned i = 0; i < numberOfGPRs; ++i)
3922bde8e466a4451c7319e3a072d118917957d6554Steve Block        grpContents[i] = InvalidVirtualRegister;
3932bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (unsigned i = 0; i < numberOfFPRs; ++i)
3942bde8e466a4451c7319e3a072d118917957d6554Steve Block        frpContents[i] = InvalidVirtualRegister;
3952bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (unsigned i = 0; i < m_generationInfo.size(); ++i) {
3962bde8e466a4451c7319e3a072d118917957d6554Steve Block        GenerationInfo& info = m_generationInfo[i];
3972bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!info.alive())
3982bde8e466a4451c7319e3a072d118917957d6554Steve Block            continue;
3992bde8e466a4451c7319e3a072d118917957d6554Steve Block        switch (info.registerFormat()) {
4002bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatNone:
4012bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
4022bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatInteger:
4032bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatCell:
4042bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatJS:
4052bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatJSInteger:
4062bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatJSDouble:
4072bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatJSCell: {
4082bde8e466a4451c7319e3a072d118917957d6554Steve Block            GPRReg gpr = info.gpr();
4092bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(gpr != InvalidGPRReg);
4102bde8e466a4451c7319e3a072d118917957d6554Steve Block            grpContents[gpr] = (VirtualRegister)i;
4112bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
4122bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4132bde8e466a4451c7319e3a072d118917957d6554Steve Block        case DataFormatDouble: {
4142bde8e466a4451c7319e3a072d118917957d6554Steve Block            FPRReg fpr = info.fpr();
4152bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(fpr != InvalidFPRReg);
4162bde8e466a4451c7319e3a072d118917957d6554Steve Block            frpContents[fpr] = (VirtualRegister)i;
4172bde8e466a4451c7319e3a072d118917957d6554Steve Block            break;
4182bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4192bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4202bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
4212bde8e466a4451c7319e3a072d118917957d6554Steve Block
4222bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (GPRReg i = gpr0; i < numberOfGPRs; next(i)) {
4232bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (m_gprs.isLocked(i) || m_gprs.name(i) != grpContents[i]) {
4242bde8e466a4451c7319e3a072d118917957d6554Steve Block            dump();
4252bde8e466a4451c7319e3a072d118917957d6554Steve Block            CRASH();
4262bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4272bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
4282bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (FPRReg i = fpr0; i < numberOfFPRs; next(i)) {
4292bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (m_fprs.isLocked(i) || m_fprs.name(i) != frpContents[i]) {
4302bde8e466a4451c7319e3a072d118917957d6554Steve Block            dump();
4312bde8e466a4451c7319e3a072d118917957d6554Steve Block            CRASH();
4322bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4332bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
4342bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4352bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
4362bde8e466a4451c7319e3a072d118917957d6554Steve Block
4372bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRTemporary::GPRTemporary(JITCodeGenerator* jit)
4382bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_gpr(InvalidGPRReg)
4402bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4412bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_gpr = m_jit->allocate();
4422bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4432bde8e466a4451c7319e3a072d118917957d6554Steve Block
4442bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRTemporary::GPRTemporary(JITCodeGenerator* jit, SpeculateIntegerOperand& op1)
4452bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
4462bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_gpr(InvalidGPRReg)
4472bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4482bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
4492bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.gpr();
4502bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
4512bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op1.gpr());
4522bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
4532bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->allocate();
4542bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4552bde8e466a4451c7319e3a072d118917957d6554Steve Block
4562bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRTemporary::GPRTemporary(JITCodeGenerator* jit, SpeculateIntegerOperand& op1, SpeculateIntegerOperand& op2)
4572bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
4582bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_gpr(InvalidGPRReg)
4592bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4602bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
4612bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.gpr();
4622bde8e466a4451c7319e3a072d118917957d6554Steve Block    op2.gpr();
4632bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
4642bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op1.gpr());
4652bde8e466a4451c7319e3a072d118917957d6554Steve Block    else if (m_jit->canReuse(op2.index()))
4662bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op2.gpr());
4672bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
4682bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->allocate();
4692bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4702bde8e466a4451c7319e3a072d118917957d6554Steve Block
4712bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRTemporary::GPRTemporary(JITCodeGenerator* jit, IntegerOperand& op1)
4722bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
4732bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_gpr(InvalidGPRReg)
4742bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4752bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
4762bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.gpr();
4772bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
4782bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op1.gpr());
4792bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
4802bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->allocate();
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4822bde8e466a4451c7319e3a072d118917957d6554Steve Block
4832bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRTemporary::GPRTemporary(JITCodeGenerator* jit, IntegerOperand& op1, IntegerOperand& op2)
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
4852bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_gpr(InvalidGPRReg)
4862bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4872bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
4882bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.gpr();
4892bde8e466a4451c7319e3a072d118917957d6554Steve Block    op2.gpr();
4902bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
4912bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op1.gpr());
4922bde8e466a4451c7319e3a072d118917957d6554Steve Block    else if (m_jit->canReuse(op2.index()))
4932bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op2.gpr());
4942bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
4952bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->allocate();
4962bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4972bde8e466a4451c7319e3a072d118917957d6554Steve Block
4982bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRTemporary::GPRTemporary(JITCodeGenerator* jit, SpeculateCellOperand& op1)
4992bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
5002bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_gpr(InvalidGPRReg)
5012bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5022bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
5032bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.gpr();
5042bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
5052bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op1.gpr());
5062bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
5072bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->allocate();
5082bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5092bde8e466a4451c7319e3a072d118917957d6554Steve Block
5102bde8e466a4451c7319e3a072d118917957d6554Steve BlockGPRTemporary::GPRTemporary(JITCodeGenerator* jit, JSValueOperand& op1)
5112bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
5122bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_gpr(InvalidGPRReg)
5132bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5142bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
5152bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.gpr();
5162bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
5172bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->reuse(op1.gpr());
5182bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
5192bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_gpr = m_jit->allocate();
5202bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5212bde8e466a4451c7319e3a072d118917957d6554Steve Block
5222bde8e466a4451c7319e3a072d118917957d6554Steve BlockFPRTemporary::FPRTemporary(JITCodeGenerator* jit)
5232bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
5242bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_fpr(InvalidFPRReg)
5252bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5262bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_fpr = m_jit->fprAllocate();
5272bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5282bde8e466a4451c7319e3a072d118917957d6554Steve Block
5292bde8e466a4451c7319e3a072d118917957d6554Steve BlockFPRTemporary::FPRTemporary(JITCodeGenerator* jit, DoubleOperand& op1)
5302bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
5312bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_fpr(InvalidFPRReg)
5322bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5332bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
5342bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.fpr();
5352bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
5362bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fpr = m_jit->reuse(op1.fpr());
5372bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
5382bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fpr = m_jit->fprAllocate();
5392bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5402bde8e466a4451c7319e3a072d118917957d6554Steve Block
5412bde8e466a4451c7319e3a072d118917957d6554Steve BlockFPRTemporary::FPRTemporary(JITCodeGenerator* jit, DoubleOperand& op1, DoubleOperand& op2)
5422bde8e466a4451c7319e3a072d118917957d6554Steve Block    : m_jit(jit)
5432bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_fpr(InvalidFPRReg)
5442bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5452bde8e466a4451c7319e3a072d118917957d6554Steve Block    // locking into a register may free for reuse!
5462bde8e466a4451c7319e3a072d118917957d6554Steve Block    op1.fpr();
5472bde8e466a4451c7319e3a072d118917957d6554Steve Block    op2.fpr();
5482bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_jit->canReuse(op1.index()))
5492bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fpr = m_jit->reuse(op1.fpr());
5502bde8e466a4451c7319e3a072d118917957d6554Steve Block    else if (m_jit->canReuse(op2.index()))
5512bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fpr = m_jit->reuse(op2.fpr());
5522bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
5532bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_fpr = m_jit->fprAllocate();
5542bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5552bde8e466a4451c7319e3a072d118917957d6554Steve Block
5562bde8e466a4451c7319e3a072d118917957d6554Steve Block} } // namespace JSC::DFG
5572bde8e466a4451c7319e3a072d118917957d6554Steve Block
5582bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
559