diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp')
-rw-r--r-- | Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp | 74 |
1 files changed, 38 insertions, 36 deletions
diff --git a/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp b/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp index 3ca56f65d..74b086a7c 100644 --- a/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp +++ b/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013, 2015 Apple Inc. All rights reserved. + * Copyright (C) 2013 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,38 +30,42 @@ #include "CodeBlock.h" #include "LinkBuffer.h" -#include "JSCInlines.h" +#include "Operations.h" namespace JSC { static StructureStubInfo* garbageStubInfo() { - static StructureStubInfo* stubInfo = new StructureStubInfo(AccessType::Get); + static StructureStubInfo* stubInfo = new StructureStubInfo(); return stubInfo; } -JITInlineCacheGenerator::JITInlineCacheGenerator( - CodeBlock* codeBlock, CodeOrigin codeOrigin, CallSiteIndex callSite, AccessType accessType) +JITInlineCacheGenerator::JITInlineCacheGenerator(CodeBlock* codeBlock, CodeOrigin codeOrigin) : m_codeBlock(codeBlock) { - m_stubInfo = m_codeBlock ? m_codeBlock->addStubInfo(accessType) : garbageStubInfo(); + m_stubInfo = m_codeBlock ? m_codeBlock->addStubInfo() : garbageStubInfo(); m_stubInfo->codeOrigin = codeOrigin; - m_stubInfo->callSiteIndex = callSite; } JITByIdGenerator::JITByIdGenerator( - CodeBlock* codeBlock, CodeOrigin codeOrigin, CallSiteIndex callSite, AccessType accessType, - const RegisterSet& usedRegisters, JSValueRegs base, JSValueRegs value) - : JITInlineCacheGenerator(codeBlock, codeOrigin, callSite, accessType) + CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters, + GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value, bool registersFlushed) + : JITInlineCacheGenerator(codeBlock, codeOrigin) , 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 } @@ -87,6 +91,8 @@ 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) @@ -94,46 +100,42 @@ void JITByIdGenerator::finalize(LinkBuffer& linkBuffer) finalize(linkBuffer, linkBuffer); } -void JITByIdGenerator::generateFastPathChecks(MacroAssembler& jit) +void JITByIdGenerator::generateFastPathChecks(MacroAssembler& jit, GPRReg butterfly) { - m_structureCheck = jit.patchableBranch32WithPatch( + m_structureCheck = jit.patchableBranchPtrWithPatch( MacroAssembler::NotEqual, - 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()); + 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); } void JITGetByIdGenerator::generateFastPath(MacroAssembler& jit) { - generateFastPathChecks(jit); + generateFastPathChecks(jit, m_value.payloadGPR()); #if USE(JSVALUE64) m_loadOrStore = jit.load64WithCompactAddressOffsetPatch( - MacroAssembler::Address(m_base.payloadGPR(), 0), m_value.payloadGPR()).label(); + MacroAssembler::Address(m_value.payloadGPR(), 0), m_value.payloadGPR()).label(); #else m_tagLoadOrStore = jit.load32WithCompactAddressOffsetPatch( - MacroAssembler::Address(m_base.payloadGPR(), 0), m_value.tagGPR()).label(); + MacroAssembler::Address(m_value.payloadGPR(), 0), m_value.tagGPR()).label(); m_loadOrStore = jit.load32WithCompactAddressOffsetPatch( - MacroAssembler::Address(m_base.payloadGPR(), 0), m_value.payloadGPR()).label(); + MacroAssembler::Address(m_value.payloadGPR(), 0), m_value.payloadGPR()).label(); #endif m_done = jit.label(); } JITPutByIdGenerator::JITPutByIdGenerator( - CodeBlock* codeBlock, CodeOrigin codeOrigin, CallSiteIndex callSite, const RegisterSet& usedRegisters, - JSValueRegs base, JSValueRegs value, GPRReg scratch, - ECMAMode ecmaMode, PutKind putKind) + CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters, + GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value, GPRReg scratch, + bool registersFlushed, ECMAMode ecmaMode, PutKind putKind) : JITByIdGenerator( - codeBlock, codeOrigin, callSite, AccessType::Put, usedRegisters, base, value) + codeBlock, codeOrigin, usedRegisters, callFrameRegister, base, value, + registersFlushed) + , m_scratch(scratch) , m_ecmaMode(ecmaMode) , m_putKind(putKind) { @@ -142,16 +144,16 @@ JITPutByIdGenerator::JITPutByIdGenerator( void JITPutByIdGenerator::generateFastPath(MacroAssembler& jit) { - generateFastPathChecks(jit); + generateFastPathChecks(jit, m_scratch); #if USE(JSVALUE64) m_loadOrStore = jit.store64WithAddressOffsetPatch( - m_value.payloadGPR(), MacroAssembler::Address(m_base.payloadGPR(), 0)).label(); + m_value.payloadGPR(), MacroAssembler::Address(m_scratch, 0)).label(); #else m_tagLoadOrStore = jit.store32WithAddressOffsetPatch( - m_value.tagGPR(), MacroAssembler::Address(m_base.payloadGPR(), 0)).label(); + m_value.tagGPR(), MacroAssembler::Address(m_scratch, 0)).label(); m_loadOrStore = jit.store32WithAddressOffsetPatch( - m_value.payloadGPR(), MacroAssembler::Address(m_base.payloadGPR(), 0)).label(); + m_value.payloadGPR(), MacroAssembler::Address(m_scratch, 0)).label(); #endif m_done = jit.label(); |