X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FInterpreter.java;h=df9a11114545a24b1be7fa8f82337cca9451af88;hb=efc2be846f690aee919c3172737faca7e26950a5;hp=276eea7dd9d9979038740a209ea0f9b8ee2b2ecd;hpb=034a42fa65955289442614ef9914e5474fac62aa;p=nestedvm.git diff --git a/src/org/ibex/nestedvm/Interpreter.java b/src/org/ibex/nestedvm/Interpreter.java index 276eea7..df9a111 100644 --- a/src/org/ibex/nestedvm/Interpreter.java +++ b/src/org/ibex/nestedvm/Interpreter.java @@ -7,7 +7,7 @@ package org.ibex.nestedvm; import org.ibex.nestedvm.util.*; import java.io.*; -public class Interpreter extends UnixRuntime { +public class Interpreter extends UnixRuntime implements Cloneable { // Registers private int[] registers = new int[32]; private int hi,lo; @@ -51,6 +51,13 @@ public class Interpreter extends UnixRuntime { } } + protected Object clone() throws CloneNotSupportedException { + Interpreter r = (Interpreter) super.clone(); + r.registers = (int[]) registers.clone(); + r.fpregs = (int[]) fpregs.clone(); + return r; + } + // Main interpretor // the return value is meaningless, its just to catch people typing "return" by accident private final int runSome() throws FaultException,ExecutionException { @@ -65,6 +72,7 @@ public class Interpreter extends UnixRuntime { try { insn = readPages[pc>>>pageShift][(pc>>>2)&PAGE_WORDS-1]; } catch (RuntimeException e) { + if(pc == 0xdeadbeef) throw new Error("fell off cpu: r2: " + r[2]); insn = memRead(pc); } @@ -86,7 +94,7 @@ public class Interpreter extends UnixRuntime { int tmp, addr; // temporaries r[ZERO] = 0; - + switch(op) { case 0: { switch(subcode) { @@ -117,7 +125,7 @@ public class Interpreter extends UnixRuntime { continue OUTER; case 12: // SYSCALL this.pc = pc; - r[V0] = syscall(r[V0],r[A0],r[A1],r[A2],r[A3]); + r[V0] = syscall(r[V0],r[A0],r[A1],r[A2],r[A3],r[T0],r[T1]); if(state != RUNNING) { this.pc = nextPC; break OUTER; } break; case 13: // BREAK @@ -135,7 +143,7 @@ public class Interpreter extends UnixRuntime { lo = r[rs]; break; case 24: { // MULT - long hilo = (long)(r[rs]) * ((long)r[rt]); + long hilo = ((long)r[rs]) * ((long)r[rt]); hi = (int) (hilo >>> 32); lo = (int) hilo; break; @@ -270,7 +278,7 @@ public class Interpreter extends UnixRuntime { r[rt] = r[rs] < signedImmediate ? 1 : 0; break; case 11: // SLTIU - r[rt] = (r[rs]&0xffffffffL) < (unsignedImmediate&0xffffffffL) ? 1 : 0; + r[rt] = (r[rs]&0xffffffffL) < (signedImmediate&0xffffffffL) ? 1 : 0; break; case 12: // ANDI r[rt] = r[rs] & unsignedImmediate; @@ -355,6 +363,9 @@ public class Interpreter extends UnixRuntime { case 60: // C.LT.S setFC(getFloat(fs) < getFloat(ft)); break; + case 62: // C.LE.S + setFC(getFloat(fs) <= getFloat(ft)); + break; default: throw new ExecutionException("Invalid Instruction 17/" + rs + "/" + subcode + " at " + sourceLine(pc)); } break; @@ -414,6 +425,9 @@ public class Interpreter extends UnixRuntime { } case 20: { // Integer switch(subcode) { + case 32: // CVT.S.W + setFloat(fd,f[fs]); + break; case 33: // CVT.D.W setDouble(fd,f[fs]); break; @@ -600,14 +614,14 @@ public class Interpreter extends UnixRuntime { memWrite(addr&~3,tmp); break; } - // FEATURE: Needs to be atomic w/ threads + // Needs to be atomic w/ threads case 48: // LWC0/LL r[rt] = memRead(r[rs] + signedImmediate); break; case 49: // LWC1 f[rt] = memRead(r[rs] + signedImmediate); break; - // FEATURE: Needs to be atomic w/ threads + // Needs to be atomic w/ threads case 56: memWrite(r[rs] + signedImmediate,r[rt]); r[rt] = 1;