Revision: 19561
Author: [email protected]
Date: Wed Feb 26 11:59:17 2014 UTC
Log: A64: Move the dispatching logic of the decoder to a separate
class.
BUG=none
[email protected], [email protected]
LOG=n
Review URL: https://codereview.chromium.org/181233002
http://code.google.com/p/v8/source/detail?r=19561
Modified:
/branches/bleeding_edge/src/a64/decoder-a64.cc
/branches/bleeding_edge/src/a64/decoder-a64.h
=======================================
--- /branches/bleeding_edge/src/a64/decoder-a64.cc Wed Feb 12 09:19:30 2014
UTC
+++ /branches/bleeding_edge/src/a64/decoder-a64.cc Wed Feb 26 11:59:17 2014
UTC
@@ -37,6 +37,73 @@
namespace v8 {
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.
void Decoder::Decode(Instruction *instr) {
if (instr->Bits(28, 27) == 0) {
@@ -114,58 +181,6 @@
}
}
}
-
-
-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) {
@@ -705,20 +720,6 @@
ASSERT(instr->Bits(27, 25) == 0x7);
VisitUnimplemented(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
=======================================
--- /branches/bleeding_edge/src/a64/decoder-a64.h Wed Feb 26 11:54:55 2014
UTC
+++ /branches/bleeding_edge/src/a64/decoder-a64.h Wed Feb 26 11:59:17 2014
UTC
@@ -97,13 +97,11 @@
};
-class Decoder {
+// A visitor that dispatches to a list of visitors.
+class DispatchingDecoderVisitor : public DecoderVisitor {
public:
- Decoder() {}
-
- // Top-level instruction decoder function. Decodes an instruction and
calls
- // the visitor functions registered with the Decoder class.
- void Decode(Instruction *instr);
+ DispatchingDecoderVisitor() {}
+ virtual ~DispatchingDecoderVisitor() {}
// Register a new visitor class with the decoder.
// Decode() will call the corresponding visitor method from all
registered
@@ -138,6 +136,20 @@
VISITOR_LIST(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:
// Decode the PC relative addressing instruction, and call the
corresponding
// visitors.
@@ -188,9 +200,6 @@
// tree, and call the corresponding visitors.
// On entry, instruction bits 27:25 = 0x7.
void DecodeAdvSIMDDataProcessing(Instruction* instr);
-
- // Visitors are registered in a list.
- std::list<DecoderVisitor*> visitors_;
};
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.