Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index e71b7cdf41a1b483e22320eecddd5a569fe0a541..34e069b1b4e3dd34502bb61d16d0f3f0132f4ce5 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -5241,15 +5241,18 @@ class HLoadGlobalGeneric: public HTemplateInstruction<2> { |
class HAllocate: public HTemplateInstruction<2> { |
public: |
enum Flags { |
- CAN_ALLOCATE_IN_NEW_SPACE = 1 << 0, |
- CAN_ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, |
- CAN_ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, |
+ ALLOCATE_IN_NEW_SPACE = 1 << 0, |
+ ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, |
+ ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, |
ALLOCATE_DOUBLE_ALIGNED = 1 << 3, |
PREFILL_WITH_FILLER = 1 << 4 |
}; |
HAllocate(HValue* context, HValue* size, HType type, Flags flags) |
: flags_(flags) { |
+ ASSERT(((flags & kAllocationFlagsMask) == ALLOCATE_IN_NEW_SPACE) || |
+ ((flags & kAllocationFlagsMask) == ALLOCATE_IN_OLD_DATA_SPACE) || |
+ ((flags & kAllocationFlagsMask) == ALLOCATE_IN_OLD_POINTER_SPACE)); |
SetOperandAt(0, context); |
SetOperandAt(1, size); |
set_type(type); |
@@ -5263,11 +5266,11 @@ class HAllocate: public HTemplateInstruction<2> { |
static const int kMaxInlineSize = 64 * kPointerSize; |
static Flags DefaultFlags() { |
- return CAN_ALLOCATE_IN_NEW_SPACE; |
+ return ALLOCATE_IN_NEW_SPACE; |
} |
static Flags DefaultFlags(ElementsKind kind) { |
- Flags flags = CAN_ALLOCATE_IN_NEW_SPACE; |
+ Flags flags = ALLOCATE_IN_NEW_SPACE; |
if (IsFastDoubleElementsKind(kind)) { |
flags = static_cast<HAllocate::Flags>( |
flags | HAllocate::ALLOCATE_DOUBLE_ALIGNED); |
@@ -5275,6 +5278,14 @@ class HAllocate: public HTemplateInstruction<2> { |
return flags; |
} |
+ static Flags SetAllocationFlag(Flags flags, Flags allocation_flag) { |
Michael Starzinger
2013/07/30 12:50:41
As discussed offline: I don't like this helper ver
Hannes Payer (out of office)
2013/07/30 15:23:05
I took that idea even further and made the HAlloca
|
+ ASSERT(allocation_flag == ALLOCATE_IN_NEW_SPACE || |
+ allocation_flag == ALLOCATE_IN_OLD_DATA_SPACE || |
+ allocation_flag == ALLOCATE_IN_OLD_POINTER_SPACE); |
+ flags = static_cast<HAllocate::Flags>(flags & ~kAllocationFlagsMask); |
+ return static_cast<HAllocate::Flags>(flags | allocation_flag); |
+ } |
+ |
HValue* context() { return OperandAt(0); } |
HValue* size() { return OperandAt(1); } |
@@ -5294,25 +5305,16 @@ class HAllocate: public HTemplateInstruction<2> { |
known_initial_map_ = known_initial_map; |
} |
- bool CanAllocateInNewSpace() const { |
- return (flags_ & CAN_ALLOCATE_IN_NEW_SPACE) != 0; |
- } |
- |
- bool CanAllocateInOldDataSpace() const { |
- return (flags_ & CAN_ALLOCATE_IN_OLD_DATA_SPACE) != 0; |
- } |
- |
- bool CanAllocateInOldPointerSpace() const { |
- return (flags_ & CAN_ALLOCATE_IN_OLD_POINTER_SPACE) != 0; |
+ bool AllocateInNewSpace() const { |
+ return (flags_ & ALLOCATE_IN_NEW_SPACE) != 0; |
} |
- bool CanAllocateInOldSpace() const { |
- return CanAllocateInOldDataSpace() || |
- CanAllocateInOldPointerSpace(); |
+ bool AllocateInOldDataSpace() const { |
+ return (flags_ & ALLOCATE_IN_OLD_DATA_SPACE) != 0; |
} |
- bool GuaranteedInNewSpace() const { |
- return CanAllocateInNewSpace() && !CanAllocateInOldSpace(); |
+ bool AllocateInOldPointerSpace() const { |
+ return (flags_ & ALLOCATE_IN_OLD_POINTER_SPACE) != 0; |
} |
bool MustAllocateDoubleAligned() const { |
@@ -5325,6 +5327,9 @@ class HAllocate: public HTemplateInstruction<2> { |
void SetFlags(Flags flags) { |
flags_ = static_cast<HAllocate::Flags>(flags_ | flags); |
+ ASSERT(((flags_ & kAllocationFlagsMask) == ALLOCATE_IN_NEW_SPACE) || |
+ ((flags_ & kAllocationFlagsMask) == ALLOCATE_IN_OLD_DATA_SPACE) || |
+ ((flags_ & kAllocationFlagsMask) == ALLOCATE_IN_OLD_POINTER_SPACE)); |
} |
void UpdateSize(HValue* size) { |
@@ -5339,6 +5344,7 @@ class HAllocate: public HTemplateInstruction<2> { |
DECLARE_CONCRETE_INSTRUCTION(Allocate) |
private: |
+ static const int kAllocationFlagsMask = 0x7; |
Michael Starzinger
2013/07/30 12:50:41
Better compute this using the above three enum val
Hannes Payer (out of office)
2013/07/30 15:23:05
Removed, not needed anymore
|
Flags flags_; |
Handle<Map> known_initial_map_; |
}; |
@@ -5389,7 +5395,7 @@ inline bool ReceiverObjectNeedsWriteBarrier(HValue* object, |
} |
if (object != new_space_dominator) return true; |
if (object->IsAllocate()) { |
- return !HAllocate::cast(object)->GuaranteedInNewSpace(); |
+ return !HAllocate::cast(object)->AllocateInNewSpace(); |
} |
return true; |
} |