summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/ValueRecovery.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/bytecode/ValueRecovery.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/bytecode/ValueRecovery.h')
-rw-r--r--Source/JavaScriptCore/bytecode/ValueRecovery.h206
1 files changed, 184 insertions, 22 deletions
diff --git a/Source/JavaScriptCore/bytecode/ValueRecovery.h b/Source/JavaScriptCore/bytecode/ValueRecovery.h
index 3af2c3409..c98fd2075 100644
--- a/Source/JavaScriptCore/bytecode/ValueRecovery.h
+++ b/Source/JavaScriptCore/bytecode/ValueRecovery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 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
@@ -23,22 +23,23 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ValueRecovery_h
-#define ValueRecovery_h
+#pragma once
+#include "DFGMinifiedID.h"
#include "DataFormat.h"
#if ENABLE(JIT)
#include "GPRInfo.h"
#include "FPRInfo.h"
+#include "Reg.h"
#endif
#include "JSCJSValue.h"
#include "MacroAssembler.h"
#include "VirtualRegister.h"
-#include <wtf/Platform.h>
namespace JSC {
struct DumpContext;
+struct InlineCallFrame;
// Describes how to recover a given bytecode virtual register at a given
// code point.
@@ -54,6 +55,7 @@ enum ValueRecoveryTechnique {
InPair,
#endif
InFPR,
+ UnboxedDoubleInFPR,
// It's in the stack, but at a different location.
DisplacedInJSStack,
// It's in the stack, at a different location, and it's unboxed.
@@ -63,8 +65,9 @@ enum ValueRecoveryTechnique {
DoubleDisplacedInJSStack,
CellDisplacedInJSStack,
BooleanDisplacedInJSStack,
- // It's an Arguments object.
- ArgumentsThatWereNotCreated,
+ // It's an Arguments object. This arises because of the simplified arguments simplification done by the DFG.
+ DirectArgumentsThatWereNotCreated,
+ ClonedArgumentsThatWereNotCreated,
// It's a constant.
Constant,
// Don't know how to recover it.
@@ -80,6 +83,19 @@ public:
bool isSet() const { return m_technique != DontKnow; }
bool operator!() const { return !isSet(); }
+
+#if ENABLE(JIT)
+ static ValueRecovery inRegister(Reg reg, DataFormat dataFormat)
+ {
+ if (reg.isGPR())
+ return inGPR(reg.gpr(), dataFormat);
+
+ ASSERT(reg.isFPR());
+ return inFPR(reg.fpr(), dataFormat);
+ }
+#endif
+
+ explicit operator bool() const { return isSet(); }
static ValueRecovery inGPR(MacroAssembler::RegisterID gpr, DataFormat dataFormat)
{
@@ -115,10 +131,14 @@ public:
}
#endif
- static ValueRecovery inFPR(MacroAssembler::FPRegisterID fpr)
+ static ValueRecovery inFPR(MacroAssembler::FPRegisterID fpr, DataFormat dataFormat)
{
+ ASSERT(dataFormat == DataFormatDouble || dataFormat & DataFormatJS);
ValueRecovery result;
- result.m_technique = InFPR;
+ if (dataFormat == DataFormatDouble)
+ result.m_technique = UnboxedDoubleInFPR;
+ else
+ result.m_technique = InFPR;
result.m_source.fpr = fpr;
return result;
}
@@ -168,18 +188,27 @@ public:
return result;
}
- static ValueRecovery argumentsThatWereNotCreated()
+ static ValueRecovery directArgumentsThatWereNotCreated(DFG::MinifiedID id)
{
ValueRecovery result;
- result.m_technique = ArgumentsThatWereNotCreated;
+ result.m_technique = DirectArgumentsThatWereNotCreated;
+ result.m_source.nodeID = id.bits();
return result;
}
+ static ValueRecovery clonedArgumentsThatWereNotCreated(DFG::MinifiedID id)
+ {
+ ValueRecovery result;
+ result.m_technique = ClonedArgumentsThatWereNotCreated;
+ result.m_source.nodeID = id.bits();
+ return result;
+ }
+
ValueRecoveryTechnique technique() const { return m_technique; }
bool isConstant() const { return m_technique == Constant; }
-
- bool isInRegisters() const
+
+ bool isInGPR() const
{
switch (m_technique) {
case InGPR:
@@ -188,19 +217,81 @@ public:
case UnboxedCellInGPR:
case UnboxedInt52InGPR:
case UnboxedStrictInt52InGPR:
-#if USE(JSVALUE32_64)
- case InPair:
-#endif
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ bool isInFPR() const
+ {
+ switch (m_technique) {
case InFPR:
+ case UnboxedDoubleInFPR:
return true;
default:
return false;
}
}
+
+ bool isInRegisters() const
+ {
+ return isInJSValueRegs() || isInGPR() || isInFPR();
+ }
+
+ bool isInJSStack() const
+ {
+ switch (m_technique) {
+ case DisplacedInJSStack:
+ case Int32DisplacedInJSStack:
+ case Int52DisplacedInJSStack:
+ case StrictInt52DisplacedInJSStack:
+ case DoubleDisplacedInJSStack:
+ case CellDisplacedInJSStack:
+ case BooleanDisplacedInJSStack:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ DataFormat dataFormat() const
+ {
+ switch (m_technique) {
+ case InGPR:
+ case InFPR:
+ case DisplacedInJSStack:
+ case Constant:
+#if USE(JSVALUE32_64)
+ case InPair:
+#endif
+ return DataFormatJS;
+ case UnboxedInt32InGPR:
+ case Int32DisplacedInJSStack:
+ return DataFormatInt32;
+ case UnboxedInt52InGPR:
+ case Int52DisplacedInJSStack:
+ return DataFormatInt52;
+ case UnboxedStrictInt52InGPR:
+ case StrictInt52DisplacedInJSStack:
+ return DataFormatStrictInt52;
+ case UnboxedBooleanInGPR:
+ case BooleanDisplacedInJSStack:
+ return DataFormatBoolean;
+ case UnboxedCellInGPR:
+ case CellDisplacedInJSStack:
+ return DataFormatCell;
+ case UnboxedDoubleInFPR:
+ case DoubleDisplacedInJSStack:
+ return DataFormatDouble;
+ default:
+ return DataFormatNone;
+ }
+ }
MacroAssembler::RegisterID gpr() const
{
- ASSERT(m_technique == InGPR || m_technique == UnboxedInt32InGPR || m_technique == UnboxedBooleanInGPR || m_technique == UnboxedInt52InGPR || m_technique == UnboxedStrictInt52InGPR || m_technique == UnboxedCellInGPR);
+ ASSERT(isInGPR());
return m_source.gpr;
}
@@ -216,29 +307,101 @@ public:
ASSERT(m_technique == InPair);
return m_source.pair.payloadGPR;
}
-#endif
+
+ bool isInJSValueRegs() const
+ {
+ return m_technique == InPair;
+ }
+
+#if ENABLE(JIT)
+ JSValueRegs jsValueRegs() const
+ {
+ ASSERT(isInJSValueRegs());
+ return JSValueRegs(tagGPR(), payloadGPR());
+ }
+#endif // ENABLE(JIT)
+#else
+ bool isInJSValueRegs() const
+ {
+ return isInGPR();
+ }
+#endif // USE(JSVALUE32_64)
MacroAssembler::FPRegisterID fpr() const
{
- ASSERT(m_technique == InFPR);
+ ASSERT(isInFPR());
return m_source.fpr;
}
VirtualRegister virtualRegister() const
{
- ASSERT(m_technique == DisplacedInJSStack || m_technique == Int32DisplacedInJSStack || m_technique == DoubleDisplacedInJSStack || m_technique == CellDisplacedInJSStack || m_technique == BooleanDisplacedInJSStack || m_technique == Int52DisplacedInJSStack || m_technique == StrictInt52DisplacedInJSStack);
+ ASSERT(isInJSStack());
return VirtualRegister(m_source.virtualReg);
}
+ ValueRecovery withLocalsOffset(int offset) const
+ {
+ switch (m_technique) {
+ case DisplacedInJSStack:
+ case Int32DisplacedInJSStack:
+ case DoubleDisplacedInJSStack:
+ case CellDisplacedInJSStack:
+ case BooleanDisplacedInJSStack:
+ case Int52DisplacedInJSStack:
+ case StrictInt52DisplacedInJSStack: {
+ ValueRecovery result;
+ result.m_technique = m_technique;
+ result.m_source.virtualReg = m_source.virtualReg + offset;
+ return result;
+ }
+
+ default:
+ return *this;
+ }
+ }
+
JSValue constant() const
{
- ASSERT(m_technique == Constant);
+ ASSERT(isConstant());
return JSValue::decode(m_source.constant);
}
+ DFG::MinifiedID nodeID() const
+ {
+ ASSERT(m_technique == DirectArgumentsThatWereNotCreated || m_technique == ClonedArgumentsThatWereNotCreated);
+ return DFG::MinifiedID::fromBits(m_source.nodeID);
+ }
+
JSValue recover(ExecState*) const;
#if ENABLE(JIT)
+ template<typename Func>
+ void forEachReg(const Func& func)
+ {
+ switch (m_technique) {
+ case InGPR:
+ case UnboxedInt32InGPR:
+ case UnboxedBooleanInGPR:
+ case UnboxedCellInGPR:
+ case UnboxedInt52InGPR:
+ case UnboxedStrictInt52InGPR:
+ func(gpr());
+ return;
+ case InFPR:
+ case UnboxedDoubleInFPR:
+ func(fpr());
+ return;
+#if USE(JSVALUE32_64)
+ case InPair:
+ func(jsValueRegs().payloadGPR());
+ func(jsValueRegs().tagGPR());
+ return;
+#endif
+ default:
+ return;
+ }
+ }
+
void dumpInContext(PrintStream& out, DumpContext* context) const;
void dump(PrintStream& out) const;
#endif
@@ -256,9 +419,8 @@ private:
#endif
int virtualReg;
EncodedJSValue constant;
+ uintptr_t nodeID;
} m_source;
};
} // namespace JSC
-
-#endif // ValueRecovery_h