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;
}
}
+ 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 {
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);
}
int tmp, addr; // temporaries
r[ZERO] = 0;
-
+
switch(op) {
case 0: {
switch(subcode) {
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
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;
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;
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;
}
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;