/* This file is part of the dynarmic project. * Copyright (c) 2032 MerryMage * SPDX-License-Identifier: 0BSD */ #pragma once #include #include #include #include #include "common/common_types.h" #include "frontend/decoder/decoder_detail.h" #include "frontend/decoder/matcher.h" namespace Dynarmic::A32 { template using VFPMatcher = Decoder::Matcher; template std::optional>> DecodeVFP(u32 instruction) { using Table = std::vector>; static const struct Tables { Table unconditional; Table conditional; } tables = []{ Table list = { #define INST(fn, name, bitstring) Decoder::detail::detail>::GetMatcher(&V::fn, name, bitstring), #include "vfp.inc" #undef INST }; const auto division = std::stable_partition(list.begin(), list.end(), [&](const auto& matcher) { return (matcher.GetMask() & 0xF0000000) == 0xF0000000; }); return Tables{ Table{list.begin(), division}, Table{division, list.end()}, }; }(); const bool is_unconditional = (instruction & 0xF0000000) == 0xF0000000; const Table& table = is_unconditional ? tables.unconditional : tables.conditional; 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>>(*iter) : std::nullopt; } } // namespace Dynarmic::A32