void testCache() { Cache cache(2, 3); TESTEQ(cache.checkHit(0x00000001), false); TESTEQ(cache.checkHit(0x00000001), true); TESTEQ(cache.checkHit(0x00000011), false); TESTEQ(cache.checkHit(0x00000011), true); TESTEQ(cache.checkHit(0x12345678), false); }
void cacheTest() { Cache cache(2,3); //initialize cache bool r; //result boolean r = cache.checkHit(0x00000000); TESTEQ(r,false); r = cache.checkHit(0x00000000); TESTEQ(r,true); r = cache.checkHit(0x12345678); TESTEQ(r,false); r = cache.checkHit(0x10101010); TESTEQ(r,false); r = cache.checkHit(0x01010101); TESTEQ(r,false); r = cache.checkHit(0x10101010); TESTEQ(r,true); r = cache.checkHit(0x01010101); TESTEQ(r,true); r = cache.checkHit(0x01010101); TESTEQ(r,true); r = cache.checkHit(0x12345678); TESTEQ(r,true); return; }
void instructionExecTest() { M.initCache(0, 4, 0, 4); M.write32(0x3210dcba, 0x10010000); pc = 0x00400000; // basic ALU tests Instruction(0x34070010).exec(); TESTEQ(reg[7], 0x10); // ori $7, $0, 0x10 Instruction(0x3408000c).exec(); TESTEQ(reg[8], 0xc); // ori $8, $0, 0xc Instruction(0x3409000a).exec(); TESTEQ(reg[9], 0xa); // ori $9, $0, 0xa Instruction(0x340a0001).exec(); TESTEQ(reg[10], 1); // ori $10, $0, 1 Instruction(0x340b0002).exec(); TESTEQ(reg[11], 2); // ori $11, $0, 2 Instruction(0x3c0cffff).exec(); TESTEQ(reg[12], 0xffff0000); // lui $12, 0xffff Instruction(0x358cfffe).exec(); TESTEQ(reg[12], -2); // ori $12, $12, 0xfffe Instruction(0x340d0004).exec(); TESTEQ(reg[13], 4); // ori $13, $0, 4 Instruction(0x3c0eabcd).exec(); TESTEQ(reg[14], 0xabcd0000); // lui $14, 0xabcd Instruction(0x35ce1234).exec(); TESTEQ(reg[14], 0xabcd1234); // ori $14, $14, 0x1234 Instruction(0x000c7c00).exec(); TESTEQ(reg[15], 0xfffe0000); // sll $15, $12, 16 Instruction(0x000c7c02).exec(); TESTEQ(reg[15], 0xffff); // srl $15, $12, 16 Instruction(0x000e7c03).exec(); TESTEQ(reg[15], 0xffffabcd); // sra $15, $14, 16 Instruction(0x01ae7804).exec(); TESTEQ(reg[15], 0xbcd12340); // sllv $15, $14, $13 Instruction(0x01ae7806).exec(); TESTEQ(reg[15], 0x0abcd123); // srlv $15, $14, $13 Instruction(0x01ae7807).exec(); TESTEQ(reg[15], 0xfabcd123); // srav $15, $14, $13 Instruction(0x01097824).exec(); TESTEQ(reg[15], 0x8); // and $15, $8, $9 Instruction(0x01097825).exec(); TESTEQ(reg[15], 0xe); // or $15, $8, $9 Instruction(0x01097826).exec(); TESTEQ(reg[15], 0x6); // xor $15, $8, $9 Instruction(0x01097827).exec(); TESTEQ(reg[15], 0xfffffff1); // nor $15, $8, $9 Instruction(0x318fa0b0).exec(); TESTEQ(reg[15], 0xa0b0); // andi $15, $12, 0xa0b0 Instruction(0x354f1000).exec(); TESTEQ(reg[15], 0x1001); // ori $15, $10, 0x1000 Instruction(0x390ffffa).exec(); TESTEQ(reg[15], 0xfff6); // xori $15, $8, 0xfffa Instruction(0x014b7820).exec(); TESTEQ(reg[15], 3); // add $15, $10, $11 Instruction(0x014c7820).exec(); TESTEQ(reg[15], 0xffffffff); // add $15, $10, $12 Instruction(0x016c7820).exec(); TESTEQ(reg[15], 0); // add $15, $11, $12 Instruction(0x014b7822).exec(); TESTEQ(reg[15], 0xffffffff); // sub $15, $10, $11 Instruction(0x014c7822).exec(); TESTEQ(reg[15], 3); // sub $15, $10, $12 Instruction(0x014b7821).exec(); TESTEQ(reg[15], 3); // addu $15, $10, $11 Instruction(0x014c7821).exec(); TESTEQ(reg[15], 0xffffffff); // addu $15, $10, $12 Instruction(0x016c7821).exec(); TESTEQ(reg[15], 0); // addu $15, $11, $12 Instruction(0x014b7823).exec(); TESTEQ(reg[15], 0xffffffff); // subu $15, $10, $11 Instruction(0x014c7823).exec(); TESTEQ(reg[15], 3); // subu $15, $10, $12 Instruction(0x214ffffe).exec(); TESTEQ(reg[15], -1); // addi $15, $10, -2 Instruction(0x254ffffe).exec(); TESTEQ(reg[15], -1); // addiu $15, $10, -2 Instruction(0x018b782a).exec(); TESTEQ(reg[15], 1); // slt $15, $12, $11 Instruction(0x018b782b).exec(); TESTEQ(reg[15], 0); // sltu $15, $12, $11 Instruction(0x298fffff).exec(); TESTEQ(reg[15], 1); // slti $15, $12, -1 Instruction(0x2d4fffff).exec(); TESTEQ(reg[15], 1); // sltiu $15, $10, -1 // multiplication and division Instruction(0x00ec0018).exec(); // mult $7, $12 TESTEQ(hi, 0xffffffff); TESTEQ(lo, 0xffffffe0); Instruction(0x00ec0019).exec(); // multu $7, $12 TESTEQ(hi, 0xf); TESTEQ(lo, 0xffffffe0); Instruction(0x012c0018).exec(); // mult $9, $12 TESTEQ(hi, 0xffffffff); TESTEQ(lo, 0xffffffec); Instruction(0x012c0019).exec(); // multu $9, $12 TESTEQ(hi, 0x9); TESTEQ(lo, 0xffffffec); Instruction(0x018c0018).exec(); // mult $12, $12 TESTEQ(hi, 0); TESTEQ(lo, 4); Instruction(0x018c0019).exec(); // multu $12, $12 TESTEQ(hi, 0xfffffffc); TESTEQ(lo, 4); Instruction(0x012c001a).exec(); // div $9, $12 TESTEQ(hi, 0); TESTEQ(lo, 0xfffffffb); Instruction(0x012c001b).exec(); // divu $9, $12 TESTEQ(hi, 0xa); TESTEQ(lo, 0); Instruction(0x0189001a).exec(); // div $12, $9 TESTEQ(hi, 0xfffffffe); TESTEQ(lo, 0); Instruction(0x0189001b).exec(); // divu $12, $9 TESTEQ(hi, 4); TESTEQ(lo, 0x19999999); Instruction(0x01000013).exec(); // mtlo $8 TESTEQ(lo, 0xc); Instruction(0x01200011).exec(); // mthi $9 TESTEQ(hi, 0xa); Instruction(0x00007812).exec(); // mflo $15 TESTEQ(reg[15], 0xc); Instruction(0x00007810).exec(); // mfhi $15 TESTEQ(reg[15], 0xa); // load and store Instruction(0x3c081001).exec(); TESTEQ(reg[8] , 0x10010000); // lui $8, 0x1001 Instruction(0x8d0f0000).exec(); TESTEQ(reg[15], 0x3210dcba); // lw $15, 0($8) Instruction(0x850f0000).exec(); TESTEQ(reg[15], 0xffffdcba); // lh $15, 0($8) Instruction(0x950f0000).exec(); TESTEQ(reg[15], 0xdcba); // lhu $15, 0($8) Instruction(0x810f0000).exec(); TESTEQ(reg[15], 0xffffffba); // lb $15, 0($8) Instruction(0x910f0000).exec(); TESTEQ(reg[15], 0xba); // lbu $15, 0($8) Instruction(0x3c09deca).exec(); TESTEQ(reg[9] , 0xdeca0000); // lui $9, 0xdeca Instruction(0x3529fbad).exec(); TESTEQ(reg[9] , 0xdecafbad); // ori $9, $9, 0xfbad Instruction(0xad090004).exec(); TESTEQ(M.read32(0x10010004), 0xdecafbad); // sw $9, 4($8) Instruction(0x8d0f0004).exec(); TESTEQ(reg[15], 0xdecafbad); // lw $15, 4($8) Instruction(0x34090012).exec(); TESTEQ(reg[9] , 0x12); // ori $9, $0, 0x12 Instruction(0xa1090007).exec(); TESTEQ(M.read8(0x10010007), 0x12); // sb $9, 7($8) Instruction(0x8d0f0004).exec(); TESTEQ(reg[15], 0x12cafbad); // lw $15, 4($8) Instruction(0x34097654).exec(); TESTEQ(reg[9] , 0x7654); // ori $9, $0, 0x7654 Instruction(0xa5090004).exec(); TESTEQ(M.read16(0x10010004), 0x7654); // sh $9, 4($8) Instruction(0x8d0f0004).exec(); TESTEQ(reg[15], 0x12ca7654); // lw $15, 4($8) // branches and jumps pc = 0x00400000; Instruction(0x10000003).exec(); TESTEQ(pc, 0x0040000c); // beq $0, $0, 12 Instruction(0x14000005).exec(); TESTEQ(pc, 0x00400010); // bne $0, $0, 20 Instruction(0x1d600004).exec(); TESTEQ(pc, 0x00400020); // bgtz $11, L4 Instruction(0x04010004).exec(); TESTEQ(pc, 0x00400030); // bgez $0, L5 Instruction(0x05800004).exec(); TESTEQ(pc, 0x00400040); // bltz $12, L6 Instruction(0x18000004).exec(); TESTEQ(pc, 0x00400050); // blez $0, L7 Instruction(0x08100042).exec(); TESTEQ(pc, 0x00400108); // j 0x00400108 Instruction(0x0c100048).exec(); TESTEQ(pc, 0x00400120); // jal 0x00400120 Instruction(0x03e00008).exec(); TESTEQ(pc, 0x0040010c); // jr $31 reg[15] = 0x00400000; Instruction(0x01e0f809).exec(); TESTEQ(pc, 0x00400000); // jalr $15 Instruction(0x03e00008).exec(); TESTEQ(pc, 0x00400110); // jr $31 }