dynarmic/src/frontend/ir/opcodes.cpp

68 lines
1.6 KiB
C++
Raw Normal View History

2016-08-12 19:17:31 +02:00
/* This file is part of the dynarmic project.
* Copyright (c) 2016 MerryMage
* This software may be used and distributed according to the terms of the GNU
* General Public License version 2 or any later version.
*/
2016-08-17 14:29:05 +02:00
#include <array>
2016-08-12 19:17:31 +02:00
#include <map>
2018-01-28 00:42:30 +01:00
#include <ostream>
#include <string>
2016-08-12 19:17:31 +02:00
#include <vector>
2018-01-28 00:42:30 +01:00
#include <fmt/format.h>
#include <fmt/ostream.h>
2016-08-12 19:17:31 +02:00
#include "frontend/ir/opcodes.h"
#include "frontend/ir/type.h"
2016-08-12 19:17:31 +02:00
namespace Dynarmic::IR {
2016-08-12 19:17:31 +02:00
// Opcode information
namespace OpcodeInfo {
using T = Dynarmic::IR::Type;
struct Meta {
const char* name;
Type type;
std::vector<Type> arg_types;
};
static const std::map<Opcode, Meta> opcode_info {{
#define OPCODE(name, type, ...) { Opcode::name, { #name, type, { __VA_ARGS__ } } },
2018-01-01 17:19:43 +01:00
#define A32OPC(name, type, ...) { Opcode::A32##name, { #name, type, { __VA_ARGS__ } } },
2018-01-07 01:11:57 +01:00
#define A64OPC(name, type, ...) { Opcode::A64##name, { #name, type, { __VA_ARGS__ } } },
2016-08-12 19:17:31 +02:00
#include "opcodes.inc"
#undef OPCODE
2018-01-01 17:19:43 +01:00
#undef A32OPC
2018-01-07 01:11:57 +01:00
#undef A64OPC
2016-12-31 11:46:13 +01:00
}};
2016-08-12 19:17:31 +02:00
} // namespace OpcodeInfo
Type GetTypeOf(Opcode op) {
return OpcodeInfo::opcode_info.at(op).type;
}
size_t GetNumArgsOf(Opcode op) {
return OpcodeInfo::opcode_info.at(op).arg_types.size();
}
Type GetArgTypeOf(Opcode op, size_t arg_index) {
return OpcodeInfo::opcode_info.at(op).arg_types.at(arg_index);
}
2018-01-28 00:42:30 +01:00
std::string GetNameOf(Opcode op) {
if (OpcodeInfo::opcode_info.count(op) == 0)
return fmt::format("Unknown Opcode {}", static_cast<Opcode>(op));
2016-08-12 19:17:31 +02:00
return OpcodeInfo::opcode_info.at(op).name;
}
2018-01-28 00:42:30 +01:00
std::ostream& operator<<(std::ostream& o, Opcode opcode) {
return o << GetNameOf(opcode);
}
} // namespace Dynarmic::IR