dynarmic/src/frontend/A32/ITState.h
2021-02-07 14:17:46 +00:00

63 lines
1.3 KiB
C++

/* This file is part of the dynarmic project.
* Copyright (c) 2019 MerryMage
* SPDX-License-Identifier: 0BSD
*/
#pragma once
#include "common/common_types.h"
#include "common/bit_util.h"
#include "frontend/ir/cond.h"
namespace Dynarmic::A32 {
class ITState final {
public:
ITState() = default;
explicit ITState(u8 data) : value(data) {}
ITState& operator=(u8 data) {
value = data;
return *this;
}
IR::Cond Cond() const {
if (value == 0b00000000) {
return IR::Cond::AL;
}
return static_cast<IR::Cond>(Common::Bits<4, 7>(value));
}
bool IsInITBlock() const {
return Common::Bits<0, 3>(value) != 0b0000;
}
bool IsLastInITBlock() const {
return Common::Bits<0, 3>(value) == 0b1000;
}
ITState Advance() const {
if (Common::Bits<0, 2>(value) == 0b000) {
return ITState{0b00000000};
}
return ITState{Common::ModifyBits<0, 4>(value, static_cast<u8>(Common::Bits<0, 4>(value) << 1))};
}
u8 Value() const {
return value;
}
private:
u8 value = 0;
};
inline bool operator==(ITState lhs, ITState rhs) {
return lhs.Value() == rhs.Value();
}
inline bool operator!=(ITState lhs, ITState rhs) {
return !operator==(lhs, rhs);
}
} // namespace Dynarmic::A32