/* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD */ #include #include #include #include #include #include #include "frontend/ir/opcodes.h" #include "frontend/ir/type.h" namespace Dynarmic::IR { // Opcode information namespace OpcodeInfo { struct Meta { const char* name; Type type; std::vector arg_types; }; constexpr Type Void = Type::Void; constexpr Type A32Reg = Type::A32Reg; constexpr Type A32ExtReg = Type::A32ExtReg; constexpr Type A64Reg = Type::A64Reg; constexpr Type A64Vec = Type::A64Vec; constexpr Type Opaque = Type::Opaque; constexpr Type U1 = Type::U1; constexpr Type U8 = Type::U8; constexpr Type U16 = Type::U16; constexpr Type U32 = Type::U32; constexpr Type U64 = Type::U64; constexpr Type U128 = Type::U128; constexpr Type CoprocInfo = Type::CoprocInfo; constexpr Type NZCV = Type::NZCVFlags; constexpr Type Cond = Type::Cond; constexpr Type Table = Type::Table; static const std::array opcode_info { #define OPCODE(name, type, ...) Meta{#name, type, {__VA_ARGS__}}, #define A32OPC(name, type, ...) Meta{#name, type, {__VA_ARGS__}}, #define A64OPC(name, type, ...) Meta{#name, type, {__VA_ARGS__}}, #include "opcodes.inc" #undef OPCODE #undef A32OPC #undef A64OPC }; } // namespace OpcodeInfo Type GetTypeOf(Opcode op) { return OpcodeInfo::opcode_info.at(static_cast(op)).type; } size_t GetNumArgsOf(Opcode op) { return OpcodeInfo::opcode_info.at(static_cast(op)).arg_types.size(); } Type GetArgTypeOf(Opcode op, size_t arg_index) { return OpcodeInfo::opcode_info.at(static_cast(op)).arg_types.at(arg_index); } std::string GetNameOf(Opcode op) { return OpcodeInfo::opcode_info.at(static_cast(op)).name; } std::ostream& operator<<(std::ostream& o, Opcode opcode) { return o << GetNameOf(opcode); } } // namespace Dynarmic::IR