dynarmic/src/frontend/ir/opcodes.h

84 lines
2 KiB
C
Raw Normal View History

2016-07-01 14:01:06 +01: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.
*/
#pragma once
2018-01-27 23:42:30 +00:00
#include <iosfwd>
#include <string>
2016-07-01 14:01:06 +01:00
#include "common/common_types.h"
namespace Dynarmic::IR {
2016-07-01 14:01:06 +01:00
2016-08-12 18:17:31 +01:00
/**
* The Opcodes of our intermediate representation.
* Type signatures for each opcode can be found in opcodes.inc
*/
2016-07-01 14:01:06 +01:00
enum class Opcode {
#define OPCODE(name, type, ...) name,
2018-01-01 16:19:43 +00:00
#define A32OPC(name, type, ...) A32##name,
2018-01-07 00:11:57 +00:00
#define A64OPC(name, type, ...) A64##name,
2016-07-01 14:01:06 +01:00
#include "opcodes.inc"
#undef OPCODE
2018-01-01 16:19:43 +00:00
#undef A32OPC
2018-01-07 00:11:57 +00:00
#undef A64OPC
2016-07-01 14:01:06 +01:00
NUM_OPCODE
};
constexpr size_t OpcodeCount = static_cast<size_t>(Opcode::NUM_OPCODE);
2016-08-12 18:17:31 +01:00
/**
* The intermediate representation is typed. These are the used by our IR.
*/
enum class Type {
2018-01-05 21:47:23 +00:00
Void = 0,
A32Reg = 1 << 0,
A32ExtReg = 1 << 1,
A64Reg = 1 << 2,
A64Vec = 1 << 3,
Opaque = 1 << 4,
U1 = 1 << 5,
U8 = 1 << 6,
U16 = 1 << 7,
U32 = 1 << 8,
U64 = 1 << 9,
U128 = 1 << 10,
CoprocInfo = 1 << 11,
NZCVFlags = 1 << 12,
Cond = 1 << 13,
2016-08-12 18:17:31 +01:00
};
2018-01-05 21:47:23 +00:00
constexpr Type operator|(Type a, Type b) {
return static_cast<Type>(static_cast<size_t>(a) | static_cast<size_t>(b));
}
constexpr Type operator&(Type a, Type b) {
return static_cast<Type>(static_cast<size_t>(a) & static_cast<size_t>(b));
}
2016-08-12 18:17:31 +01:00
/// Get return type of an opcode
Type GetTypeOf(Opcode op);
/// Get the number of arguments an opcode accepts
size_t GetNumArgsOf(Opcode op);
/// Get the required type of an argument of an opcode
Type GetArgTypeOf(Opcode op, size_t arg_index);
/// Get the name of an opcode.
2018-01-27 23:42:30 +00:00
std::string GetNameOf(Opcode op);
2016-08-12 18:17:31 +01:00
2016-08-17 13:29:05 +01:00
/// Get the name of a type.
2018-01-27 23:42:30 +00:00
std::string GetNameOf(Type type);
2016-08-17 13:29:05 +01:00
/// @returns true if t1 and t2 are compatible types
bool AreTypesCompatible(Type t1, Type t2);
2018-01-27 23:42:30 +00:00
std::ostream& operator<<(std::ostream& o, Opcode opcode);
std::ostream& operator<<(std::ostream& o, Type type);
} // namespace Dynarmic::IR