--- /dev/null
+
+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)
+
import JVM.Converter
import JVM.Assembler
import JVM.Generator
-import JVM.Dump
+import JVM.Generator.Instructions
initNT :: NameType Method
initNT = NameType "<init>" $ MethodSignature [] ReturnsVoid
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