mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Implement SHR.
This commit is contained in:
parent
e38fe7dffc
commit
f1779e6067
@ -1217,6 +1217,27 @@ inline void sar(IntT &destination, uint8_t count, Status &status) {
|
|||||||
status.set_from<IntT, Flag::Sign, Flag::Zero, Flag::ParityOdd>(destination);
|
status.set_from<IntT, Flag::Sign, Flag::Zero, Flag::ParityOdd>(destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename IntT>
|
||||||
|
inline void shr(IntT &destination, uint8_t count, Status &status) {
|
||||||
|
if(!count) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
status.set_from<Flag::Overflow>(Numeric::top_bit<IntT>() & destination);
|
||||||
|
if(count == Numeric::bit_size<IntT>()) {
|
||||||
|
status.set_from<Flag::Carry>(Numeric::top_bit<IntT>() & destination);
|
||||||
|
destination = 0;
|
||||||
|
} else if(count > Numeric::bit_size<IntT>()) {
|
||||||
|
status.set_from<Flag::Carry>(0);
|
||||||
|
destination = 0;
|
||||||
|
} else {
|
||||||
|
const IntT mask = 1 << (count - 1);
|
||||||
|
status.set_from<Flag::Carry>(destination & mask);
|
||||||
|
destination >>= count;
|
||||||
|
}
|
||||||
|
status.set_from<IntT, Flag::Sign, Flag::Zero, Flag::ParityOdd>(destination);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <
|
template <
|
||||||
@ -1384,6 +1405,7 @@ template <
|
|||||||
case Operation::ROR: Primitive::ror(destination(), shift_count(), status); break;
|
case Operation::ROR: Primitive::ror(destination(), shift_count(), status); break;
|
||||||
case Operation::SAL: Primitive::sal(destination(), shift_count(), status); break;
|
case Operation::SAL: Primitive::sal(destination(), shift_count(), status); break;
|
||||||
case Operation::SAR: Primitive::sar(destination(), shift_count(), status); break;
|
case Operation::SAR: Primitive::sar(destination(), shift_count(), status); break;
|
||||||
|
case Operation::SHR: Primitive::shr(destination(), shift_count(), status); break;
|
||||||
|
|
||||||
case Operation::CLC: Primitive::clc(status); return;
|
case Operation::CLC: Primitive::clc(status); return;
|
||||||
case Operation::CLD: Primitive::cld(status); return;
|
case Operation::CLD: Primitive::cld(status); return;
|
||||||
|
@ -265,7 +265,8 @@ struct ExecutionSupport {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct FailedExecution {
|
struct FailedExecution {
|
||||||
std::string file, test_name;
|
std::string test_name;
|
||||||
|
std::string reason;
|
||||||
InstructionSet::x86::Instruction<false> instruction;
|
InstructionSet::x86::Instruction<false> instruction;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -417,7 +418,6 @@ struct FailedExecution {
|
|||||||
@"90.json.gz",
|
@"90.json.gz",
|
||||||
|
|
||||||
// TODO: POP, POPF, PUSH, PUSHF
|
// TODO: POP, POPF, PUSH, PUSHF
|
||||||
// TODO: SAL, SAR, SHR
|
|
||||||
|
|
||||||
// RCL
|
// RCL
|
||||||
@"D0.2.json.gz", @"D2.2.json.gz",
|
@"D0.2.json.gz", @"D2.2.json.gz",
|
||||||
@ -441,8 +441,12 @@ struct FailedExecution {
|
|||||||
// @"D1.4.json.gz", @"D3.4.json.gz",
|
// @"D1.4.json.gz", @"D3.4.json.gz",
|
||||||
|
|
||||||
// SAR
|
// SAR
|
||||||
@"D0.7.json.gz", @"D2.7.json.gz",
|
// @"D0.7.json.gz", @"D2.7.json.gz",
|
||||||
@"D1.7.json.gz", @"D3.7.json.gz",
|
// @"D1.7.json.gz", @"D3.7.json.gz",
|
||||||
|
|
||||||
|
// SHR
|
||||||
|
@"D0.5.json.gz", @"D2.5.json.gz",
|
||||||
|
@"D1.5.json.gz", @"D3.5.json.gz",
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@"F8.json.gz", // CLC
|
@"F8.json.gz", // CLC
|
||||||
@ -694,36 +698,24 @@ struct FailedExecution {
|
|||||||
if(!statusEqual || !registersEqual || !ramEqual) {
|
if(!statusEqual || !registersEqual || !ramEqual) {
|
||||||
FailedExecution failure;
|
FailedExecution failure;
|
||||||
failure.instruction = decoded.second;
|
failure.instruction = decoded.second;
|
||||||
// failure.file = // TODO
|
|
||||||
failure.test_name = std::string([test[@"name"] UTF8String]);
|
failure.test_name = std::string([test[@"name"] UTF8String]);
|
||||||
|
|
||||||
|
NSMutableArray<NSString *> *reasons = [[NSMutableArray alloc] init];
|
||||||
|
if(!statusEqual) {
|
||||||
|
[reasons addObject:
|
||||||
|
[NSString stringWithFormat:@"status differs by %04x",
|
||||||
|
(intended_status.get() ^ execution_support.status.get()) & flags_mask]];
|
||||||
|
}
|
||||||
|
if(!registersEqual) {
|
||||||
|
[reasons addObject:@"registers don't match"];
|
||||||
|
}
|
||||||
|
if(!ramEqual) {
|
||||||
|
[reasons addObject:@"RAM contents don't match"];
|
||||||
|
}
|
||||||
|
|
||||||
|
failure.reason = std::string([reasons componentsJoinedByString:@"; "].UTF8String);
|
||||||
execution_failures.push_back(std::move(failure));
|
execution_failures.push_back(std::move(failure));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if(assert) {
|
|
||||||
XCTAssert(
|
|
||||||
statusEqual,
|
|
||||||
"Status doesn't match despite mask %04x — differs in %04x after %@; executing %@",
|
|
||||||
flags_mask,
|
|
||||||
(intended_status.get() ^ execution_support.status.get()) & flags_mask,
|
|
||||||
test[@"name"],
|
|
||||||
[self toString:decoded.second offsetLength:4 immediateLength:4]
|
|
||||||
);
|
|
||||||
// TODO: should probably say more about the following two.
|
|
||||||
XCTAssert(
|
|
||||||
registersEqual,
|
|
||||||
"Register mismatch after %@; executing %@",
|
|
||||||
test[@"name"],
|
|
||||||
[self toString:decoded.second offsetLength:4 immediateLength:4]
|
|
||||||
);
|
|
||||||
XCTAssert(
|
|
||||||
ramEqual,
|
|
||||||
"Memory contents mismatch after %@; executing %@",
|
|
||||||
test[@"name"],
|
|
||||||
[self toString:decoded.second offsetLength:4 immediateLength:4]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return statusEqual && registersEqual && ramEqual;*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)printFailures:(NSArray<NSString *> *)failures {
|
- (void)printFailures:(NSArray<NSString *> *)failures {
|
||||||
@ -775,7 +767,7 @@ struct FailedExecution {
|
|||||||
XCTAssertEqual(execution_failures.size(), 0);
|
XCTAssertEqual(execution_failures.size(), 0);
|
||||||
|
|
||||||
for(const auto &failure: execution_failures) {
|
for(const auto &failure: execution_failures) {
|
||||||
NSLog(@"Failed %s", failure.test_name.c_str());
|
NSLog(@"Failed %s — %s", failure.test_name.c_str(), failure.reason.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user