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 {
}
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 {
for (int i = 0; i < 4; i++) {
if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
......
......@@ -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 {
public:
explicit LGap(HBasicBlock* block)
......
......@@ -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 {
for (int i = 0; i < 4; i++) {
if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
......
......@@ -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 {
public:
explicit LGap(HBasicBlock* block)
......
......@@ -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
......@@ -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
#endif // V8_LITHIUM_H_
......@@ -31,6 +31,28 @@
namespace v8 {
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() {
ASSERT(is_unused());
chunk_ = new LChunk(graph());
......
......@@ -41,14 +41,45 @@ class LCodeGen;
class LEnvironment;
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 {
public:
LInstruction() { }
LInstruction()
: hydrogen_value_(NULL) { }
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.
virtual bool IsLabel() const {
UNIMPLEMENTED();
......@@ -59,6 +90,17 @@ class LInstruction: public ZoneObject {
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); }
LEnvironment* environment() const { return environment_.get(); }
bool HasEnvironment() const { return environment_.is_set(); }
......@@ -93,32 +135,22 @@ class LInstruction: public ZoneObject {
};
class LParallelMove : public ZoneObject {
class LGap: public LInstruction {
public:
LParallelMove() : move_operands_(4) { }
void AddMove(LOperand* from, LOperand* to) {
UNIMPLEMENTED();
explicit LGap(HBasicBlock* block)
: block_(block) {
parallel_moves_[BEFORE] = NULL;
parallel_moves_[START] = NULL;
parallel_moves_[END] = NULL;
parallel_moves_[AFTER] = NULL;
}
const ZoneList<LMoveOperands>* move_operands() const {
UNIMPLEMENTED();
return NULL;
}
DECLARE_CONCRETE_INSTRUCTION(Gap, "gap")
virtual void PrintDataTo(StringStream* stream) const;
private:
ZoneList<LMoveOperands> move_operands_;
};
bool IsRedundant() const;
class LGap: public LInstruction {
public:
explicit LGap(HBasicBlock* block) { }
HBasicBlock* block() const {
UNIMPLEMENTED();
return NULL;
}
HBasicBlock* block() const { return block_; }
enum InnerPosition {
BEFORE,
......@@ -130,13 +162,12 @@ class LGap: public LInstruction {
};
LParallelMove* GetOrCreateParallelMove(InnerPosition pos) {
UNIMPLEMENTED();
return NULL;
if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove;
return parallel_moves_[pos];
}
LParallelMove* GetParallelMove(InnerPosition pos) {
UNIMPLEMENTED();
return NULL;
return parallel_moves_[pos];
}
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