interpreter fixes
[nestedvm.git] / src / org / ibex / nestedvm / Interpreter.java
index c840312..45d433c 100644 (file)
@@ -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;