summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGValueSource.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGValueSource.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGValueSource.h120
1 files changed, 58 insertions, 62 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGValueSource.h b/Source/JavaScriptCore/dfg/DFGValueSource.h
index 362072647..1b55797d5 100644
--- a/Source/JavaScriptCore/dfg/DFGValueSource.h
+++ b/Source/JavaScriptCore/dfg/DFGValueSource.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
@@ -26,11 +26,10 @@
#ifndef DFGValueSource_h
#define DFGValueSource_h
-#include <wtf/Platform.h>
-
#if ENABLE(DFG_JIT)
#include "DFGCommon.h"
+#include "DFGFlushFormat.h"
#include "DFGMinifiedID.h"
#include "DataFormat.h"
#include "SpeculatedType.h"
@@ -42,10 +41,10 @@ enum ValueSourceKind {
SourceNotSet,
ValueInJSStack,
Int32InJSStack,
+ Int52InJSStack,
CellInJSStack,
BooleanInJSStack,
DoubleInJSStack,
- ArgumentsSource,
SourceIsDead,
HaveNode
};
@@ -53,8 +52,10 @@ enum ValueSourceKind {
static inline ValueSourceKind dataFormatToValueSourceKind(DataFormat dataFormat)
{
switch (dataFormat) {
- case DataFormatInteger:
+ case DataFormatInt32:
return Int32InJSStack;
+ case DataFormatInt52:
+ return Int52InJSStack;
case DataFormatDouble:
return DoubleInJSStack;
case DataFormatBoolean:
@@ -63,8 +64,6 @@ static inline ValueSourceKind dataFormatToValueSourceKind(DataFormat dataFormat)
return CellInJSStack;
case DataFormatDead:
return SourceIsDead;
- case DataFormatArguments:
- return ArgumentsSource;
default:
RELEASE_ASSERT(dataFormat & DataFormatJS);
return ValueInJSStack;
@@ -77,15 +76,15 @@ static inline DataFormat valueSourceKindToDataFormat(ValueSourceKind kind)
case ValueInJSStack:
return DataFormatJS;
case Int32InJSStack:
- return DataFormatInteger;
+ return DataFormatInt32;
+ case Int52InJSStack:
+ return DataFormatInt52;
case CellInJSStack:
return DataFormatCell;
case BooleanInJSStack:
return DataFormatBoolean;
case DoubleInJSStack:
return DataFormatDouble;
- case ArgumentsSource:
- return DataFormatArguments;
case SourceIsDead:
return DataFormatDead;
default:
@@ -109,48 +108,70 @@ static inline bool isTriviallyRecoverable(ValueSourceKind kind)
class ValueSource {
public:
ValueSource()
- : m_value(idFromKind(SourceNotSet))
+ : m_kind(SourceNotSet)
{
}
explicit ValueSource(ValueSourceKind valueSourceKind)
- : m_value(idFromKind(valueSourceKind))
+ : m_kind(valueSourceKind)
{
- ASSERT(kind() != SourceNotSet);
- ASSERT(kind() != HaveNode);
+ ASSERT(kind() == SourceIsDead);
}
explicit ValueSource(MinifiedID id)
- : m_value(id)
+ : m_kind(HaveNode)
+ , m_value(id.bits())
{
ASSERT(!!id);
ASSERT(kind() == HaveNode);
}
- static ValueSource forSpeculation(SpeculatedType prediction)
+ ValueSource(ValueSourceKind valueSourceKind, VirtualRegister where)
+ : m_kind(valueSourceKind)
+ , m_value(static_cast<intptr_t>(where.offset()))
+ {
+ ASSERT(kind() != SourceNotSet);
+ ASSERT(kind() != HaveNode);
+ }
+
+ static ValueSource forFlushFormat(VirtualRegister where, FlushFormat format)
{
- if (isInt32Speculation(prediction))
- return ValueSource(Int32InJSStack);
- if (isArraySpeculation(prediction) || isCellSpeculation(prediction))
- return ValueSource(CellInJSStack);
- if (isBooleanSpeculation(prediction))
- return ValueSource(BooleanInJSStack);
- return ValueSource(ValueInJSStack);
+ switch (format) {
+ case DeadFlush:
+ case ConflictingFlush:
+ return ValueSource(SourceIsDead);
+ case FlushedJSValue:
+ return ValueSource(ValueInJSStack, where);
+ case FlushedDouble:
+ return ValueSource(DoubleInJSStack, where);
+ case FlushedInt32:
+ return ValueSource(Int32InJSStack, where);
+ case FlushedInt52:
+ return ValueSource(Int52InJSStack, where);
+ case FlushedCell:
+ return ValueSource(CellInJSStack, where);
+ case FlushedBoolean:
+ return ValueSource(BooleanInJSStack, where);
+ }
+ RELEASE_ASSERT_NOT_REACHED();
+ return ValueSource();
}
- static ValueSource forDataFormat(DataFormat dataFormat)
+ static ValueSource forDataFormat(VirtualRegister where, DataFormat dataFormat)
{
- return ValueSource(dataFormatToValueSourceKind(dataFormat));
+ return ValueSource(dataFormatToValueSourceKind(dataFormat), where);
}
bool isSet() const
{
- return kindFromID(m_value) != SourceNotSet;
+ return kind() != SourceNotSet;
}
+ bool operator!() const { return !isSet(); }
+
ValueSourceKind kind() const
{
- return kindFromID(m_value);
+ return m_kind;
}
bool isInJSStack() const { return JSC::DFG::isInJSStack(kind()); }
@@ -165,57 +186,32 @@ public:
{
ASSERT(isTriviallyRecoverable());
switch (kind()) {
- case ValueInJSStack:
- return ValueRecovery::alreadyInJSStack();
-
- case Int32InJSStack:
- return ValueRecovery::alreadyInJSStackAsUnboxedInt32();
-
- case CellInJSStack:
- return ValueRecovery::alreadyInJSStackAsUnboxedCell();
-
- case BooleanInJSStack:
- return ValueRecovery::alreadyInJSStackAsUnboxedBoolean();
-
- case DoubleInJSStack:
- return ValueRecovery::alreadyInJSStackAsUnboxedDouble();
-
case SourceIsDead:
return ValueRecovery::constant(jsUndefined());
- case ArgumentsSource:
- return ValueRecovery::argumentsThatWereNotCreated();
-
default:
- RELEASE_ASSERT_NOT_REACHED();
- return ValueRecovery();
+ return ValueRecovery::displacedInJSStack(virtualRegister(), dataFormat());
}
}
MinifiedID id() const
{
ASSERT(kind() == HaveNode);
- return m_value;
+ return MinifiedID::fromBits(m_value);
}
- void dump(PrintStream&) const;
-
-private:
- static MinifiedID idFromKind(ValueSourceKind kind)
+ VirtualRegister virtualRegister() const
{
- ASSERT(kind >= SourceNotSet && kind < HaveNode);
- return MinifiedID::fromBits(MinifiedID::invalidID() - kind);
+ ASSERT(isInJSStack());
+ return VirtualRegister(m_value);
}
- static ValueSourceKind kindFromID(MinifiedID id)
- {
- uintptr_t kind = static_cast<uintptr_t>(MinifiedID::invalidID() - id.m_id);
- if (kind >= static_cast<uintptr_t>(HaveNode))
- return HaveNode;
- return static_cast<ValueSourceKind>(kind);
- }
+ void dump(PrintStream&) const;
+ void dumpInContext(PrintStream&, DumpContext*) const;
- MinifiedID m_value;
+private:
+ ValueSourceKind m_kind;
+ uintptr_t m_value;
};
} } // namespace JSC::DFG