mirror of
https://github.com/TomHarte/CLK.git
synced 2025-01-26 15:32:04 +00:00
Make further test-set allowances.
This commit is contained in:
parent
e9e1db7a05
commit
0b42f5fb30
@ -65,10 +65,16 @@ struct Memory {
|
||||
struct MemoryLedger {
|
||||
template <typename IntT>
|
||||
bool write(uint32_t address, IntT source, Mode, bool) {
|
||||
if constexpr (std::is_same_v<IntT, uint32_t>) {
|
||||
address &= static_cast<uint32_t>(~3);
|
||||
}
|
||||
if(write_pointer == writes.size() || writes[write_pointer].size != sizeof(IntT) || writes[write_pointer].address != address || writes[write_pointer].value != source) {
|
||||
const auto is_faulty = [&](uint32_t address) -> bool {
|
||||
return
|
||||
write_pointer == writes.size() ||
|
||||
writes[write_pointer].size != sizeof(IntT) ||
|
||||
writes[write_pointer].address != address ||
|
||||
writes[write_pointer].value != source;
|
||||
};
|
||||
|
||||
// The test set sometimes worries about write alignment, sometimes not...
|
||||
if(is_faulty(address) && is_faulty(address & static_cast<uint32_t>(~3))) {
|
||||
return false;
|
||||
}
|
||||
++write_pointer;
|
||||
@ -370,6 +376,35 @@ struct MemoryLedger {
|
||||
input >> regs[c];
|
||||
}
|
||||
|
||||
uint32_t r15_mask = 0xffff'ffff;
|
||||
switch(instruction) {
|
||||
case 0x03110002:
|
||||
// tsteq r1, #2; per my reading this is LSL#0 so the original
|
||||
// carry value should be preserved. The test set doesn't seem
|
||||
// to agree. Until I can reconcile them, don't test carry.
|
||||
r15_mask &= ~ConditionCode::Carry;
|
||||
break;
|
||||
|
||||
case 0x11800215:
|
||||
// orrne r0, r0, r5, lsl r2
|
||||
// The test set applies the rule 'lsl r2 % 32' whereas the data
|
||||
// sheet specifically says for a shift-by-register that
|
||||
// "LSL by more than 32 has result zero, carry out zero" so I think
|
||||
// the test set is adrift on the following:
|
||||
if(test_count == 15) continue;
|
||||
break;
|
||||
|
||||
case 0xe090e00f:
|
||||
// adds lr, r0, pc
|
||||
// The test set comes from an ARM that doesn't multiplex flags
|
||||
// and the PC.
|
||||
r15_mask = 0;
|
||||
regs[15] &= 0x03ff'fffc;
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
if(!test) test = std::make_unique<Exec>();
|
||||
auto ®isters = test->registers();
|
||||
if(label == "Before:") {
|
||||
@ -384,16 +419,8 @@ struct MemoryLedger {
|
||||
// Execute test and compare.
|
||||
++test_count;
|
||||
|
||||
uint32_t r15_mask = 0xffff'ffff;
|
||||
switch(instruction) {
|
||||
case 0x03110002:
|
||||
// tsteq r1, #2; per my reading this is LSL#0 so the original
|
||||
// carry value should be preserved. The test set doesn't seem
|
||||
// to agree. Until I can reconcile them, don't test carry.
|
||||
r15_mask &= ~ConditionCode::Carry;
|
||||
break;
|
||||
|
||||
default: break;
|
||||
if(instruction == 0xe4931000 && test_count == 3) {
|
||||
printf("");
|
||||
}
|
||||
|
||||
execute(instruction, *test);
|
||||
@ -408,7 +435,7 @@ struct MemoryLedger {
|
||||
if((regs[15] & r15_mask) != (registers.pc_status(8) & r15_mask)) {
|
||||
if(!error) error = [[NSMutableString alloc] init]; else [error appendString:@"; "];
|
||||
[error appendFormat:@"; PC/PSR %08x/%08x v %08x/%08x",
|
||||
regs[15] & 0x3fffffc, regs[15] & ~0x3fffffc,
|
||||
regs[15] & 0x03ff'fffc, regs[15] & ~0x03ff'fffc,
|
||||
registers.pc(8), registers.status()];
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user