Commit 6d47705a authored by George Hotz's avatar George Hotz

mult is wrong

parent 599f965a
...@@ -74,13 +74,14 @@ contract MIPS { ...@@ -74,13 +74,14 @@ contract MIPS {
// R-type or I-type (stores rt) // R-type or I-type (stores rt)
rs = m.ReadMemory(stateHash, REG_OFFSET + ((insn >> 19) & 0x7C)); rs = m.ReadMemory(stateHash, REG_OFFSET + ((insn >> 19) & 0x7C));
storeAddr = REG_OFFSET + ((insn >> 14) & 0x7C); storeAddr = REG_OFFSET + ((insn >> 14) & 0x7C);
if (opcode == 0) { if (opcode == 0 || opcode == 0x1c) {
// R-type (stores rd) // R-type (stores rd)
rt = m.ReadMemory(stateHash, REG_OFFSET + ((insn >> 14) & 0x7C)); rt = m.ReadMemory(stateHash, REG_OFFSET + ((insn >> 14) & 0x7C));
storeAddr = REG_OFFSET + ((insn >> 9) & 0x7C); storeAddr = REG_OFFSET + ((insn >> 9) & 0x7C);
} else if (opcode < 0x20) { } else if (opcode < 0x20) {
// rt is SignExtImm // rt is SignExtImm
if (opcode == 0xC || opcode == 0xD) { // don't sign extend for andi, ori, xori
if (opcode == 0xC || opcode == 0xD || opcode == 0xe) {
// ZeroExtImm // ZeroExtImm
rt = insn&0xFFFF; rt = insn&0xFFFF;
} else { } else {
...@@ -134,12 +135,26 @@ contract MIPS { ...@@ -134,12 +135,26 @@ contract MIPS {
val = execute(insn, rs, rt, mem); val = execute(insn, rs, rt, mem);
} }
// mflo/mthi // mflo/mthi and mult / multu
if (opcode == 0) { if (opcode == 0) {
if (func == 0x10) val = m.ReadMemory(stateHash, REG_HI); // mfhi if (func == 0x10) val = m.ReadMemory(stateHash, REG_HI); // mfhi
else if (func == 0x11) storeAddr = REG_HI; // mthi else if (func == 0x11) storeAddr = REG_HI; // mthi
else if (func == 0x12) val = m.ReadMemory(stateHash, REG_LO); // mflo else if (func == 0x12) val = m.ReadMemory(stateHash, REG_LO); // mflo
else if (func == 0x13) storeAddr = REG_LO; // mtlo else if (func == 0x13) storeAddr = REG_LO; // mtlo
uint64 acc;
if (func == 0x18) { // mult
acc = uint64(int64(rs)*int64(rt));
} else if (func == 0x19) { // multu
acc = uint64(uint64(rs)*uint64(rt));
}
// lo/hi writeback
if (func == 0x18 || func == 0x19) {
stateHash = m.WriteMemory(stateHash, REG_HI, uint32(acc>>32));
val = uint32(acc);
storeAddr = REG_LO;
}
} }
if (shouldBranch) { if (shouldBranch) {
...@@ -199,6 +214,9 @@ contract MIPS { ...@@ -199,6 +214,9 @@ contract MIPS {
} else if (func == 0x2B) { } else if (func == 0x2B) {
return rs<rt ? 1 : 0; // sltu return rs<rt ? 1 : 0; // sltu
} }
} else if (opcode == 0xf) { return rt<<16; // lui
} else if (opcode == 0x1c) { // SPECIAL2
if (func == 2) return uint32(int32(rs)*int32(rt)); // mul
} else if (opcode == 0x20) { // lb } else if (opcode == 0x20) { // lb
return SE((mem >> (24-(rs&3)*8)) & 0xFF, 8); return SE((mem >> (24-(rs&3)*8)) & 0xFF, 8);
} else if (opcode == 0x21) { // lh } else if (opcode == 0x21) { // lh
...@@ -222,7 +240,6 @@ contract MIPS { ...@@ -222,7 +240,6 @@ contract MIPS {
return (mem & mask) | val; return (mem & mask) | val;
} else if (opcode == 0x2b) { // sw } else if (opcode == 0x2b) { // sw
return rt; return rt;
} else if (opcode == 0xf) { return rt<<16; // lui
} }
return rs; return rs;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment