X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FInterpreter.java;h=45d433c417fe9737e458e57d663f03c950b837d1;hp=276eea7dd9d9979038740a209ea0f9b8ee2b2ecd;hb=7e1e0dc49707b777e71e69c23c0a48e0a2665a4b;hpb=034a42fa65955289442614ef9914e5474fac62aa diff --git a/src/org/ibex/nestedvm/Interpreter.java b/src/org/ibex/nestedvm/Interpreter.java index 276eea7..45d433c 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); } @@ -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; @@ -414,6 +422,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 +611,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;