dynarmic/src/frontend/ir/value.cpp

130 lines
3.2 KiB
C++
Raw Normal View History

/* 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.
*/
#include "common/assert.h"
#include "frontend/ir/microinstruction.h"
#include "frontend/ir/value.h"
namespace Dynarmic {
namespace IR {
Value::Value(Inst* value) : type(Type::Opaque) {
inner.inst = value;
}
Value::Value(A32::Reg value) : type(Type::A32Reg) {
2018-01-01 15:23:56 +00:00
inner.imm_a32regref = value;
}
Value::Value(A32::ExtReg value) : type(Type::A32ExtReg) {
2018-01-01 15:23:56 +00:00
inner.imm_a32extregref = value;
}
Value::Value(bool value) : type(Type::U1) {
inner.imm_u1 = value;
}
Value::Value(u8 value) : type(Type::U8) {
inner.imm_u8 = value;
}
2017-01-29 22:58:11 +00:00
Value::Value(u16 value) : type(Type::U16) {
inner.imm_u16 = value;
}
Value::Value(u32 value) : type(Type::U32) {
inner.imm_u32 = value;
}
Value::Value(u64 value) : type(Type::U64) {
inner.imm_u64 = value;
}
2016-12-31 10:46:13 +00:00
Value::Value(std::array<u8, 8> value) : type(Type::CoprocInfo) {
inner.imm_coproc = value;
}
bool Value::IsImmediate() const {
if (type == Type::Opaque)
return inner.inst->GetOpcode() == Opcode::Identity ? inner.inst->GetArg(0).IsImmediate() : false;
return true;
}
bool Value::IsEmpty() const {
return type == Type::Void;
}
Type Value::GetType() const {
if (type == Type::Opaque) {
if (inner.inst->GetOpcode() == Opcode::Identity) {
return inner.inst->GetArg(0).GetType();
} else {
return inner.inst->GetType();
}
}
return type;
}
2018-01-01 15:23:56 +00:00
A32::Reg Value::GetA32RegRef() const {
ASSERT(type == Type::A32Reg);
2018-01-01 15:23:56 +00:00
return inner.imm_a32regref;
}
2018-01-01 15:23:56 +00:00
A32::ExtReg Value::GetA32ExtRegRef() const {
ASSERT(type == Type::A32ExtReg);
2018-01-01 15:23:56 +00:00
return inner.imm_a32extregref;
}
Inst* Value::GetInst() const {
2017-02-26 23:27:41 +00:00
ASSERT(type == Type::Opaque);
return inner.inst;
}
bool Value::GetU1() const {
if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity)
return inner.inst->GetArg(0).GetU1();
2017-02-26 23:27:41 +00:00
ASSERT(type == Type::U1);
return inner.imm_u1;
}
u8 Value::GetU8() const {
if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity)
return inner.inst->GetArg(0).GetU8();
2017-02-26 23:27:41 +00:00
ASSERT(type == Type::U8);
return inner.imm_u8;
}
2017-01-29 22:58:11 +00:00
u16 Value::GetU16() const {
if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity)
return inner.inst->GetArg(0).GetU16();
2017-02-26 23:27:41 +00:00
ASSERT(type == Type::U16);
2017-01-29 22:58:11 +00:00
return inner.imm_u16;
}
u32 Value::GetU32() const {
if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity)
return inner.inst->GetArg(0).GetU32();
2017-02-26 23:27:41 +00:00
ASSERT(type == Type::U32);
return inner.imm_u32;
}
u64 Value::GetU64() const {
if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity)
return inner.inst->GetArg(0).GetU64();
2017-02-26 23:27:41 +00:00
ASSERT(type == Type::U64);
return inner.imm_u64;
}
2016-12-31 10:46:13 +00:00
std::array<u8, 8> Value::GetCoprocInfo() const {
if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity)
return inner.inst->GetArg(0).GetCoprocInfo();
2017-02-26 23:27:41 +00:00
ASSERT(type == Type::CoprocInfo);
2016-12-31 10:46:13 +00:00
return inner.imm_coproc;
}
} // namespace IR
} // namespace Dynarmic