@@ -38,21 +38,22 @@ struct TestCase {
3838 uint64_t value;
3939 };
4040
41- struct FlagsState {
41+ struct FlagsStatus {
4242 Flag flag;
43- FlagState state;
43+ FlagState state = UNKNOWN; // to catch bugs
4444 };
4545
4646 std::string name;
4747
4848 // Inputs
4949 std::vector<uint8_t > instruction_bytes;
5050 std::vector<RegisterState> initial_registers;
51- std::vector<FlagsState > initial_flags;
51+ std::vector<FlagsStatus > initial_flags;
5252
5353 // Expected outputs
5454 std::vector<RegisterState> expected_registers;
55- std::vector<FlagsState> expected_flags;
55+ std::vector<FlagsStatus> expected_flags;
56+ bool couldBeUndefined = true ;
5657};
5758
5859class Tester {
@@ -73,6 +74,19 @@ class Tester {
7374 testCases.emplace_back (fn);
7475 }
7576
77+ std::vector<TestCase::FlagsStatus> parseFlagStates (uint64_t flagint) {
78+ std::vector<TestCase::FlagsStatus> result;
79+ result.resize (FLAGS_END);
80+
81+ for (size_t i = 0 ; i < FLAGS_END; i++) {
82+ bool isSet = (flagint >> i) & 1 ;
83+ result[i] = TestCase::FlagsStatus{
84+ .flag = (Flag)i, .state = isSet ? FlagState::SET : FlagState::CLEAR};
85+ }
86+
87+ return result;
88+ }
89+
7690 bool execute_test_case (const TestCase& tc) {
7791
7892 bool isSuccessfull = true ;
@@ -92,7 +106,8 @@ class Tester {
92106 // Verify registers
93107 for (const auto & expected : tc.expected_registers ) {
94108 // registers usually shouldn't be undefined
95- if (!isRegisterEqualTo (expected.reg , expected.value , false )) {
109+ if (!isRegisterEqualTo (expected.reg , expected.value ,
110+ tc.couldBeUndefined )) {
96111
97112 failureDetails << " Incorrect register:" << " \n Register: "
98113 << ZydisRegisterGetString (expected.reg )
@@ -110,13 +125,21 @@ class Tester {
110125 }
111126 }
112127
128+ const auto flagcompare = [](FlagState original, FlagState compare,
129+ bool couldBeUndefined = true ) {
130+ if (couldBeUndefined && original == FlagState::UNDEF)
131+ return true ;
132+ return original == compare;
133+ };
134+
113135 for (const auto & flag : tc.expected_flags ) {
114136 FlagState flagState = getFlagState (flag.flag );
115- if (flagState != flag.state ) {
137+ if (!flagcompare (flagState, flag.state , tc.couldBeUndefined )) {
138+
116139 failureDetails << " Incorrect flag:" //
117- << " \n Flag: " << flag.flag
118- << " \n Expected: " << flag.state
119- << " \n Actual: " << flagState;
140+ << " \n Flag: " << flag.flag << " ( " << ( int )flag. flag
141+ << " ) " << " \n Expected: " << flag.state
142+ << " \n Actual: " << flagState << " \n " ;
120143
121144 isSuccessfull = false ;
122145 }
0 commit comments