diff options
Diffstat (limited to 'Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp')
-rw-r--r-- | Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp | 74 |
1 files changed, 36 insertions, 38 deletions
diff --git a/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp b/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp index 74b086a7c..3ca56f65d 100644 --- a/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp +++ b/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013, 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,42 +30,38 @@ #include "CodeBlock.h" #include "LinkBuffer.h" -#include "Operations.h" +#include "JSCInlines.h" namespace JSC { static StructureStubInfo* garbageStubInfo() { - static StructureStubInfo* stubInfo = new StructureStubInfo(); + static StructureStubInfo* stubInfo = new StructureStubInfo(AccessType::Get); return stubInfo; } -JITInlineCacheGenerator::JITInlineCacheGenerator(CodeBlock* codeBlock, CodeOrigin codeOrigin) +JITInlineCacheGenerator::JITInlineCacheGenerator( + CodeBlock* codeBlock, CodeOrigin codeOrigin, CallSiteIndex callSite, AccessType accessType) : m_codeBlock(codeBlock) { - m_stubInfo = m_codeBlock ? m_codeBlock->addStubInfo() : garbageStubInfo(); + m_stubInfo = m_codeBlock ? m_codeBlock->addStubInfo(accessType) : garbageStubInfo(); m_stubInfo->codeOrigin = codeOrigin; + m_stubInfo->callSiteIndex = callSite; } JITByIdGenerator::JITByIdGenerator( - CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters, - GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value, bool registersFlushed) - : JITInlineCacheGenerator(codeBlock, codeOrigin) + CodeBlock* codeBlock, CodeOrigin codeOrigin, CallSiteIndex callSite, AccessType accessType, + const RegisterSet& usedRegisters, JSValueRegs base, JSValueRegs value) + : JITInlineCacheGenerator(codeBlock, codeOrigin, callSite, accessType) , m_base(base) , m_value(value) { - m_stubInfo->patch.registersFlushed = registersFlushed; m_stubInfo->patch.usedRegisters = usedRegisters; - // This is a convenience - in cases where the only registers you're using are base/value, - // it allows you to pass RegisterSet() as the usedRegisters argument. - m_stubInfo->patch.usedRegisters.set(base); - m_stubInfo->patch.usedRegisters.set(value); - - m_stubInfo->patch.callFrameRegister = static_cast<int8_t>(callFrameRegister); m_stubInfo->patch.baseGPR = static_cast<int8_t>(base.payloadGPR()); m_stubInfo->patch.valueGPR = static_cast<int8_t>(value.payloadGPR()); #if USE(JSVALUE32_64) + m_stubInfo->patch.baseTagGPR = static_cast<int8_t>(base.tagGPR()); m_stubInfo->patch.valueTagGPR = static_cast<int8_t>(value.tagGPR()); #endif } @@ -91,8 +87,6 @@ void JITByIdGenerator::finalize(LinkBuffer& fastPath, LinkBuffer& slowPath) callReturnLocation, slowPath.locationOf(m_slowPathBegin)); m_stubInfo->patch.deltaCallToDone = MacroAssembler::differenceBetweenCodePtr( callReturnLocation, fastPath.locationOf(m_done)); - m_stubInfo->patch.deltaCallToStorageLoad = MacroAssembler::differenceBetweenCodePtr( - callReturnLocation, fastPath.locationOf(m_propertyStorageLoad)); } void JITByIdGenerator::finalize(LinkBuffer& linkBuffer) @@ -100,42 +94,46 @@ void JITByIdGenerator::finalize(LinkBuffer& linkBuffer) finalize(linkBuffer, linkBuffer); } -void JITByIdGenerator::generateFastPathChecks(MacroAssembler& jit, GPRReg butterfly) +void JITByIdGenerator::generateFastPathChecks(MacroAssembler& jit) { - m_structureCheck = jit.patchableBranchPtrWithPatch( + m_structureCheck = jit.patchableBranch32WithPatch( MacroAssembler::NotEqual, - MacroAssembler::Address(m_base.payloadGPR(), JSCell::structureOffset()), - m_structureImm, MacroAssembler::TrustedImmPtr(reinterpret_cast<void*>(unusedPointer))); - - m_propertyStorageLoad = jit.convertibleLoadPtr( - MacroAssembler::Address(m_base.payloadGPR(), JSObject::butterflyOffset()), butterfly); + MacroAssembler::Address(m_base.payloadGPR(), JSCell::structureIDOffset()), + m_structureImm, MacroAssembler::TrustedImm32(0)); +} + +JITGetByIdGenerator::JITGetByIdGenerator( + CodeBlock* codeBlock, CodeOrigin codeOrigin, CallSiteIndex callSite, const RegisterSet& usedRegisters, + JSValueRegs base, JSValueRegs value) + : JITByIdGenerator( + codeBlock, codeOrigin, callSite, AccessType::Get, usedRegisters, base, value) +{ + RELEASE_ASSERT(base.payloadGPR() != value.tagGPR()); } void JITGetByIdGenerator::generateFastPath(MacroAssembler& jit) { - generateFastPathChecks(jit, m_value.payloadGPR()); + generateFastPathChecks(jit); #if USE(JSVALUE64) m_loadOrStore = jit.load64WithCompactAddressOffsetPatch( - MacroAssembler::Address(m_value.payloadGPR(), 0), m_value.payloadGPR()).label(); + MacroAssembler::Address(m_base.payloadGPR(), 0), m_value.payloadGPR()).label(); #else m_tagLoadOrStore = jit.load32WithCompactAddressOffsetPatch( - MacroAssembler::Address(m_value.payloadGPR(), 0), m_value.tagGPR()).label(); + MacroAssembler::Address(m_base.payloadGPR(), 0), m_value.tagGPR()).label(); m_loadOrStore = jit.load32WithCompactAddressOffsetPatch( - MacroAssembler::Address(m_value.payloadGPR(), 0), m_value.payloadGPR()).label(); + MacroAssembler::Address(m_base.payloadGPR(), 0), m_value.payloadGPR()).label(); #endif m_done = jit.label(); } JITPutByIdGenerator::JITPutByIdGenerator( - CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters, - GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value, GPRReg scratch, - bool registersFlushed, ECMAMode ecmaMode, PutKind putKind) + CodeBlock* codeBlock, CodeOrigin codeOrigin, CallSiteIndex callSite, const RegisterSet& usedRegisters, + JSValueRegs base, JSValueRegs value, GPRReg scratch, + ECMAMode ecmaMode, PutKind putKind) : JITByIdGenerator( - codeBlock, codeOrigin, usedRegisters, callFrameRegister, base, value, - registersFlushed) - , m_scratch(scratch) + codeBlock, codeOrigin, callSite, AccessType::Put, usedRegisters, base, value) , m_ecmaMode(ecmaMode) , m_putKind(putKind) { @@ -144,16 +142,16 @@ JITPutByIdGenerator::JITPutByIdGenerator( void JITPutByIdGenerator::generateFastPath(MacroAssembler& jit) { - generateFastPathChecks(jit, m_scratch); + generateFastPathChecks(jit); #if USE(JSVALUE64) m_loadOrStore = jit.store64WithAddressOffsetPatch( - m_value.payloadGPR(), MacroAssembler::Address(m_scratch, 0)).label(); + m_value.payloadGPR(), MacroAssembler::Address(m_base.payloadGPR(), 0)).label(); #else m_tagLoadOrStore = jit.store32WithAddressOffsetPatch( - m_value.tagGPR(), MacroAssembler::Address(m_scratch, 0)).label(); + m_value.tagGPR(), MacroAssembler::Address(m_base.payloadGPR(), 0)).label(); m_loadOrStore = jit.store32WithAddressOffsetPatch( - m_value.payloadGPR(), MacroAssembler::Address(m_scratch, 0)).label(); + m_value.payloadGPR(), MacroAssembler::Address(m_base.payloadGPR(), 0)).label(); #endif m_done = jit.label(); |