From 16704d16f8e156bed9ff846c7fddee113f0f4057 Mon Sep 17 00:00:00 2001 From: "Ilya V. Portnov" Date: Fri, 30 Sep 2011 16:30:28 +0600 Subject: [PATCH] Add Generator shortcuts for some JVM instructions. --- JVM/Assembler.hs | 1 + JVM/Generator/Instructions.hs | 162 ++++++++++++++++++++++++++++++++++ TestGen.hs | 38 ++++---- 3 files changed, 182 insertions(+), 19 deletions(-) create mode 100644 JVM/Generator/Instructions.hs diff --git a/JVM/Assembler.hs b/JVM/Assembler.hs index b29eae8..db036db 100644 --- a/JVM/Assembler.hs +++ b/JVM/Assembler.hs @@ -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 index 0000000..4a7a450 --- /dev/null +++ b/JVM/Generator/Instructions.hs @@ -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) + diff --git a/TestGen.hs b/TestGen.hs index 14c91f8..c063525 100644 --- a/TestGen.hs +++ b/TestGen.hs @@ -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 "" $ MethodSignature [] ReturnsVoid @@ -31,30 +31,30 @@ printfNT = NameType "printf" $ MethodSignature [ObjectType "java/lang/String", test :: Generate () test = do newMethod [ACC_PUBLIC] "" [] 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 -- 2.25.1