1 -- | This module exports shortcuts for some of JVM instructions (which are defined in JVM.Assembler).
2 -- These functions get Constants, put them into constants pool and generate instruction using index
3 -- of constant in the pool.
4 module JVM.Builder.Instructions where
7 import qualified Data.ByteString.Lazy as B
11 import JVM.Builder.Monad
13 nop :: Generator g => g ()
15 aconst_null :: Generator g => g ()
16 aconst_null = i0 ACONST_NULL
17 iconst_m1 :: Generator g => g ()
18 iconst_m1 = i0 ICONST_M1
19 iconst_0 :: Generator g => g ()
20 iconst_0 = i0 ICONST_0
21 iconst_1 :: Generator g => g ()
22 iconst_1 = i0 ICONST_1
23 iconst_2 :: Generator g => g ()
24 iconst_2 = i0 ICONST_2
25 iconst_3 :: Generator g => g ()
26 iconst_3 = i0 ICONST_3
27 iconst_4 :: Generator g => g ()
28 iconst_4 = i0 ICONST_4
29 iconst_5 :: Generator g => g ()
30 iconst_5 = i0 ICONST_5
31 lconst_0 :: Generator g => g ()
32 lconst_0 = i0 LCONST_0
33 lconst_1 :: Generator g => g ()
34 lconst_1 = i0 LCONST_1
35 fconst_0 :: Generator g => g ()
36 fconst_0 = i0 FCONST_0
37 fconst_1 :: Generator g => g ()
38 fconst_1 = i0 FCONST_1
39 fconst_2 :: Generator g => g ()
40 fconst_2 = i0 FCONST_2
41 dconst_0 :: Generator g => g ()
42 dconst_0 = i0 DCONST_0
43 dconst_1 :: Generator g => g ()
44 dconst_1 = i0 DCONST_1
46 bipush :: Generator g => Word8 -> g ()
47 bipush x = i0 (BIPUSH x)
48 sipush :: Generator g => Word16 -> g ()
49 sipush x = i0 (SIPUSH x)
51 ldc1 :: Generator g => Constant Direct -> g ()
53 ldc2 :: Generator g => Constant Direct -> g ()
55 ldc2w :: Generator g => Constant Direct -> g ()
57 iload :: Generator g => Constant Direct -> g ()
59 lload :: Generator g => Constant Direct -> g ()
61 fload :: Generator g => Constant Direct -> g ()
63 dload :: Generator g => Constant Direct -> g ()
65 aload :: Generator g => Constant Direct -> g ()
68 iload_ :: Generator g => IMM -> g ()
69 iload_ x = i0 (ILOAD_ x)
70 lload_ :: Generator g => IMM -> g ()
71 lload_ x = i0 (LLOAD_ x)
72 fload_ :: Generator g => IMM -> g ()
73 fload_ x = i0 (FLOAD_ x)
74 dload_ :: Generator g => IMM -> g ()
75 dload_ x = i0 (DLOAD_ x)
76 aload_ :: Generator g => IMM -> g ()
77 aload_ x = i0 (ALOAD_ x)
79 iaload :: Generator g => g ()
81 laload :: Generator g => g ()
83 faload :: Generator g => g ()
85 daload :: Generator g => g ()
87 aaload :: Generator g => g ()
89 caload :: Generator g => g ()
91 saload :: Generator g => g ()
94 istore :: Generator g => Constant Direct -> g ()
95 istore x = i8 ISTORE x
96 lstore :: Generator g => Constant Direct -> g ()
97 lstore x = i8 LSTORE x
98 fstore :: Generator g => Constant Direct -> g ()
99 fstore x = i8 FSTORE x
100 dstore :: Generator g => Constant Direct -> g ()
101 dstore x = i8 DSTORE x
102 astore :: Generator g => Constant Direct -> g ()
103 astore x = i8 ASTORE x
105 istore_ :: Generator g => Word8 -> g ()
106 istore_ x = i0 (ISTORE x)
107 lstore_ :: Generator g => Word8 -> g ()
108 lstore_ x = i0 (LSTORE x)
109 fstore_ :: Generator g => Word8 -> g ()
110 fstore_ x = i0 (FSTORE x)
111 dstore_ :: Generator g => Word8 -> g ()
112 dstore_ x = i0 (DSTORE x)
113 astore_ :: Generator g => Word8 -> g ()
114 astore_ x = i0 (ASTORE x)
116 iastore :: Generator g => g ()
118 lastore :: Generator g => g ()
120 fastore :: Generator g => g ()
122 dastore :: Generator g => g ()
124 aastore :: Generator g => g ()
126 bastore :: Generator g => g ()
128 castore :: Generator g => g ()
130 sastore :: Generator g => g ()
133 pop :: Generator g => g ()
135 pop2 :: Generator g => g ()
137 dup :: Generator g => g ()
139 dup_x1 :: Generator g => g ()
141 dup_x2 :: Generator g => g ()
143 dup2 :: Generator g => g ()
145 dup2_x1 :: Generator g => g ()
147 dup2_x2 :: Generator g => g ()
149 swap :: Generator g => g ()
151 iadd :: Generator g => g ()
153 ladd :: Generator g => g ()
155 fadd :: Generator g => g ()
157 dadd :: Generator g => g ()
159 isub :: Generator g => g ()
161 lsub :: Generator g => g ()
163 fsub :: Generator g => g ()
165 dsub :: Generator g => g ()
167 imul :: Generator g => g ()
169 lmul :: Generator g => g ()
171 fmul :: Generator g => g ()
173 dmul :: Generator g => g ()
175 idiv :: Generator g => g ()
177 ldiv :: Generator g => g ()
179 fdiv :: Generator g => g ()
181 ddiv :: Generator g => g ()
183 irem :: Generator g => g ()
185 lrem :: Generator g => g ()
187 frem :: Generator g => g ()
189 drem :: Generator g => g ()
191 ineg :: Generator g => g ()
193 lneg :: Generator g => g ()
195 fneg :: Generator g => g ()
197 dneg :: Generator g => g ()
199 ishl :: Generator g => g ()
201 lshl :: Generator g => g ()
203 ishr :: Generator g => g ()
205 lshr :: Generator g => g ()
207 iushr :: Generator g => g ()
209 lushr :: Generator g => g ()
211 iand :: Generator g => g ()
213 land :: Generator g => g ()
215 ior :: Generator g => g ()
217 lor :: Generator g => g ()
219 ixor :: Generator g => g ()
221 lxor :: Generator g => g ()
224 iinc :: Generator g => Word8 -> Word8 -> g ()
225 iinc x y = i0 (IINC x y)
227 i2l :: Generator g => g ()
229 i2f :: Generator g => g ()
231 i2d :: Generator g => g ()
233 l2i :: Generator g => g ()
235 l2f :: Generator g => g ()
237 l2d :: Generator g => g ()
239 f2i :: Generator g => g ()
241 f2l :: Generator g => g ()
243 f2d :: Generator g => g ()
245 d2i :: Generator g => g ()
247 d2l :: Generator g => g ()
249 d2f :: Generator g => g ()
251 i2b :: Generator g => g ()
253 i2c :: Generator g => g ()
255 i2s :: Generator g => g ()
257 lcmp :: Generator g => g ()
260 -- | Wide instruction
261 wide :: Generator g => (Word8 -> Instruction) -> Constant Direct -> g ()
264 let ix0 = fromIntegral (ix `div` 0x100) :: Word8
265 ix1 = fromIntegral (ix `mod` 0x100) :: Word8
266 i0 (WIDE ix0 $ fn ix1)
268 new :: Generator g => B.ByteString -> g ()
272 newArray :: Generator g => ArrayType -> g ()
274 i0 (NEWARRAY $ atype2byte t)
276 allocNewArray :: Generator g => B.ByteString -> g ()
278 i1 ANEWARRAY (CClass cls)
280 invokeVirtual :: Generator g => B.ByteString -> NameType Method -> g ()
281 invokeVirtual cls sig =
282 i1 INVOKEVIRTUAL (CMethod cls sig)
284 invokeStatic :: Generator g => B.ByteString -> NameType Method -> g ()
285 invokeStatic cls sig =
286 i1 INVOKESTATIC (CMethod cls sig)
288 invokeSpecial :: Generator g => B.ByteString -> NameType Method -> g ()
289 invokeSpecial cls sig =
290 i1 INVOKESPECIAL (CMethod cls sig)
292 getStaticField :: Generator g => B.ByteString -> NameType Field -> g ()
293 getStaticField cls sig =
294 i1 GETSTATIC (CField cls sig)
296 loadString :: Generator g => B.ByteString -> g ()
298 i8 LDC1 (CString str)
300 allocArray :: Generator g => B.ByteString -> g ()
302 i1 ANEWARRAY (CClass cls)