tests/arm/exec: test conditions

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2023-09-24 17:38:11 +05:30
parent 5fcc75bc9a
commit 6e56828dfd

View File

@@ -13,7 +13,6 @@ class CpuFixture {
std::vector<uint8_t>(Header::HEADER_SIZE)))) {} std::vector<uint8_t>(Header::HEADER_SIZE)))) {}
protected: protected:
// TODO: test with other conditions
void exec(arm::InstructionData data, Condition condition = Condition::AL) { void exec(arm::InstructionData data, Condition condition = Condition::AL) {
arm::Instruction instruction(condition, data); arm::Instruction instruction(condition, data);
cpu.exec_arm(instruction); cpu.exec_arm(instruction);
@@ -804,29 +803,41 @@ TEST_CASE_METHOD(CpuFixture, "Data Processing", TAG) {
processing->rn = 7; processing->rn = 7;
} }
auto flags = [this](bool n, bool z, bool v, bool c) { auto reset_flags = [this]() {
CHECK(cpu.cpsr.n() == n);
CHECK(cpu.cpsr.z() == z);
CHECK(cpu.cpsr.v() == v);
CHECK(cpu.cpsr.c() == c);
cpu.cpsr.set_n(false); cpu.cpsr.set_n(false);
cpu.cpsr.set_z(false); cpu.cpsr.set_z(false);
cpu.cpsr.set_v(false); cpu.cpsr.set_v(false);
cpu.cpsr.set_c(false); cpu.cpsr.set_c(false);
}; };
auto flags = [this, reset_flags](bool n, bool z, bool v, bool c) {
CHECK(cpu.cpsr.n() == n);
CHECK(cpu.cpsr.z() == z);
CHECK(cpu.cpsr.v() == v);
CHECK(cpu.cpsr.c() == c);
reset_flags();
};
// immediate operand // immediate operand
processing->operand = static_cast<uint32_t>(54924809); processing->operand = static_cast<uint32_t>(54924809);
// rs // rs
cpu.gpr[12] = 2; cpu.gpr[12] = 2;
cpu.gpr[5] = 0; cpu.gpr[5] = 0;
reset_flags();
SECTION("AND") { SECTION("AND (with condition check)") {
processing->opcode = OpCode::AND; processing->opcode = OpCode::AND;
exec(data); cpu.cpsr.set_z(false);
exec(data, Condition::EQ);
// condition is false
CHECK(cpu.gpr[5] == 0);
cpu.cpsr.set_z(true);
exec(data, Condition::EQ);
// -28717 & 54924809 // -28717 & 54924809
// condition is true now
CHECK(cpu.gpr[5] == 54920705); CHECK(cpu.gpr[5] == 54920705);
// check set flags // check set flags
@@ -846,11 +857,19 @@ TEST_CASE_METHOD(CpuFixture, "Data Processing", TAG) {
flags(false, false, false, false); flags(false, false, false, false);
} }
SECTION("EOR") { SECTION("EOR (with condition check)") {
processing->opcode = OpCode::EOR; processing->opcode = OpCode::EOR;
exec(data); cpu.cpsr.set_c(true);
exec(data, Condition::CC);
// condition fails
CHECK(cpu.gpr[5] == 0);
cpu.cpsr.set_c(false);
exec(data, Condition::CC);
// -28717 ^ 54924809 // -28717 ^ 54924809
// condition is true now
CHECK(cpu.gpr[5] == 4240021978); CHECK(cpu.gpr[5] == 4240021978);
// check set flags // check set flags