ir/value: Use type alias CoprocessorInfo for std::array<u8, 8>

Provides a more descriptive label for the interface, and avoids the need
to hardcode the array size in multiple places.
This commit is contained in:
Lioncash 2018-08-13 15:35:36 -04:00 committed by MerryMage
parent 71e137715d
commit 2188765e28
3 changed files with 46 additions and 44 deletions

View file

@ -251,75 +251,75 @@ IR::U32 IREmitter::ExclusiveWriteMemory64(const IR::U32& vaddr, const IR::U32& v
void IREmitter::CoprocInternalOperation(size_t coproc_no, bool two, size_t opc1, CoprocReg CRd, CoprocReg CRn, CoprocReg CRm, size_t opc2) { void IREmitter::CoprocInternalOperation(size_t coproc_no, bool two, size_t opc1, CoprocReg CRd, CoprocReg CRn, CoprocReg CRm, size_t opc2) {
ASSERT(coproc_no <= 15); ASSERT(coproc_no <= 15);
std::array<u8, 8> coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc1), static_cast<u8>(opc1),
static_cast<u8>(CRd), static_cast<u8>(CRd),
static_cast<u8>(CRn), static_cast<u8>(CRn),
static_cast<u8>(CRm), static_cast<u8>(CRm),
static_cast<u8>(opc2)}; static_cast<u8>(opc2)};
Inst(Opcode::A32CoprocInternalOperation, IR::Value(coproc_info)); Inst(Opcode::A32CoprocInternalOperation, IR::Value(coproc_info));
} }
void IREmitter::CoprocSendOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2, const IR::U32& word) { void IREmitter::CoprocSendOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2, const IR::U32& word) {
ASSERT(coproc_no <= 15); ASSERT(coproc_no <= 15);
std::array<u8, 8> coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc1), static_cast<u8>(opc1),
static_cast<u8>(CRn), static_cast<u8>(CRn),
static_cast<u8>(CRm), static_cast<u8>(CRm),
static_cast<u8>(opc2)}; static_cast<u8>(opc2)};
Inst(Opcode::A32CoprocSendOneWord, IR::Value(coproc_info), word); Inst(Opcode::A32CoprocSendOneWord, IR::Value(coproc_info), word);
} }
void IREmitter::CoprocSendTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm, const IR::U32& word1, const IR::U32& word2) { void IREmitter::CoprocSendTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm, const IR::U32& word1, const IR::U32& word2) {
ASSERT(coproc_no <= 15); ASSERT(coproc_no <= 15);
std::array<u8, 8> coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc), static_cast<u8>(opc),
static_cast<u8>(CRm)}; static_cast<u8>(CRm)};
Inst(Opcode::A32CoprocSendTwoWords, IR::Value(coproc_info), word1, word2); Inst(Opcode::A32CoprocSendTwoWords, IR::Value(coproc_info), word1, word2);
} }
IR::U32 IREmitter::CoprocGetOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2) { IR::U32 IREmitter::CoprocGetOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2) {
ASSERT(coproc_no <= 15); ASSERT(coproc_no <= 15);
std::array<u8, 8> coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc1), static_cast<u8>(opc1),
static_cast<u8>(CRn), static_cast<u8>(CRn),
static_cast<u8>(CRm), static_cast<u8>(CRm),
static_cast<u8>(opc2)}; static_cast<u8>(opc2)};
return Inst<IR::U32>(Opcode::A32CoprocGetOneWord, IR::Value(coproc_info)); return Inst<IR::U32>(Opcode::A32CoprocGetOneWord, IR::Value(coproc_info));
} }
IR::U64 IREmitter::CoprocGetTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm) { IR::U64 IREmitter::CoprocGetTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm) {
ASSERT(coproc_no <= 15); ASSERT(coproc_no <= 15);
std::array<u8, 8> coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc), static_cast<u8>(opc),
static_cast<u8>(CRm)}; static_cast<u8>(CRm)};
return Inst<IR::U64>(Opcode::A32CoprocGetTwoWords, IR::Value(coproc_info)); return Inst<IR::U64>(Opcode::A32CoprocGetTwoWords, IR::Value(coproc_info));
} }
void IREmitter::CoprocLoadWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) { void IREmitter::CoprocLoadWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) {
ASSERT(coproc_no <= 15); ASSERT(coproc_no <= 15);
std::array<u8, 8> coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(long_transfer ? 1 : 0), static_cast<u8>(long_transfer ? 1 : 0),
static_cast<u8>(CRd), static_cast<u8>(CRd),
static_cast<u8>(has_option ? 1 : 0), static_cast<u8>(has_option ? 1 : 0),
static_cast<u8>(option)}; static_cast<u8>(option)};
Inst(Opcode::A32CoprocLoadWords, IR::Value(coproc_info), address); Inst(Opcode::A32CoprocLoadWords, IR::Value(coproc_info), address);
} }
void IREmitter::CoprocStoreWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) { void IREmitter::CoprocStoreWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) {
ASSERT(coproc_no <= 15); ASSERT(coproc_no <= 15);
std::array<u8, 8> coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(long_transfer ? 1 : 0), static_cast<u8>(long_transfer ? 1 : 0),
static_cast<u8>(CRd), static_cast<u8>(CRd),
static_cast<u8>(has_option ? 1 : 0), static_cast<u8>(has_option ? 1 : 0),
static_cast<u8>(option)}; static_cast<u8>(option)};
Inst(Opcode::A32CoprocStoreWords, IR::Value(coproc_info), address); Inst(Opcode::A32CoprocStoreWords, IR::Value(coproc_info), address);
} }

View file

@ -52,7 +52,7 @@ Value::Value(u64 value) : type(Type::U64) {
inner.imm_u64 = value; inner.imm_u64 = value;
} }
Value::Value(std::array<u8, 8> value) : type(Type::CoprocInfo) { Value::Value(CoprocessorInfo value) : type(Type::CoprocInfo) {
inner.imm_coproc = value; inner.imm_coproc = value;
} }
@ -141,7 +141,7 @@ u64 Value::GetU64() const {
return inner.imm_u64; return inner.imm_u64;
} }
std::array<u8, 8> Value::GetCoprocInfo() const { Value::CoprocessorInfo Value::GetCoprocInfo() const {
if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity) if (type == Type::Opaque && inner.inst->GetOpcode() == Opcode::Identity)
return inner.inst->GetArg(0).GetCoprocInfo(); return inner.inst->GetArg(0).GetCoprocInfo();
ASSERT(type == Type::CoprocInfo); ASSERT(type == Type::CoprocInfo);

View file

@ -25,6 +25,8 @@ class Inst;
*/ */
class Value { class Value {
public: public:
using CoprocessorInfo = std::array<u8, 8>;
Value() : type(Type::Void) {} Value() : type(Type::Void) {}
explicit Value(Inst* value); explicit Value(Inst* value);
explicit Value(A32::Reg value); explicit Value(A32::Reg value);
@ -36,7 +38,7 @@ public:
explicit Value(u16 value); explicit Value(u16 value);
explicit Value(u32 value); explicit Value(u32 value);
explicit Value(u64 value); explicit Value(u64 value);
explicit Value(std::array<u8, 8> value); explicit Value(CoprocessorInfo value);
explicit Value(Cond value); explicit Value(Cond value);
bool IsEmpty() const; bool IsEmpty() const;
@ -53,7 +55,7 @@ public:
u16 GetU16() const; u16 GetU16() const;
u32 GetU32() const; u32 GetU32() const;
u64 GetU64() const; u64 GetU64() const;
std::array<u8, 8> GetCoprocInfo() const; CoprocessorInfo GetCoprocInfo() const;
Cond GetCond() const; Cond GetCond() const;
private: private:
@ -70,7 +72,7 @@ private:
u16 imm_u16; u16 imm_u16;
u32 imm_u32; u32 imm_u32;
u64 imm_u64; u64 imm_u64;
std::array<u8, 8> imm_coproc; CoprocessorInfo imm_coproc;
Cond imm_cond; Cond imm_cond;
} inner; } inner;
}; };