Commit b58d0d2a authored by palfia@homejinni.com's avatar palfia@homejinni.com

MIPS: Lithium codegen should not pass around block_ids.

Port r15235 (95a844b)

Original commit message:
Rather encapsulate the basic block to assembly label mapping in the LInstruction.

BUG=

Review URL: https://codereview.chromium.org/17504002
Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15257 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent fd08ac7c
This diff is collapsed.
...@@ -78,7 +78,6 @@ class LCodeGen BASE_EMBEDDED { ...@@ -78,7 +78,6 @@ class LCodeGen BASE_EMBEDDED {
Heap* heap() const { return isolate()->heap(); } Heap* heap() const { return isolate()->heap(); }
Zone* zone() const { return zone_; } Zone* zone() const { return zone_; }
// TODO(svenpanne) Use this consistently.
int LookupDestination(int block_id) const { int LookupDestination(int block_id) const {
return chunk()->LookupDestination(block_id); return chunk()->LookupDestination(block_id);
} }
...@@ -322,13 +321,13 @@ class LCodeGen BASE_EMBEDDED { ...@@ -322,13 +321,13 @@ class LCodeGen BASE_EMBEDDED {
static Condition TokenToCondition(Token::Value op, bool is_unsigned); static Condition TokenToCondition(Token::Value op, bool is_unsigned);
void EmitGoto(int block); void EmitGoto(int block);
void EmitBranch(int left_block, template<class InstrType>
int right_block, void EmitBranch(InstrType instr,
Condition cc, Condition cc,
Register src1, Register src1,
const Operand& src2); const Operand& src2);
void EmitBranchF(int left_block, template<class InstrType>
int right_block, void EmitBranchF(InstrType instr,
Condition cc, Condition cc,
FPURegister src1, FPURegister src1,
FPURegister src2); FPURegister src2);
......
...@@ -488,17 +488,44 @@ class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> { ...@@ -488,17 +488,44 @@ class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> {
template<int I, int T> template<int I, int T>
class LControlInstruction: public LTemplateInstruction<0, I, T> { class LControlInstruction: public LTemplateInstruction<0, I, T> {
public: public:
LControlInstruction() : false_label_(NULL), true_label_(NULL) { }
virtual bool IsControl() const { return true; } virtual bool IsControl() const { return true; }
int SuccessorCount() { return hydrogen()->SuccessorCount(); } int SuccessorCount() { return hydrogen()->SuccessorCount(); }
HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); } 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: private:
HControlInstruction* hydrogen() { HControlInstruction* hydrogen() {
return HControlInstruction::cast(this->hydrogen_value()); return HControlInstruction::cast(this->hydrogen_value());
} }
Label* false_label_;
Label* true_label_;
}; };
...@@ -1216,7 +1243,7 @@ class LBranch: public LControlInstruction<1, 0> { ...@@ -1216,7 +1243,7 @@ class LBranch: public LControlInstruction<1, 0> {
}; };
class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 1> { class LCmpMapAndBranch: public LControlInstruction<1, 1> {
public: public:
LCmpMapAndBranch(LOperand* value, LOperand* temp) { LCmpMapAndBranch(LOperand* value, LOperand* temp) {
inputs_[0] = value; inputs_[0] = value;
...@@ -1229,15 +1256,7 @@ class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 1> { ...@@ -1229,15 +1256,7 @@ class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 1> {
DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch") DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
DECLARE_HYDROGEN_ACCESSOR(CompareMap) DECLARE_HYDROGEN_ACCESSOR(CompareMap)
virtual bool IsControl() const { return true; }
Handle<Map> map() const { return hydrogen()->map(); } 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();
}
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment