summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
commita4e969f4965059196ca948db781e52f7cfebf19e (patch)
tree6ca352808c8fdc52006a0f33f6ae3c593b23867d /Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp
parent41386e9cb918eed93b3f13648cbef387e371e451 (diff)
downloadWebKitGtk-tarball-a4e969f4965059196ca948db781e52f7cfebf19e.tar.gz
webkitgtk-2.12.3webkitgtk-2.12.3
Diffstat (limited to 'Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp')
-rw-r--r--Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp74
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();