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:
parent
71e137715d
commit
2188765e28
3 changed files with 46 additions and 44 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue