76 static inline bool InITBlock(
const TCpuAccessor &cpua) {
77 auto istate = cpua.template ReadSpecialRegister<SpecialRegisterId::kIstate>();
78 return ((istate & IstateRegister::kItBit3to0Msk) != 0b0000U);
81 static inline bool LastInITBlock(TCpuAccessor &cpua) {
82 auto istate = cpua.template ReadSpecialRegister<SpecialRegisterId::kIstate>();
83 return ((istate & IstateRegister::kItBit3to0Msk) == 0b1000U);
86 static inline void ITAdvance(TCpuAccessor &cpua) {
87 auto istate = cpua.template ReadSpecialRegister<SpecialRegisterId::kIstate>();
88 const auto istate_2_0 = istate & IstateRegister::kItBit2to0Msk;
90 if (istate_2_0 == 0x0U) {
93 const auto next_istate_4_0 =
94 ((istate & IstateRegister::kItBit4to0Msk) << 1U) & IstateRegister::kItBit4to0Msk;
95 istate = (istate & ~IstateRegister::kItBit4to0Msk) | next_istate_4_0;
98 cpua.template WriteSpecialRegister<SpecialRegisterId::kIstate>(istate);
101 static inline Result<u32> CurrentCond(
const TCpuAccessor &cpua) {
107 auto istate = cpua.template ReadSpecialRegister<SpecialRegisterId::kIstate>();
109 const auto it_3_0 = istate & IstateRegister::kItBit3to0Msk;
111 if (it_3_0 != 0x0U) {
112 const auto it_7_4 = (istate & IstateRegister::kItBit7to4Msk) >> IstateRegister::kItBit4Pos;
113 return Ok<u32>(it_7_4);
116 if (istate == 0x0U) {
117 return Ok<u32>(0xEU);
124 static inline Condition DecodeCondition(u8 cond) {
125 return static_cast<Condition
>(cond & IstateRegister::kItBit3to0Msk);
128 static std::string_view ConditionToString(u8 cond) {
129 switch (DecodeCondition(cond)) {
131 case Condition::kCondEq:
133 case Condition::kCondNe:
135 case Condition::kCondCs:
137 case Condition::kCondCc:
139 case Condition::kCondMi:
141 case Condition::kCondPl:
143 case Condition::kCondVs:
145 case Condition::kCondVc:
147 case Condition::kCondHi:
149 case Condition::kCondLs:
151 case Condition::kCondGe:
153 case Condition::kCondLt:
155 case Condition::kCondGt:
157 case Condition::kCondLe:
159 case Condition::kCondAl:
161 case Condition::kUndefined:
168 static std::string_view GetConditionAsStr(
const TCpuAccessor &cpua) {
169 const auto r_cond = CurrentCond(cpua);
170 if (r_cond.IsErr()) {
174 const auto &cond = r_cond.content;
175 return ConditionToString(cond);
178 static inline bool ConditionPassed(
const TCpuAccessor &cpua, u8 cond) {
182 auto cond_3_1 = (cond & IstateRegister::kItBit3to1Msk) >> IstateRegister::kItBit1Pos;
185 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
186 result = (apsr & ApsrRegister::kZMsk) == ApsrRegister::kZMsk;
190 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
191 result = (apsr & ApsrRegister::kCMsk) == ApsrRegister::kCMsk;
195 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
196 result = (apsr & ApsrRegister::kNMsk) == ApsrRegister::kNMsk;
200 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
201 result = (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk;
205 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
206 result = ((apsr & ApsrRegister::kCMsk) == ApsrRegister::kCMsk) &&
207 ((apsr & ApsrRegister::kZMsk) != ApsrRegister::kZMsk);
211 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
212 result = ((apsr & ApsrRegister::kNMsk) >> ApsrRegister::kNPos) ==
213 ((apsr & ApsrRegister::kVMsk) >> ApsrRegister::kVPos);
218 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
219 result = (((apsr & ApsrRegister::kNMsk) >> ApsrRegister::kNPos) ==
220 ((apsr & ApsrRegister::kVMsk) >> ApsrRegister::kVPos)) &&
221 ((apsr & ApsrRegister::kZMsk) != ApsrRegister::kZMsk);
238 if (((cond & 0x1U) == 0x1U) && (cond != 0xFU)) {
245 static inline Result<bool> ConditionPassed(
const TCpuAccessor &cpua) {
248 const auto r_cond = CurrentCond(cpua);
249 if (r_cond.IsErr()) {
250 return Err<u32, bool>(r_cond);
253 const auto &cond = r_cond.content;
255 return Ok(ConditionPassed(cpua, cond));