aboutsummaryrefslogtreecommitdiff
path: root/externals/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h
diff options
context:
space:
mode:
Diffstat (limited to 'externals/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h')
-rw-r--r--externals/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/externals/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h b/externals/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h
new file mode 100644
index 0000000000..f3f4b3b9ee
--- /dev/null
+++ b/externals/dynarmic/src/dynarmic/frontend/A32/decoder/thumb32.h
@@ -0,0 +1,38 @@
+/* This file is part of the dynarmic project.
+ * Copyright (c) 2016 MerryMage
+ * SPDX-License-Identifier: 0BSD
+ */
+
+#pragma once
+
+#include <algorithm>
+#include <optional>
+#include <vector>
+
+#include <mcl/stdint.hpp>
+
+#include "dynarmic/frontend/decoder/decoder_detail.h"
+#include "dynarmic/frontend/decoder/matcher.h"
+
+namespace Dynarmic::A32 {
+
+template<typename Visitor>
+using Thumb32Matcher = Decoder::Matcher<Visitor, u32>;
+
+template<typename V>
+std::optional<std::reference_wrapper<const Thumb32Matcher<V>>> DecodeThumb32(u32 instruction) {
+ static const std::vector<Thumb32Matcher<V>> table = {
+
+#define INST(fn, name, bitstring) DYNARMIC_DECODER_GET_MATCHER(Thumb32Matcher, fn, name, Decoder::detail::StringToArray<32>(bitstring)),
+#include "./thumb32.inc"
+#undef INST
+
+ };
+
+ const auto matches_instruction = [instruction](const auto& matcher) { return matcher.Matches(instruction); };
+
+ auto iter = std::find_if(table.begin(), table.end(), matches_instruction);
+ return iter != table.end() ? std::optional<std::reference_wrapper<const Thumb32Matcher<V>>>(*iter) : std::nullopt;
+}
+
+} // namespace Dynarmic::A32