Commit a1390940 authored by whesse@chromium.org's avatar whesse@chromium.org

Crankshaft: Move LParallelMove to lithium.h, add LGap to lithium-x64.h.

Review URL: http://codereview.chromium.org/6132002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6242 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent cb6a0706
...@@ -93,32 +93,6 @@ void LLabel::PrintDataTo(StringStream* stream) const { ...@@ -93,32 +93,6 @@ void LLabel::PrintDataTo(StringStream* stream) const {
} }
bool LParallelMove::IsRedundant() const {
for (int i = 0; i < move_operands_.length(); ++i) {
if (!move_operands_[i].IsRedundant()) return false;
}
return true;
}
void LParallelMove::PrintDataTo(StringStream* stream) const {
for (int i = move_operands_.length() - 1; i >= 0; --i) {
if (!move_operands_[i].IsEliminated()) {
LOperand* from = move_operands_[i].from();
LOperand* to = move_operands_[i].to();
if (from->Equals(to)) {
to->PrintTo(stream);
} else {
to->PrintTo(stream);
stream->Add(" = ");
from->PrintTo(stream);
}
stream->Add("; ");
}
}
}
bool LGap::IsRedundant() const { bool LGap::IsRedundant() const {
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
......
...@@ -332,27 +332,6 @@ class LInstruction: public ZoneObject { ...@@ -332,27 +332,6 @@ class LInstruction: public ZoneObject {
}; };
class LParallelMove : public ZoneObject {
public:
LParallelMove() : move_operands_(4) { }
void AddMove(LOperand* from, LOperand* to) {
move_operands_.Add(LMoveOperands(from, to));
}
bool IsRedundant() const;
const ZoneList<LMoveOperands>* move_operands() const {
return &move_operands_;
}
void PrintDataTo(StringStream* stream) const;
private:
ZoneList<LMoveOperands> move_operands_;
};
class LGap: public LInstruction { class LGap: public LInstruction {
public: public:
explicit LGap(HBasicBlock* block) explicit LGap(HBasicBlock* block)
......
...@@ -93,32 +93,6 @@ void LLabel::PrintDataTo(StringStream* stream) const { ...@@ -93,32 +93,6 @@ void LLabel::PrintDataTo(StringStream* stream) const {
} }
bool LParallelMove::IsRedundant() const {
for (int i = 0; i < move_operands_.length(); ++i) {
if (!move_operands_[i].IsRedundant()) return false;
}
return true;
}
void LParallelMove::PrintDataTo(StringStream* stream) const {
for (int i = move_operands_.length() - 1; i >= 0; --i) {
if (!move_operands_[i].IsEliminated()) {
LOperand* from = move_operands_[i].from();
LOperand* to = move_operands_[i].to();
if (from->Equals(to)) {
to->PrintTo(stream);
} else {
to->PrintTo(stream);
stream->Add(" = ");
from->PrintTo(stream);
}
stream->Add("; ");
}
}
}
bool LGap::IsRedundant() const { bool LGap::IsRedundant() const {
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
......
...@@ -335,27 +335,6 @@ class LInstruction: public ZoneObject { ...@@ -335,27 +335,6 @@ class LInstruction: public ZoneObject {
}; };
class LParallelMove : public ZoneObject {
public:
LParallelMove() : move_operands_(4) { }
void AddMove(LOperand* from, LOperand* to) {
move_operands_.Add(LMoveOperands(from, to));
}
bool IsRedundant() const;
const ZoneList<LMoveOperands>* move_operands() const {
return &move_operands_;
}
void PrintDataTo(StringStream* stream) const;
private:
ZoneList<LMoveOperands> move_operands_;
};
class LGap: public LInstruction { class LGap: public LInstruction {
public: public:
explicit LGap(HBasicBlock* block) explicit LGap(HBasicBlock* block)
......
...@@ -176,4 +176,30 @@ LGapNode* LGapResolver::LookupNode(LOperand* operand) { ...@@ -176,4 +176,30 @@ LGapNode* LGapResolver::LookupNode(LOperand* operand) {
} }
bool LParallelMove::IsRedundant() const {
for (int i = 0; i < move_operands_.length(); ++i) {
if (!move_operands_[i].IsRedundant()) return false;
}
return true;
}
void LParallelMove::PrintDataTo(StringStream* stream) const {
for (int i = move_operands_.length() - 1; i >= 0; --i) {
if (!move_operands_[i].IsEliminated()) {
LOperand* from = move_operands_[i].from();
LOperand* to = move_operands_[i].to();
if (from->Equals(to)) {
to->PrintTo(stream);
} else {
to->PrintTo(stream);
stream->Add(" = ");
from->PrintTo(stream);
}
stream->Add("; ");
}
}
}
} } // namespace v8::internal } } // namespace v8::internal
...@@ -58,6 +58,27 @@ class LGapResolver BASE_EMBEDDED { ...@@ -58,6 +58,27 @@ class LGapResolver BASE_EMBEDDED {
}; };
class LParallelMove : public ZoneObject {
public:
LParallelMove() : move_operands_(4) { }
void AddMove(LOperand* from, LOperand* to) {
move_operands_.Add(LMoveOperands(from, to));
}
bool IsRedundant() const;
const ZoneList<LMoveOperands>* move_operands() const {
return &move_operands_;
}
void PrintDataTo(StringStream* stream) const;
private:
ZoneList<LMoveOperands> move_operands_;
};
} } // namespace v8::internal } } // namespace v8::internal
#endif // V8_LITHIUM_H_ #endif // V8_LITHIUM_H_
...@@ -31,6 +31,28 @@ ...@@ -31,6 +31,28 @@
namespace v8 { namespace v8 {
namespace internal { namespace internal {
bool LGap::IsRedundant() const {
for (int i = 0; i < 4; i++) {
if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
return false;
}
}
return true;
}
void LGap::PrintDataTo(StringStream* stream) const {
for (int i = 0; i < 4; i++) {
stream->Add("(");
if (parallel_moves_[i] != NULL) {
parallel_moves_[i]->PrintDataTo(stream);
}
stream->Add(") ");
}
}
LChunk* LChunkBuilder::Build() { LChunk* LChunkBuilder::Build() {
ASSERT(is_unused()); ASSERT(is_unused());
chunk_ = new LChunk(graph()); chunk_ = new LChunk(graph());
......
...@@ -41,14 +41,45 @@ class LCodeGen; ...@@ -41,14 +41,45 @@ class LCodeGen;
class LEnvironment; class LEnvironment;
class Translation; class Translation;
// Type hierarchy:
//
// LInstruction
// LGap
#define LITHIUM_ALL_INSTRUCTION_LIST(V) \
LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
V(Gap)
#define DECLARE_INSTRUCTION(type) \
virtual bool Is##type() const { return true; } \
static L##type* cast(LInstruction* instr) { \
ASSERT(instr->Is##type()); \
return reinterpret_cast<L##type*>(instr); \
}
#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
virtual void CompileToNative(LCodeGen* generator); \
virtual const char* Mnemonic() const { return mnemonic; } \
DECLARE_INSTRUCTION(type)
#define DECLARE_HYDROGEN_ACCESSOR(type) \
H##type* hydrogen() const { \
return H##type::cast(hydrogen_value()); \
}
class LInstruction: public ZoneObject { class LInstruction: public ZoneObject {
public: public:
LInstruction() { } LInstruction()
: hydrogen_value_(NULL) { }
virtual ~LInstruction() { } virtual ~LInstruction() { }
virtual void PrintTo(StringStream* stream) const { UNIMPLEMENTED(); }
virtual void PrintDataTo(StringStream* stream) const { }
// Predicates should be generated by macro as in lithium-ia32.h. // Predicates should be generated by macro as in lithium-ia32.h.
virtual bool IsLabel() const { virtual bool IsLabel() const {
UNIMPLEMENTED(); UNIMPLEMENTED();
...@@ -59,6 +90,17 @@ class LInstruction: public ZoneObject { ...@@ -59,6 +90,17 @@ class LInstruction: public ZoneObject {
return false; return false;
} }
virtual void CompileToNative(LCodeGen* generator) = 0;
virtual const char* Mnemonic() const = 0;
virtual void PrintTo(StringStream* stream) const;
virtual void PrintDataTo(StringStream* stream) const { }
// Declare virtual type testers.
#define DECLARE_DO(type) virtual bool Is##type() const { return false; }
LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO)
#undef DECLARE_DO
virtual bool IsControl() const { return false; }
void set_environment(LEnvironment* env) { environment_.set(env); } void set_environment(LEnvironment* env) { environment_.set(env); }
LEnvironment* environment() const { return environment_.get(); } LEnvironment* environment() const { return environment_.get(); }
bool HasEnvironment() const { return environment_.is_set(); } bool HasEnvironment() const { return environment_.is_set(); }
...@@ -93,32 +135,22 @@ class LInstruction: public ZoneObject { ...@@ -93,32 +135,22 @@ class LInstruction: public ZoneObject {
}; };
class LParallelMove : public ZoneObject { class LGap: public LInstruction {
public: public:
LParallelMove() : move_operands_(4) { } explicit LGap(HBasicBlock* block)
: block_(block) {
void AddMove(LOperand* from, LOperand* to) { parallel_moves_[BEFORE] = NULL;
UNIMPLEMENTED(); parallel_moves_[START] = NULL;
parallel_moves_[END] = NULL;
parallel_moves_[AFTER] = NULL;
} }
const ZoneList<LMoveOperands>* move_operands() const { DECLARE_CONCRETE_INSTRUCTION(Gap, "gap")
UNIMPLEMENTED(); virtual void PrintDataTo(StringStream* stream) const;
return NULL;
}
private: bool IsRedundant() const;
ZoneList<LMoveOperands> move_operands_;
};
HBasicBlock* block() const { return block_; }
class LGap: public LInstruction {
public:
explicit LGap(HBasicBlock* block) { }
HBasicBlock* block() const {
UNIMPLEMENTED();
return NULL;
}
enum InnerPosition { enum InnerPosition {
BEFORE, BEFORE,
...@@ -130,13 +162,12 @@ class LGap: public LInstruction { ...@@ -130,13 +162,12 @@ class LGap: public LInstruction {
}; };
LParallelMove* GetOrCreateParallelMove(InnerPosition pos) { LParallelMove* GetOrCreateParallelMove(InnerPosition pos) {
UNIMPLEMENTED(); if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove;
return NULL; return parallel_moves_[pos];
} }
LParallelMove* GetParallelMove(InnerPosition pos) { LParallelMove* GetParallelMove(InnerPosition pos) {
UNIMPLEMENTED(); return parallel_moves_[pos];
return NULL;
} }
private: private:
......
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