diff --git a/InstructionSets/PowerPC/Instruction.hpp b/InstructionSets/PowerPC/Instruction.hpp index fd6c50a78..9cbf907f7 100644 --- a/InstructionSets/PowerPC/Instruction.hpp +++ b/InstructionSets/PowerPC/Instruction.hpp @@ -151,7 +151,15 @@ enum class Operation: uint8_t { fnabsx, fnegx, fnmaddx, fnmaddsx, fnmsubx, fnmsubsx, frspx, fsubx, fsubsx, icbi, isync, lbz, lbzu, lbzux, lbzx, lfd, lfdu, lfdux, lfdx, lfs, lfsu, lfsux, lfsx, lha, lhau, lhaux, lhax, lhbrx, lhz, lhzu, lhzux, lhzx, lmw, - lswi, lswx, lwarx, lwbrx, lwz, lwzu, lwzux, + lswi, lswx, lwarx, lwbrx, lwz, lwzu, + + /// Load word and zero with Update Indexed. + /// + /// rD() = [ rA()|0 + rB() ]; and rA() is set to the calculated address. + /// + /// PowerPC defines rA=0 and rA=rD to be invalid forms; the MPC601 + /// will suppress the update if rA=0 or rA=rD. + lwzux, /// Load word and zero indexed. /// diff --git a/OSBindings/Mac/Clock SignalTests/DingusdevPowerPCTests.mm b/OSBindings/Mac/Clock SignalTests/DingusdevPowerPCTests.mm index 2d1b6f79b..eceb73f53 100644 --- a/OSBindings/Mac/Clock SignalTests/DingusdevPowerPCTests.mm +++ b/OSBindings/Mac/Clock SignalTests/DingusdevPowerPCTests.mm @@ -19,6 +19,15 @@ using namespace InstructionSet::PowerPC; @implementation DingusdevPowerPCTests +- (void)testABDInstruction:(Instruction)instruction columns:(NSArray *)columns testZero:(BOOL)testZero { + NSString *const rA = (instruction.rA() || !testZero) ? [NSString stringWithFormat:@"r%d", instruction.rA()] : @"0"; + NSString *const rB = [NSString stringWithFormat:@"r%d", instruction.rB()]; + NSString *const rD = [NSString stringWithFormat:@"r%d", instruction.rD()]; + XCTAssertEqualObjects(rD, columns[3]); + XCTAssertEqualObjects(rA, columns[4]); + XCTAssertEqualObjects(rB, columns[5]); +} + - (void)testDecoding { NSData *const testData = [NSData dataWithContentsOfURL: @@ -53,15 +62,15 @@ using namespace InstructionSet::PowerPC; NSAssert(FALSE, @"Didn't handle %@", line); break; - case Operation::lwzx: { + case Operation::lwzux: + XCTAssertEqualObjects(operation, @"lwzux"); + [self testABDInstruction:instruction columns:columns testZero:YES]; + break; + + case Operation::lwzx: XCTAssertEqualObjects(operation, @"lwzx"); - NSString *const rA = instruction.rA() ? [NSString stringWithFormat:@"r%d", instruction.rA()] : @"0"; - NSString *const rB = [NSString stringWithFormat:@"r%d", instruction.rB()]; - NSString *const rD = [NSString stringWithFormat:@"r%d", instruction.rD()]; - XCTAssertEqualObjects(rD, columns[3]); - XCTAssertEqualObjects(rA, columns[4]); - XCTAssertEqualObjects(rB, columns[5]); - } break; + [self testABDInstruction:instruction columns:columns testZero:YES]; + break; case Operation::bcx: case Operation::bclrx: