/*
- * Copyright (C) 2013, 2014 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
namespace JSC { namespace DFG {
enum UseKind {
- UntypedUse,
+ // The DFG has 3 representations of values used:
+
+ // 1. The JSValue representation for a JSValue that must be stored in a GP
+ // register (or a GP register pair), and follows rules for boxing and unboxing
+ // that allow the JSValue to be stored as either fully boxed JSValues, or
+ // unboxed Int32, Booleans, Cells, etc. in 32-bit as appropriate.
+ UntypedUse, // UntypedUse must come first (value 0).
Int32Use,
KnownInt32Use,
- Int52RepUse,
MachineIntUse,
NumberUse,
- DoubleRepUse,
- DoubleRepRealUse,
- DoubleRepMachineIntUse,
+ RealNumberUse,
BooleanUse,
CellUse,
KnownCellUse,
ObjectUse,
+ FunctionUse,
FinalObjectUse,
ObjectOrOtherUse,
StringIdentUse,
NotCellUse,
OtherUse,
MiscUse,
+
+ // 2. The Double representation for an unboxed double value that must be stored
+ // in an FP register.
+ DoubleRepUse,
+ DoubleRepRealUse,
+ DoubleRepMachineIntUse,
+
+ // 3. The Int52 representation for an unboxed integer value that must be stored
+ // in a GP register.
+ Int52RepUse,
+
LastUseKind // Must always be the last entry in the enum, as it is used to denote the number of enum elements.
};
return SpecInt32 | SpecInt52AsDouble;
case NumberUse:
return SpecBytecodeNumber;
+ case RealNumberUse:
+ return SpecBytecodeRealNumber;
case DoubleRepUse:
return SpecFullDouble;
case DoubleRepRealUse:
return SpecCell;
case ObjectUse:
return SpecObject;
+ case FunctionUse:
+ return SpecFunction;
case FinalObjectUse:
return SpecFinalObject;
case ObjectOrOtherUse:
case Int32Use:
case KnownInt32Use:
case NumberUse:
+ case RealNumberUse:
case Int52RepUse:
case DoubleRepUse:
case DoubleRepRealUse:
case CellUse:
case KnownCellUse:
case ObjectUse:
+ case FunctionUse:
case FinalObjectUse:
case StringIdentUse:
case StringUse:
}
}
+// Returns true if we've already guaranteed the type
+inline bool alreadyChecked(UseKind kind, SpeculatedType type)
+{
+ // If the check involves the structure then we need to know more than just the type to be sure
+ // that the check is done.
+ if (usesStructure(kind))
+ return false;
+
+ return !(type & ~typeFilterFor(kind));
+}
+
inline UseKind useKindForResult(NodeFlags result)
{
ASSERT(!(result & ~NodeResultMask));