A64: Move the dispatching logic of the decoder to a separate class.
BUG=none R=ulan@chromium.org, rodolph.perfetta@arm.com LOG=n Review URL: https://codereview.chromium.org/181233002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19561 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
0d297e51d7
commit
662bb0cc09
@ -37,6 +37,73 @@
|
|||||||
namespace v8 {
|
namespace v8 {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
|
||||||
|
void DispatchingDecoderVisitor::AppendVisitor(DecoderVisitor* new_visitor) {
|
||||||
|
visitors_.remove(new_visitor);
|
||||||
|
visitors_.push_front(new_visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DispatchingDecoderVisitor::PrependVisitor(DecoderVisitor* new_visitor) {
|
||||||
|
visitors_.remove(new_visitor);
|
||||||
|
visitors_.push_back(new_visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DispatchingDecoderVisitor::InsertVisitorBefore(
|
||||||
|
DecoderVisitor* new_visitor, DecoderVisitor* registered_visitor) {
|
||||||
|
visitors_.remove(new_visitor);
|
||||||
|
std::list<DecoderVisitor*>::iterator it;
|
||||||
|
for (it = visitors_.begin(); it != visitors_.end(); it++) {
|
||||||
|
if (*it == registered_visitor) {
|
||||||
|
visitors_.insert(it, new_visitor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// We reached the end of the list. The last element must be
|
||||||
|
// registered_visitor.
|
||||||
|
ASSERT(*it == registered_visitor);
|
||||||
|
visitors_.insert(it, new_visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DispatchingDecoderVisitor::InsertVisitorAfter(
|
||||||
|
DecoderVisitor* new_visitor, DecoderVisitor* registered_visitor) {
|
||||||
|
visitors_.remove(new_visitor);
|
||||||
|
std::list<DecoderVisitor*>::iterator it;
|
||||||
|
for (it = visitors_.begin(); it != visitors_.end(); it++) {
|
||||||
|
if (*it == registered_visitor) {
|
||||||
|
it++;
|
||||||
|
visitors_.insert(it, new_visitor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// We reached the end of the list. The last element must be
|
||||||
|
// registered_visitor.
|
||||||
|
ASSERT(*it == registered_visitor);
|
||||||
|
visitors_.push_back(new_visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DispatchingDecoderVisitor::RemoveVisitor(DecoderVisitor* visitor) {
|
||||||
|
visitors_.remove(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define DEFINE_VISITOR_CALLERS(A) \
|
||||||
|
void DispatchingDecoderVisitor::Visit##A(Instruction* instr) { \
|
||||||
|
if (!(instr->Mask(A##FMask) == A##Fixed)) { \
|
||||||
|
ASSERT(instr->Mask(A##FMask) == A##Fixed); \
|
||||||
|
} \
|
||||||
|
std::list<DecoderVisitor*>::iterator it; \
|
||||||
|
for (it = visitors_.begin(); it != visitors_.end(); it++) { \
|
||||||
|
(*it)->Visit##A(instr); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
VISITOR_LIST(DEFINE_VISITOR_CALLERS)
|
||||||
|
#undef DEFINE_VISITOR_CALLERS
|
||||||
|
|
||||||
|
|
||||||
// Top-level instruction decode function.
|
// Top-level instruction decode function.
|
||||||
void Decoder::Decode(Instruction *instr) {
|
void Decoder::Decode(Instruction *instr) {
|
||||||
if (instr->Bits(28, 27) == 0) {
|
if (instr->Bits(28, 27) == 0) {
|
||||||
@ -116,58 +183,6 @@ void Decoder::Decode(Instruction *instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Decoder::AppendVisitor(DecoderVisitor* new_visitor) {
|
|
||||||
visitors_.remove(new_visitor);
|
|
||||||
visitors_.push_front(new_visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Decoder::PrependVisitor(DecoderVisitor* new_visitor) {
|
|
||||||
visitors_.remove(new_visitor);
|
|
||||||
visitors_.push_back(new_visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Decoder::InsertVisitorBefore(DecoderVisitor* new_visitor,
|
|
||||||
DecoderVisitor* registered_visitor) {
|
|
||||||
visitors_.remove(new_visitor);
|
|
||||||
std::list<DecoderVisitor*>::iterator it;
|
|
||||||
for (it = visitors_.begin(); it != visitors_.end(); it++) {
|
|
||||||
if (*it == registered_visitor) {
|
|
||||||
visitors_.insert(it, new_visitor);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// We reached the end of the list. The last element must be
|
|
||||||
// registered_visitor.
|
|
||||||
ASSERT(*it == registered_visitor);
|
|
||||||
visitors_.insert(it, new_visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Decoder::InsertVisitorAfter(DecoderVisitor* new_visitor,
|
|
||||||
DecoderVisitor* registered_visitor) {
|
|
||||||
visitors_.remove(new_visitor);
|
|
||||||
std::list<DecoderVisitor*>::iterator it;
|
|
||||||
for (it = visitors_.begin(); it != visitors_.end(); it++) {
|
|
||||||
if (*it == registered_visitor) {
|
|
||||||
it++;
|
|
||||||
visitors_.insert(it, new_visitor);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// We reached the end of the list. The last element must be
|
|
||||||
// registered_visitor.
|
|
||||||
ASSERT(*it == registered_visitor);
|
|
||||||
visitors_.push_back(new_visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Decoder::RemoveVisitor(DecoderVisitor* visitor) {
|
|
||||||
visitors_.remove(visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Decoder::DecodePCRelAddressing(Instruction* instr) {
|
void Decoder::DecodePCRelAddressing(Instruction* instr) {
|
||||||
ASSERT(instr->Bits(27, 24) == 0x0);
|
ASSERT(instr->Bits(27, 24) == 0x0);
|
||||||
// We know bit 28 is set, as <b28:b27> = 0 is filtered out at the top level
|
// We know bit 28 is set, as <b28:b27> = 0 is filtered out at the top level
|
||||||
@ -707,20 +722,6 @@ void Decoder::DecodeAdvSIMDDataProcessing(Instruction* instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define DEFINE_VISITOR_CALLERS(A) \
|
|
||||||
void Decoder::Visit##A(Instruction *instr) { \
|
|
||||||
if (!(instr->Mask(A##FMask) == A##Fixed)) { \
|
|
||||||
ASSERT(instr->Mask(A##FMask) == A##Fixed); \
|
|
||||||
} \
|
|
||||||
std::list<DecoderVisitor*>::iterator it; \
|
|
||||||
for (it = visitors_.begin(); it != visitors_.end(); it++) { \
|
|
||||||
(*it)->Visit##A(instr); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
VISITOR_LIST(DEFINE_VISITOR_CALLERS)
|
|
||||||
#undef DEFINE_VISITOR_CALLERS
|
|
||||||
|
|
||||||
|
|
||||||
} } // namespace v8::internal
|
} } // namespace v8::internal
|
||||||
|
|
||||||
#endif // V8_TARGET_ARCH_A64
|
#endif // V8_TARGET_ARCH_A64
|
||||||
|
@ -97,13 +97,11 @@ class DecoderVisitor {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Decoder {
|
// A visitor that dispatches to a list of visitors.
|
||||||
|
class DispatchingDecoderVisitor : public DecoderVisitor {
|
||||||
public:
|
public:
|
||||||
Decoder() {}
|
DispatchingDecoderVisitor() {}
|
||||||
|
virtual ~DispatchingDecoderVisitor() {}
|
||||||
// Top-level instruction decoder function. Decodes an instruction and calls
|
|
||||||
// the visitor functions registered with the Decoder class.
|
|
||||||
void Decode(Instruction *instr);
|
|
||||||
|
|
||||||
// Register a new visitor class with the decoder.
|
// Register a new visitor class with the decoder.
|
||||||
// Decode() will call the corresponding visitor method from all registered
|
// Decode() will call the corresponding visitor method from all registered
|
||||||
@ -138,6 +136,20 @@ class Decoder {
|
|||||||
VISITOR_LIST(DECLARE)
|
VISITOR_LIST(DECLARE)
|
||||||
#undef DECLARE
|
#undef DECLARE
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Visitors are registered in a list.
|
||||||
|
std::list<DecoderVisitor*> visitors_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Decoder : public DispatchingDecoderVisitor {
|
||||||
|
public:
|
||||||
|
Decoder() {}
|
||||||
|
|
||||||
|
// Top-level instruction decoder function. Decodes an instruction and calls
|
||||||
|
// the visitor functions registered with the Decoder class.
|
||||||
|
void Decode(Instruction *instr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Decode the PC relative addressing instruction, and call the corresponding
|
// Decode the PC relative addressing instruction, and call the corresponding
|
||||||
// visitors.
|
// visitors.
|
||||||
@ -188,9 +200,6 @@ class Decoder {
|
|||||||
// tree, and call the corresponding visitors.
|
// tree, and call the corresponding visitors.
|
||||||
// On entry, instruction bits 27:25 = 0x7.
|
// On entry, instruction bits 27:25 = 0x7.
|
||||||
void DecodeAdvSIMDDataProcessing(Instruction* instr);
|
void DecodeAdvSIMDDataProcessing(Instruction* instr);
|
||||||
|
|
||||||
// Visitors are registered in a list.
|
|
||||||
std::list<DecoderVisitor*> visitors_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user