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