verify problem in lookupSymbol
[nestedvm.git] / src / org / ibex / nestedvm / ClassFileCompiler.java
index bcd069e..f0b9153 100644 (file)
@@ -150,14 +150,14 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
         a(InstructionConstants.IUSHR);
         
         int beg = text.addr >>> methodShift;
-        int end = ((text.addr + text.size) >>> methodShift);
+        int end = ((text.addr + text.size + maxBytesPerMethod - 1) >>> methodShift);
 
         // This data is redundant but BCEL wants it
-        int[] matches = new int[end-beg+1];
-        for(int i=beg;i<=end;i++)  matches[i-beg] = i;
+        int[] matches = new int[end-beg];
+        for(int i=beg;i<end;i++)  matches[i-beg] = i;
         TABLESWITCH ts = new TABLESWITCH(matches,new InstructionHandle[matches.length],null);
         a(ts);
-        for(int n=beg;n<=end;n++){
+        for(int n=beg;n<end;n++){
             InstructionHandle h = a(fac.createInvoke(fullClassName,"run_"+toHex(n<<methodShift),Type.VOID,Type.NO_ARGS,INVOKESPECIAL));
             a(InstructionFactory.createBranchInstruction(GOTO,start));
             ts.setTarget(n-beg,h);
@@ -265,8 +265,9 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
             a(fac.createCheckCast(new ObjectType("java.lang.Integer")));
             a(fac.createInvoke("java.lang.Integer","intValue",Type.INT,Type.NO_ARGS,INVOKEVIRTUAL));
             a(InstructionConstants.IRETURN);
-            bh.setTarget(a(InstructionConstants.ICONST_M1));
-            a(InstructionConstants.IRETURN);     
+            bh.setTarget(a(InstructionConstants.POP));
+            a(InstructionConstants.ICONST_M1);
+            a(InstructionConstants.IRETURN);
             lookupSymbol.setMaxLocals();
             lookupSymbol.setMaxStack();
             cl.addMethod(lookupSymbol.getMethod());
@@ -1231,10 +1232,10 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
                     break;
                 case 1: // SUB.X
                     preSetDouble(F+fd,d);
-                    pushDouble(F+ft,d);
                     pushDouble(F+fs,d);
+                    pushDouble(F+ft,d);
                     a(d ? InstructionConstants.DSUB : InstructionConstants.FSUB);
-                    setDouble(d);                    
+                    setDouble(d);
                     break;
                 case 2: // MUL.X
                     preSetDouble(F+fd,d);
@@ -1277,26 +1278,28 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
                     pushReg(F+fs);
                     setReg();
                     
-                    preSetReg(F+fd+1);
-                    pushReg(F+fs+1);
-                    setReg();
+                    if(d) {
+                        preSetReg(F+fd+1);
+                        pushReg(F+fs+1);
+                        setReg();
+                    }
                     
                     break;
                 case 7: // NEG.X
                     preSetDouble(F+fd,d);
                     pushDouble(F+fs,d);
                     a(d ? InstructionConstants.DNEG : InstructionConstants.FNEG);
-                    setDouble(d);                    
+                    setDouble(d);
                     break;
                 case 32: // CVT.S.X
                     preSetFloat(F+fd);
-                    pushDouble(F+fd,d);
+                    pushDouble(F+fs,d);
                     if(d) a(InstructionConstants.D2F);
                     setFloat();
                     break;
                 case 33: // CVT.D.X
                     preSetDouble(F+fd);
-                    pushDouble(F+fd,d);
+                    pushDouble(F+fs,d);
                     if(!d) a(InstructionConstants.F2D);
                     setDouble();
                     break;
@@ -1356,7 +1359,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
                         case 62: b1 = a(InstructionFactory.createBranchInstruction(IFLE,null)); break;
                         default: b1 = null;
                     }
-                    
+                    // FIXME: We probably don't need to pushConst(0x00000)
                     pushConst(0x000000);
                     b2 = a(InstructionFactory.createBranchInstruction(GOTO,null));
                     b1.setTarget(pushConst(0x800000));