diff options
Diffstat (limited to 'chromium/v8/src/arm64/decoder-arm64.cc')
-rw-r--r-- | chromium/v8/src/arm64/decoder-arm64.cc | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/chromium/v8/src/arm64/decoder-arm64.cc b/chromium/v8/src/arm64/decoder-arm64.cc new file mode 100644 index 00000000000..08881c2d5a5 --- /dev/null +++ b/chromium/v8/src/arm64/decoder-arm64.cc @@ -0,0 +1,86 @@ +// Copyright 2013 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/v8.h" + +#if V8_TARGET_ARCH_ARM64 + +#include "src/globals.h" +#include "src/utils.h" +#include "src/arm64/decoder-arm64.h" + + +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 + + +} } // namespace v8::internal + +#endif // V8_TARGET_ARCH_ARM64 |