1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-10-02 19:54:35 +00:00

Take si/di confusion and offset length off the table.

Now 74 failures of 288 tests.
This commit is contained in:
Thomas Harte 2023-09-26 13:21:24 -04:00
parent e56a5899bd
commit 4a38e6b4b5

View File

@ -38,7 +38,7 @@ std::string to_hex(int value, int digits) {
};
template <typename InstructionT>
std::string to_string(InstructionSet::x86::DataPointer pointer, const InstructionT &instruction, bool abbreviateOffset) {
std::string to_string(InstructionSet::x86::DataPointer pointer, const InstructionT &instruction, int offset_length) {
std::string operand;
using Source = InstructionSet::x86::Source;
@ -91,12 +91,21 @@ std::string to_string(InstructionSet::x86::DataPointer pointer, const Instructio
break;
}
if(addOffset) {
if(instruction.offset()) {
if(abbreviateOffset && !(instruction.offset() & 0xff00)) {
stream << '+' << to_hex(instruction.offset(), 2);
} else {
switch(offset_length) {
case 0:
if(!instruction.offset()) {
break;
}
[[fallthrough]];
case 2:
if(!(instruction.offset() & 0xff00)) {
stream << '+' << to_hex(instruction.offset(), 2);
break;
}
[[fallthrough]];
default:
stream << '+' << to_hex(instruction.offset(), 4);
}
break;
}
}
stream << ']';
@ -160,7 +169,7 @@ std::string to_string(InstructionSet::x86::DataPointer pointer, const Instructio
return [fullPaths sortedArrayUsingSelector:@selector(compare:)];
}
- (NSString *)toString:(const InstructionSet::x86::Instruction<false> &)instruction abbreviateOffset:(BOOL)abbreviateOffset {
- (NSString *)toString:(const InstructionSet::x86::Instruction<false> &)instruction offsetLength:(int)offsetLength {
// Form string version, compare.
std::string operation;
@ -177,11 +186,11 @@ std::string to_string(InstructionSet::x86::DataPointer pointer, const Instructio
const bool displacement = has_displacement(instruction.operation);
operation += " ";
if(operands > 1) {
operation += to_string(instruction.destination(), instruction, abbreviateOffset);
operation += to_string(instruction.destination(), instruction, offsetLength);
operation += ", ";
}
if(operands > 0) {
operation += to_string(instruction.source(), instruction, abbreviateOffset);
operation += to_string(instruction.source(), instruction, offsetLength);
}
if(displacement) {
operation += to_hex(instruction.displacement(), 2);
@ -222,10 +231,26 @@ std::string to_string(InstructionSet::x86::DataPointer pointer, const Instructio
// The decoder doesn't preserve the original offset length, which makes no functional difference but
// does affect the way that offsets are printed in the test set.
NSString *fullOffset = [self toString:decoded.second abbreviateOffset:NO];
NSString *shortOffset = [self toString:decoded.second abbreviateOffset:YES];
const bool isEqual = [fullOffset isEqualToString:test[@"name"]] || [shortOffset isEqualToString:test[@"name"]];
XCTAssert(isEqual, "%@ matches neither %@ nor %@, was %@ within %@", test[@"name"], fullOffset, shortOffset, hex_instruction(), file);
NSString *const fullOffset = [self toString:decoded.second offsetLength:4];
NSString *const shortOffset = [self toString:decoded.second offsetLength:2];
NSString *const noOffset = [self toString:decoded.second offsetLength:0];
auto compare_decoding = [&](NSString *name) -> bool {
return [fullOffset isEqualToString:name] || [shortOffset isEqualToString:name] || [noOffset isEqualToString:name];
};
bool isEqual = compare_decoding(test[@"name"]);
// TEMPORARY HACK: the test set incorrectly states 'bp+si' whenever it means 'bp+di'.
// Though it also uses 'bp+si' correctly when it means 'bp+si'. Until fixed, take
// a pass on potential issues there.
if(!isEqual) {
NSString *alteredName = [test[@"name"] stringByReplacingOccurrencesOfString:@"bp+si" withString:@"bp+di"];
isEqual = compare_decoding(alteredName);
}
XCTAssert(isEqual, "%@ doesn't match %@ or similar, was %@ within %@", test[@"name"], fullOffset, hex_instruction(), file);
// Repetition, to allow for easy breakpoint placement.
if(!isEqual) {