summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-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.cpp74
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();