module JVM.Builder.Instructions where
import Data.Word
import qualified Data.ByteString.Lazy as B
import Codec.Binary.UTF8.String (encodeString)
import Data.String
import JVM.ClassFile
import JVM.Assembler
import JVM.Builder.Monad
nop :: Generator e g => g e ()
nop = i0 NOP
aconst_null :: Generator e g => g e ()
aconst_null = i0 ACONST_NULL
iconst_m1 :: Generator e g => g e ()
iconst_m1 = i0 ICONST_M1
iconst_0 :: Generator e g => g e ()
iconst_0 = i0 ICONST_0
iconst_1 :: Generator e g => g e ()
iconst_1 = i0 ICONST_1
iconst_2 :: Generator e g => g e ()
iconst_2 = i0 ICONST_2
iconst_3 :: Generator e g => g e ()
iconst_3 = i0 ICONST_3
iconst_4 :: Generator e g => g e ()
iconst_4 = i0 ICONST_4
iconst_5 :: Generator e g => g e ()
iconst_5 = i0 ICONST_5
lconst_0 :: Generator e g => g e ()
lconst_0 = i0 LCONST_0
lconst_1 :: Generator e g => g e ()
lconst_1 = i0 LCONST_1
fconst_0 :: Generator e g => g e ()
fconst_0 = i0 FCONST_0
fconst_1 :: Generator e g => g e ()
fconst_1 = i0 FCONST_1
fconst_2 :: Generator e g => g e ()
fconst_2 = i0 FCONST_2
dconst_0 :: Generator e g => g e ()
dconst_0 = i0 DCONST_0
dconst_1 :: Generator e g => g e ()
dconst_1 = i0 DCONST_1
bipush :: Generator e g => Word8 -> g e ()
bipush x = i0 (BIPUSH x)
sipush :: Generator e g => Word16 -> g e ()
sipush x = i0 (SIPUSH x)
ldc1 :: Generator e g => Constant Direct -> g e ()
ldc1 x = i8 LDC1 x
ldc2 :: Generator e g => Constant Direct -> g e ()
ldc2 x = i1 LDC2 x
ldc2w :: Generator e g => Constant Direct -> g e ()
ldc2w x = i1 LDC2W x
iload :: Generator e g => Constant Direct -> g e ()
iload x = i8 ILOAD x
lload :: Generator e g => Constant Direct -> g e ()
lload x = i8 LLOAD x
fload :: Generator e g => Constant Direct -> g e ()
fload x = i8 FLOAD x
dload :: Generator e g => Constant Direct -> g e ()
dload x = i8 DLOAD x
aload :: Generator e g => Constant Direct -> g e ()
aload x = i8 ALOAD x
iload_ :: Generator e g => IMM -> g e ()
iload_ x = i0 (ILOAD_ x)
lload_ :: Generator e g => IMM -> g e ()
lload_ x = i0 (LLOAD_ x)
fload_ :: Generator e g => IMM -> g e ()
fload_ x = i0 (FLOAD_ x)
dload_ :: Generator e g => IMM -> g e ()
dload_ x = i0 (DLOAD_ x)
aload_ :: Generator e g => IMM -> g e ()
aload_ x = i0 (ALOAD_ x)
iaload :: Generator e g => g e ()
iaload = i0 IALOAD
laload :: Generator e g => g e ()
laload = i0 LALOAD
faload :: Generator e g => g e ()
faload = i0 FALOAD
daload :: Generator e g => g e ()
daload = i0 DALOAD
aaload :: Generator e g => g e ()
aaload = i0 AALOAD
caload :: Generator e g => g e ()
caload = i0 CALOAD
saload :: Generator e g => g e ()
saload = i0 SALOAD
istore :: Generator e g => Constant Direct -> g e ()
istore x = i8 ISTORE x
lstore :: Generator e g => Constant Direct -> g e ()
lstore x = i8 LSTORE x
fstore :: Generator e g => Constant Direct -> g e ()
fstore x = i8 FSTORE x
dstore :: Generator e g => Constant Direct -> g e ()
dstore x = i8 DSTORE x
astore :: Generator e g => Constant Direct -> g e ()
astore x = i8 ASTORE x
istore_ :: Generator e g => Word8 -> g e ()
istore_ x = i0 (ISTORE x)
lstore_ :: Generator e g => Word8 -> g e ()
lstore_ x = i0 (LSTORE x)
fstore_ :: Generator e g => Word8 -> g e ()
fstore_ x = i0 (FSTORE x)
dstore_ :: Generator e g => Word8 -> g e ()
dstore_ x = i0 (DSTORE x)
astore_ :: Generator e g => Word8 -> g e ()
astore_ x = i0 (ASTORE x)
iastore :: Generator e g => g e ()
iastore = i0 IASTORE
lastore :: Generator e g => g e ()
lastore = i0 LASTORE
fastore :: Generator e g => g e ()
fastore = i0 FASTORE
dastore :: Generator e g => g e ()
dastore = i0 DASTORE
aastore :: Generator e g => g e ()
aastore = i0 AASTORE
bastore :: Generator e g => g e ()
bastore = i0 BASTORE
castore :: Generator e g => g e ()
castore = i0 CASTORE
sastore :: Generator e g => g e ()
sastore = i0 SASTORE
pop :: Generator e g => g e ()
pop = i0 POP
pop2 :: Generator e g => g e ()
pop2 = i0 POP2
dup :: Generator e g => g e ()
dup = i0 DUP
dup_x1 :: Generator e g => g e ()
dup_x1 = i0 DUP_X1
dup_x2 :: Generator e g => g e ()
dup_x2 = i0 DUP_X2
dup2 :: Generator e g => g e ()
dup2 = i0 DUP2
dup2_x1 :: Generator e g => g e ()
dup2_x1 = i0 DUP2_X1
dup2_x2 :: Generator e g => g e ()
dup2_x2 = i0 DUP2_X2
swap :: Generator e g => g e ()
swap = i0 SWAP
iadd :: Generator e g => g e ()
iadd = i0 IADD
ladd :: Generator e g => g e ()
ladd = i0 LADD
fadd :: Generator e g => g e ()
fadd = i0 FADD
dadd :: Generator e g => g e ()
dadd = i0 DADD
isub :: Generator e g => g e ()
isub = i0 ISUB
lsub :: Generator e g => g e ()
lsub = i0 LSUB
fsub :: Generator e g => g e ()
fsub = i0 FSUB
dsub :: Generator e g => g e ()
dsub = i0 DSUB
imul :: Generator e g => g e ()
imul = i0 IMUL
lmul :: Generator e g => g e ()
lmul = i0 LMUL
fmul :: Generator e g => g e ()
fmul = i0 FMUL
dmul :: Generator e g => g e ()
dmul = i0 DMUL
idiv :: Generator e g => g e ()
idiv = i0 IDIV
ldiv :: Generator e g => g e ()
ldiv = i0 LDIV
fdiv :: Generator e g => g e ()
fdiv = i0 FDIV
ddiv :: Generator e g => g e ()
ddiv = i0 DDIV
irem :: Generator e g => g e ()
irem = i0 IREM
lrem :: Generator e g => g e ()
lrem = i0 LREM
frem :: Generator e g => g e ()
frem = i0 FREM
drem :: Generator e g => g e ()
drem = i0 DREM
ineg :: Generator e g => g e ()
ineg = i0 INEG
lneg :: Generator e g => g e ()
lneg = i0 LNEG
fneg :: Generator e g => g e ()
fneg = i0 FNEG
dneg :: Generator e g => g e ()
dneg = i0 DNEG
ishl :: Generator e g => g e ()
ishl = i0 ISHL
lshl :: Generator e g => g e ()
lshl = i0 LSHL
ishr :: Generator e g => g e ()
ishr = i0 ISHR
lshr :: Generator e g => g e ()
lshr = i0 LSHR
iushr :: Generator e g => g e ()
iushr = i0 IUSHR
lushr :: Generator e g => g e ()
lushr = i0 LUSHR
iand :: Generator e g => g e ()
iand = i0 IAND
land :: Generator e g => g e ()
land = i0 LAND
ior :: Generator e g => g e ()
ior = i0 IOR
lor :: Generator e g => g e ()
lor = i0 LOR
ixor :: Generator e g => g e ()
ixor = i0 IXOR
lxor :: Generator e g => g e ()
lxor = i0 LXOR
iinc :: Generator e g => Word8 -> Word8 -> g e ()
iinc x y = i0 (IINC x y)
i2l :: Generator e g => g e ()
i2l = i0 I2L
i2f :: Generator e g => g e ()
i2f = i0 I2F
i2d :: Generator e g => g e ()
i2d = i0 I2D
l2i :: Generator e g => g e ()
l2i = i0 L2I
l2f :: Generator e g => g e ()
l2f = i0 L2F
l2d :: Generator e g => g e ()
l2d = i0 L2D
f2i :: Generator e g => g e ()
f2i = i0 F2I
f2l :: Generator e g => g e ()
f2l = i0 F2L
f2d :: Generator e g => g e ()
f2d = i0 F2D
d2i :: Generator e g => g e ()
d2i = i0 D2I
d2l :: Generator e g => g e ()
d2l = i0 D2L
d2f :: Generator e g => g e ()
d2f = i0 D2F
i2b :: Generator e g => g e ()
i2b = i0 I2B
i2c :: Generator e g => g e ()
i2c = i0 I2C
i2s :: Generator e g => g e ()
i2s = i0 I2S
lcmp :: Generator e g => g e ()
lcmp = i0 LCMP
wide :: Generator e g => (Word8 -> Instruction) -> Constant Direct -> g e ()
wide fn c = do
ix <- addToPool c
let ix0 = fromIntegral (ix `div` 0x100) :: Word8
ix1 = fromIntegral (ix `mod` 0x100) :: Word8
i0 (WIDE ix0 $ fn ix1)
new :: Generator e g => B.ByteString -> g e ()
new cls =
i1 NEW (CClass cls)
newArray :: Generator e g => ArrayType -> g e ()
newArray t =
i0 (NEWARRAY $ atype2byte t)
allocNewArray :: Generator e g => B.ByteString -> g e ()
allocNewArray cls =
i1 ANEWARRAY (CClass cls)
invokeVirtual :: Generator e g => B.ByteString -> NameType (Method Direct) -> g e ()
invokeVirtual cls sig =
i1 INVOKEVIRTUAL (CMethod cls sig)
invokeStatic :: Generator e g => B.ByteString -> NameType (Method Direct) -> g e ()
invokeStatic cls sig =
i1 INVOKESTATIC (CMethod cls sig)
invokeSpecial :: Generator e g => B.ByteString -> NameType (Method Direct) -> g e ()
invokeSpecial cls sig =
i1 INVOKESPECIAL (CMethod cls sig)
getStaticField :: Generator e g => B.ByteString -> NameType (Field Direct) -> g e ()
getStaticField cls sig =
i1 GETSTATIC (CField cls sig)
loadString :: Generator e g => String -> g e ()
loadString str =
i8 LDC1 (CString $ fromString $ encodeString $ str)
allocArray :: Generator e g => B.ByteString -> g e ()
allocArray cls =
i1 ANEWARRAY (CClass cls)