Index: src/ia32/lithium-ia32.h |
diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h |
index ed33668a4fbfd858dff349c587297f84cb22da1f..2d9b368a3337148328a06ef77953b3659e245b44 100644 |
--- a/src/ia32/lithium-ia32.h |
+++ b/src/ia32/lithium-ia32.h |
@@ -482,17 +482,46 @@ class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> { |
template<int I, int T> |
class LControlInstruction: public LTemplateInstruction<0, I, T> { |
public: |
+ LControlInstruction() { |
+ false_label_ = true_label_ = NULL; |
Jakob Kummerow
2013/06/18 09:35:38
nit: Use initializers:
LControlInstruction() :
|
+ } |
+ |
virtual bool IsControl() const { return true; } |
int SuccessorCount() { return hydrogen()->SuccessorCount(); } |
HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); } |
- int true_block_id() { return hydrogen()->SuccessorAt(0)->block_id(); } |
- int false_block_id() { return hydrogen()->SuccessorAt(1)->block_id(); } |
+ |
+ int TrueDestination(LChunk* chunk) { |
+ return chunk->LookupDestination(true_block_id()); |
+ } |
+ int FalseDestination(LChunk* chunk) { |
+ return chunk->LookupDestination(false_block_id()); |
+ } |
+ |
+ Label* TrueLabel(LChunk* chunk) { |
+ if (true_label_ == NULL) { |
+ true_label_ = chunk->GetAssemblyLabel(TrueDestination(chunk)); |
+ } |
+ return true_label_; |
+ } |
+ Label* FalseLabel(LChunk* chunk) { |
+ if (false_label_ == NULL) { |
+ false_label_ = chunk->GetAssemblyLabel(FalseDestination(chunk)); |
+ } |
+ return false_label_; |
+ } |
+ |
+ protected: |
+ int true_block_id() { return SuccessorAt(0)->block_id(); } |
+ int false_block_id() { return SuccessorAt(1)->block_id(); } |
private: |
HControlInstruction* hydrogen() { |
return HControlInstruction::cast(this->hydrogen_value()); |
} |
+ |
+ Label* false_label_; |
+ Label* true_label_; |
}; |
@@ -1206,7 +1235,7 @@ class LBranch: public LControlInstruction<1, 1> { |
}; |
-class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> { |
+class LCmpMapAndBranch: public LControlInstruction<1, 0> { |
public: |
explicit LCmpMapAndBranch(LOperand* value) { |
inputs_[0] = value; |
@@ -1217,15 +1246,7 @@ class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> { |
DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch") |
DECLARE_HYDROGEN_ACCESSOR(CompareMap) |
- virtual bool IsControl() const { return true; } |
- |
Handle<Map> map() const { return hydrogen()->map(); } |
- int true_block_id() const { |
- return hydrogen()->FirstSuccessor()->block_id(); |
- } |
- int false_block_id() const { |
- return hydrogen()->SecondSuccessor()->block_id(); |
- } |
}; |