1f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
7fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org#if V8_TARGET_ARCH_ARM64
8f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
94b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm64/decoder-arm64.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/globals.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h"
12f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
13f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
14f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace v8 {
15f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace internal {
16f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
17f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
18f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid DispatchingDecoderVisitor::AppendVisitor(DecoderVisitor* new_visitor) {
19f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  visitors_.remove(new_visitor);
20d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  visitors_.push_back(new_visitor);
21f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
22f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
23f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
24f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid DispatchingDecoderVisitor::PrependVisitor(DecoderVisitor* new_visitor) {
25f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  visitors_.remove(new_visitor);
26d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  visitors_.push_front(new_visitor);
27f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
28f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
29f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
30f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid DispatchingDecoderVisitor::InsertVisitorBefore(
31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    DecoderVisitor* new_visitor, DecoderVisitor* registered_visitor) {
32f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  visitors_.remove(new_visitor);
33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  std::list<DecoderVisitor*>::iterator it;
34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (it = visitors_.begin(); it != visitors_.end(); it++) {
35f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (*it == registered_visitor) {
36f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      visitors_.insert(it, new_visitor);
37f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return;
38f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
39f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // We reached the end of the list. The last element must be
41f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // registered_visitor.
42e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(*it == registered_visitor);
43f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  visitors_.insert(it, new_visitor);
44f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
45f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
46f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
47f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid DispatchingDecoderVisitor::InsertVisitorAfter(
48f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    DecoderVisitor* new_visitor, DecoderVisitor* registered_visitor) {
49f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  visitors_.remove(new_visitor);
50f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  std::list<DecoderVisitor*>::iterator it;
51f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (it = visitors_.begin(); it != visitors_.end(); it++) {
52f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (*it == registered_visitor) {
53f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      it++;
54f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      visitors_.insert(it, new_visitor);
55f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return;
56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
58f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // We reached the end of the list. The last element must be
59f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // registered_visitor.
60e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(*it == registered_visitor);
61f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  visitors_.push_back(new_visitor);
62f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
63f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
64f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
65f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid DispatchingDecoderVisitor::RemoveVisitor(DecoderVisitor* visitor) {
66f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  visitors_.remove(visitor);
67f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
68f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
69f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
70f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#define DEFINE_VISITOR_CALLERS(A)                                \
71f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void DispatchingDecoderVisitor::Visit##A(Instruction* instr) { \
72f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (!(instr->Mask(A##FMask) == A##Fixed)) {                  \
73e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->Mask(A##FMask) == A##Fixed);                 \
74f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }                                                            \
75f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    std::list<DecoderVisitor*>::iterator it;                     \
76f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    for (it = visitors_.begin(); it != visitors_.end(); it++) {  \
77f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      (*it)->Visit##A(instr);                                    \
78f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }                                                            \
79f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
80f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgVISITOR_LIST(DEFINE_VISITOR_CALLERS)
81f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#undef DEFINE_VISITOR_CALLERS
82f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
83f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
84f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} }  // namespace v8::internal
85f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
86fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org#endif  // V8_TARGET_ARCH_ARM64
87