more features
[nestedvm.git] / src / org / ibex / nestedvm / ClassFileCompiler.java
index 451ece7..2dec150 100644 (file)
@@ -7,6 +7,7 @@ import org.ibex.nestedvm.util.*;
 
 import org.apache.bcel.generic.*;
 
+// FEATURE: Use IINC where possible
 // FEATURE: Use BCEL to do peephole optimization
 // FEATURE: Special mode to support single-precision only - regs are floats not ints
 
@@ -265,8 +266,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());
@@ -476,7 +478,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
     private InstructionHandle realStart;
     private MethodGen curMethod;
     
-    private boolean jumpable(int addr) { return jumpableAddresses.contains(new Integer(addr)); }
+    private boolean jumpable(int addr) { return jumpableAddresses.get(new Integer(addr)) != null; }
     
     private void emitText(int addr, DataInputStream dis, int size) throws Exn,IOException {
         if(textDone) throw new Exn("Multiple text segments");
@@ -569,7 +571,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
             pushConst(firstAddrOfNext);
             setPC();
             // mark the start of the next method as jumpable
-            jumpableAddresses.add(new Integer(firstAddrOfNext));
+            jumpableAddresses.put(new Integer(firstAddrOfNext),Boolean.TRUE);
         }
         
         insnList.move(returnHandle,insnList.getEnd());
@@ -647,7 +649,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
         //System.err.println("Delay slot is jumpable - This code is untested + " + toHex(nextInsn));
         if(pc+4==endOfMethod) {
             // the delay slot is at the start of the next method
-            jumpableAddresses.add(new Integer(pc+8)); // make the 2nd insn of the next method jumpable
+            jumpableAddresses.put(new Integer(pc+8),Boolean.TRUE); // make the 2nd insn of the next method jumpable
             branch(pc,pc+8); // jump over it
             //System.err.println("delay slot: " + toHex(pc+8));
             unreachable = true;
@@ -767,7 +769,9 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
                 pushRegZ(R+A1);
                 pushRegZ(R+A2);
                 pushRegZ(R+A3);
-                a(fac.createInvoke(fullClassName,"syscall",Type.INT,new Type[]{Type.INT,Type.INT,Type.INT,Type.INT,Type.INT},INVOKEVIRTUAL));
+                pushRegZ(R+T0);
+                pushRegZ(R+T1);
+                a(fac.createInvoke(fullClassName,"syscall",Type.INT,new Type[]{Type.INT,Type.INT,Type.INT,Type.INT,Type.INT,Type.INT,Type.INT},INVOKEVIRTUAL));
                 setReg();
                 
                 a(InstructionConstants.ALOAD_0);
@@ -1261,13 +1265,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const
                     
                     b1 = a(InstructionFactory.createBranchInstruction(IFGT,null));
                     a(d ? InstructionConstants.DCONST_0 : InstructionConstants.FCONST_0);
-                    if(d) {
-                        a(InstructionConstants.DUP2_X2);
-                        a(InstructionConstants.POP2);
-                    } else {
-                        a(InstructionConstants.POP);
-                    }
-                    a(InstructionConstants.DSUB);
+                    a(d ? InstructionConstants.DSUB : InstructionConstants.FSUB);
                     
                     b1.setTarget(setDouble(d));