Add Generator shortcuts for some JVM instructions.
authorIlya V. Portnov <i.portnov@compassplus.ru>
Fri, 30 Sep 2011 10:30:28 +0000 (16:30 +0600)
committerIlya V. Portnov <i.portnov@compassplus.ru>
Fri, 30 Sep 2011 10:30:28 +0000 (16:30 +0600)
JVM/Assembler.hs
JVM/Generator/Instructions.hs [new file with mode: 0644]
TestGen.hs

index b29eae847cdeb293dacb72c96b2da62db883e248..db036dba44b9ee629b5ec9fee98d051a07dabd9f 100644 (file)
@@ -10,6 +10,7 @@ module JVM.Assembler
    Code (..),
    IMM (..),
    CMP (..),
+   atype2byte,
    encodeInstructions,
    encodeMethod,
    decodeMethod
diff --git a/JVM/Generator/Instructions.hs b/JVM/Generator/Instructions.hs
new file mode 100644 (file)
index 0000000..4a7a450
--- /dev/null
@@ -0,0 +1,162 @@
+
+module JVM.Generator.Instructions where
+
+import JVM.ClassFile
+import JVM.Assembler
+import JVM.Generator
+
+nop = i0 NOP
+aconst_null = i0 ACONST_NULL
+iconst_m1 = i0 ICONST_M1
+iconst_0 = i0 ICONST_0
+iconst_1 = i0 ICONST_1
+iconst_2 = i0 ICONST_2
+iconst_3 = i0 ICONST_3
+iconst_4 = i0 ICONST_4
+iconst_5 = i0 ICONST_5
+lconst_0 = i0 LCONST_0
+lconst_1 = i0 LCONST_1
+fconst_0 = i0 FCONST_0
+fconst_1 = i0 FCONST_1
+fconst_2 = i0 FCONST_2
+dconst_0 = i0 DCONST_0
+dconst_1 = i0 DCONST_1
+
+bipush x = i0 (BIPUSH x)
+sipush x = i0 (SIPUSH x)
+ldc1 x = i8 LDC1 x
+ldc2 x = i1 LDC2 x
+ldc2w x = i1 LDC2W x
+iload x = i8 ILOAD x
+lload x = i8 LLOAD x
+fload x = i8 FLOAD x
+dload x = i8 DLOAD x
+aload x = i8 ALOAD x
+
+iload_ x = i0 (ILOAD_ x)
+lload_ x = i0 (LLOAD_ x)
+fload_ x = i0 (FLOAD_ x)
+dload_ x = i0 (DLOAD_ x)
+aload_ x = i0 (ALOAD_ x)
+
+iaload = i0 IALOAD
+laload = i0 LALOAD
+faload = i0 FALOAD
+daload = i0 DALOAD
+aaload = i0 AALOAD
+caload = i0 CALOAD
+saload = i0 SALOAD
+
+istore x = i8 ISTORE x
+lstore x = i8 LSTORE x
+fstore x = i8 FSTORE x
+dstore x = i8 DSTORE x
+astore x = i8 ASTORE x
+
+istore_ x = i0 (ISTORE x)
+lstore_ x = i0 (LSTORE x)
+fstore_ x = i0 (FSTORE x)
+dstore_ x = i0 (DSTORE x)
+astore_ x = i0 (ASTORE x)
+
+iastore = i0 IASTORE
+lastore = i0 LASTORE
+fastore = i0 FASTORE
+dastore = i0 DASTORE
+aastore = i0 AASTORE
+bastore = i0 BASTORE
+castore = i0 CASTORE
+sastore = i0 SASTORE
+
+pop     = i0 POP    
+pop2    = i0 POP2   
+dup     = i0 DUP    
+dup_x1  = i0 DUP_X1 
+dup_x2  = i0 DUP_X2 
+dup2    = i0 DUP2   
+dup2_x1 = i0 DUP2_X1
+dup2_x2 = i0 DUP2_X2
+swap    = i0 SWAP   
+iadd    = i0 IADD   
+ladd    = i0 LADD   
+fadd    = i0 FADD   
+dadd    = i0 DADD   
+isub    = i0 ISUB   
+lsub    = i0 LSUB   
+fsub    = i0 FSUB   
+dsub    = i0 DSUB   
+imul    = i0 IMUL   
+lmul    = i0 LMUL   
+fmul    = i0 FMUL   
+dmul    = i0 DMUL   
+idiv    = i0 IDIV   
+ldiv    = i0 LDIV   
+fdiv    = i0 FDIV   
+ddiv    = i0 DDIV   
+irem    = i0 IREM   
+lrem    = i0 LREM   
+frem    = i0 FREM   
+drem    = i0 DREM   
+ineg    = i0 INEG   
+lneg    = i0 LNEG   
+fneg    = i0 FNEG   
+dneg    = i0 DNEG   
+ishl    = i0 ISHL   
+lshl    = i0 LSHL   
+ishr    = i0 ISHR   
+lshr    = i0 LSHR   
+iushr   = i0 IUSHR  
+lushr   = i0 LUSHR  
+iand    = i0 IAND   
+land    = i0 LAND   
+ior     = i0 IOR    
+lor     = i0 LOR    
+ixor    = i0 IXOR   
+lxor    = i0 LXOR   
+
+iinc x y = i0 (IINC x y)
+
+i2l  = i0 I2L 
+i2f  = i0 I2F 
+i2d  = i0 I2D 
+l2i  = i0 L2I 
+l2f  = i0 L2F 
+l2d  = i0 L2D 
+f2i  = i0 F2I 
+f2l  = i0 F2L 
+f2d  = i0 F2D 
+d2i  = i0 D2I 
+d2l  = i0 D2L 
+d2f  = i0 D2F 
+i2b  = i0 I2B 
+i2c  = i0 I2C 
+i2s  = i0 I2S 
+lcmp = i0 LCMP
+
+new cls =
+  i1 NEW (CClass cls)
+
+newArray t =
+  i0 (NEWARRAY $ atype2byte t)
+
+allocNewArray cls =
+  i1 ANEWARRAY (CClass cls)
+
+invokeVirtual cls sig =
+  i1 INVOKEVIRTUAL (CMethod cls sig)
+
+invokeStatic cls sig =
+  i1 INVOKESTATIC (CMethod cls sig)
+
+invokeSpecial cls sig =
+  i1 INVOKESPECIAL (CMethod cls sig)
+
+getStaticField cls sig =
+  i1 GETSTATIC (CField cls sig)
+
+loadString str =
+  i8 LDC1 (CString str)
+
+allocArray cls =
+  i1 ANEWARRAY (CClass cls)
+
index 14c91f8c95df9f0456638b8bad77ae5ca9504e82..c0635252852c296604dfecb364ccefd5a3a7d7a2 100644 (file)
@@ -7,7 +7,7 @@ import JVM.ClassFile
 import JVM.Converter
 import JVM.Assembler
 import JVM.Generator
-import JVM.Dump
+import JVM.Generator.Instructions
 
 initNT :: NameType Method
 initNT = NameType "<init>" $ MethodSignature [] ReturnsVoid
@@ -31,30 +31,30 @@ printfNT = NameType "printf" $ MethodSignature [ObjectType "java/lang/String",
 test :: Generate ()
 test = do
   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
-      i0 $ ALOAD_ I0
-      i1 INVOKESPECIAL (CMethod "java/lang/Object" initNT)
+      aload_ I0
+      invokeSpecial "java/lang/Object" initNT
       i0 RETURN
 
   newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing $ ObjectType "java/lang/String"] ReturnsVoid $ do
-      i0 ICONST_5
-      i1 INVOKESTATIC (CMethod "Test" helloNT)
+      iconst_5
+      invokeStatic "Test" helloNT
       i0 RETURN
 
   newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
-      i1 GETSTATIC (CField "java/lang/System" outNT)
-      i8 LDC1 (CString "Здравствуй, мир!")
-      i1 INVOKEVIRTUAL (CMethod "java/io/PrintStream" printlnNT)
-      i1 GETSTATIC (CField "java/lang/System" outNT)
-      i8 LDC1 (CString "Argument: %d\n")
-      i0 ICONST_1
-      i1 ANEWARRAY (CClass "java/lang/Object")
-      i0 DUP
-      i0 ICONST_0
-      i0 (ILOAD_ I0)
-      i1 INVOKESTATIC (CMethod "java/lang/Integer" valueOfNT)
-      i0 AASTORE
-      i1 INVOKEVIRTUAL (CMethod "java/io/PrintStream" printfNT)
-      i0 POP
+      getStaticField "java/lang/System" outNT
+      loadString "Здравствуй, мир!"
+      invokeVirtual "java/io/PrintStream" printlnNT
+      getStaticField "java/lang/System" outNT
+      loadString "Argument: %d\n"
+      iconst_1
+      allocArray "java/lang/Object"
+      dup
+      iconst_0
+      iload_ I0
+      invokeStatic "java/lang/Integer" valueOfNT
+      aastore
+      invokeVirtual "java/io/PrintStream" printfNT
+      pop
       i0 RETURN
 
 testClass = generate "Test" test