Enhace constants pool handling.
[hs-java.git] / JVM / Builder / Instructions.hs
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
5
6 import Data.Word
7 import qualified Data.ByteString.Lazy as B
8 import Codec.Binary.UTF8.String (encodeString)
9 import Data.String
10
11 import JVM.ClassFile
12 import JVM.Assembler
13 import JVM.Builder.Monad
14
15 nop :: Generator e g => g e ()
16 nop = i0 NOP
17 aconst_null :: Generator e g => g e ()
18 aconst_null = i0 ACONST_NULL
19 iconst_m1 :: Generator e g => g e ()
20 iconst_m1 = i0 ICONST_M1
21 iconst_0 :: Generator e g => g e ()
22 iconst_0 = i0 ICONST_0
23 iconst_1 :: Generator e g => g e ()
24 iconst_1 = i0 ICONST_1
25 iconst_2 :: Generator e g => g e ()
26 iconst_2 = i0 ICONST_2
27 iconst_3 :: Generator e g => g e ()
28 iconst_3 = i0 ICONST_3
29 iconst_4 :: Generator e g => g e ()
30 iconst_4 = i0 ICONST_4
31 iconst_5 :: Generator e g => g e ()
32 iconst_5 = i0 ICONST_5
33 lconst_0 :: Generator e g => g e ()
34 lconst_0 = i0 LCONST_0
35 lconst_1 :: Generator e g => g e ()
36 lconst_1 = i0 LCONST_1
37 fconst_0 :: Generator e g => g e ()
38 fconst_0 = i0 FCONST_0
39 fconst_1 :: Generator e g => g e ()
40 fconst_1 = i0 FCONST_1
41 fconst_2 :: Generator e g => g e ()
42 fconst_2 = i0 FCONST_2
43 dconst_0 :: Generator e g => g e ()
44 dconst_0 = i0 DCONST_0
45 dconst_1 :: Generator e g => g e ()
46 dconst_1 = i0 DCONST_1
47
48 bipush :: Generator e g => Word8 -> g e ()
49 bipush x = i0 (BIPUSH x)
50 sipush :: Generator e g => Word16 -> g e ()
51 sipush x = i0 (SIPUSH x)
52
53 ldc1 :: Generator e g => Constant Direct -> g e ()
54 ldc1 x = i8 LDC1 x
55 ldc2 :: Generator e g => Constant Direct -> g e ()
56 ldc2 x = i1 LDC2 x
57 ldc2w :: Generator e g => Constant Direct -> g e ()
58 ldc2w x = i1 LDC2W x
59 iload :: Generator e g => Constant Direct -> g e ()
60 iload x = i8 ILOAD x
61 lload :: Generator e g => Constant Direct -> g e ()
62 lload x = i8 LLOAD x
63 fload :: Generator e g => Constant Direct -> g e ()
64 fload x = i8 FLOAD x
65 dload :: Generator e g => Constant Direct -> g e ()
66 dload x = i8 DLOAD x
67 aload :: Generator e g => Constant Direct -> g e ()
68 aload x = i8 ALOAD x
69
70 iload_ :: Generator e g => IMM -> g e ()
71 iload_ x = i0 (ILOAD_ x)
72 lload_ :: Generator e g => IMM -> g e ()
73 lload_ x = i0 (LLOAD_ x)
74 fload_ :: Generator e g => IMM -> g e ()
75 fload_ x = i0 (FLOAD_ x)
76 dload_ :: Generator e g => IMM -> g e ()
77 dload_ x = i0 (DLOAD_ x)
78 aload_ :: Generator e g => IMM -> g e ()
79 aload_ x = i0 (ALOAD_ x)
80
81 iaload :: Generator e g => g e ()
82 iaload = i0 IALOAD
83 laload :: Generator e g => g e ()
84 laload = i0 LALOAD
85 faload :: Generator e g => g e ()
86 faload = i0 FALOAD
87 daload :: Generator e g => g e ()
88 daload = i0 DALOAD
89 aaload :: Generator e g => g e ()
90 aaload = i0 AALOAD
91 caload :: Generator e g => g e ()
92 caload = i0 CALOAD
93 saload :: Generator e g => g e ()
94 saload = i0 SALOAD
95
96 istore :: Generator e g => Constant Direct -> g e ()
97 istore x = i8 ISTORE x
98 lstore :: Generator e g => Constant Direct -> g e ()
99 lstore x = i8 LSTORE x
100 fstore :: Generator e g => Constant Direct -> g e ()
101 fstore x = i8 FSTORE x
102 dstore :: Generator e g => Constant Direct -> g e ()
103 dstore x = i8 DSTORE x
104 astore :: Generator e g => Constant Direct -> g e ()
105 astore x = i8 ASTORE x
106
107 istore_ :: Generator e g => Word8 -> g e ()
108 istore_ x = i0 (ISTORE x)
109 lstore_ :: Generator e g => Word8 -> g e ()
110 lstore_ x = i0 (LSTORE x)
111 fstore_ :: Generator e g => Word8 -> g e ()
112 fstore_ x = i0 (FSTORE x)
113 dstore_ :: Generator e g => Word8 -> g e ()
114 dstore_ x = i0 (DSTORE x)
115 astore_ :: Generator e g => Word8 -> g e ()
116 astore_ x = i0 (ASTORE x)
117
118 iastore :: Generator e g => g e ()
119 iastore = i0 IASTORE
120 lastore :: Generator e g => g e ()
121 lastore = i0 LASTORE
122 fastore :: Generator e g => g e ()
123 fastore = i0 FASTORE
124 dastore :: Generator e g => g e ()
125 dastore = i0 DASTORE
126 aastore :: Generator e g => g e ()
127 aastore = i0 AASTORE
128 bastore :: Generator e g => g e ()
129 bastore = i0 BASTORE
130 castore :: Generator e g => g e ()
131 castore = i0 CASTORE
132 sastore :: Generator e g => g e ()
133 sastore = i0 SASTORE
134
135 pop :: Generator e g => g e ()
136 pop     = i0 POP    
137 pop2 :: Generator e g => g e ()
138 pop2    = i0 POP2   
139 dup :: Generator e g => g e ()
140 dup     = i0 DUP    
141 dup_x1 :: Generator e g => g e ()
142 dup_x1  = i0 DUP_X1 
143 dup_x2 :: Generator e g => g e ()
144 dup_x2  = i0 DUP_X2 
145 dup2 :: Generator e g => g e ()
146 dup2    = i0 DUP2   
147 dup2_x1 :: Generator e g => g e ()
148 dup2_x1 = i0 DUP2_X1
149 dup2_x2 :: Generator e g => g e ()
150 dup2_x2 = i0 DUP2_X2
151 swap :: Generator e g => g e ()
152 swap    = i0 SWAP   
153 iadd :: Generator e g => g e ()
154 iadd    = i0 IADD   
155 ladd :: Generator e g => g e ()
156 ladd    = i0 LADD   
157 fadd :: Generator e g => g e ()
158 fadd    = i0 FADD   
159 dadd :: Generator e g => g e ()
160 dadd    = i0 DADD   
161 isub :: Generator e g => g e ()
162 isub    = i0 ISUB   
163 lsub :: Generator e g => g e ()
164 lsub    = i0 LSUB   
165 fsub :: Generator e g => g e ()
166 fsub    = i0 FSUB   
167 dsub :: Generator e g => g e ()
168 dsub    = i0 DSUB   
169 imul :: Generator e g => g e ()
170 imul    = i0 IMUL   
171 lmul :: Generator e g => g e ()
172 lmul    = i0 LMUL   
173 fmul :: Generator e g => g e ()
174 fmul    = i0 FMUL   
175 dmul :: Generator e g => g e ()
176 dmul    = i0 DMUL   
177 idiv :: Generator e g => g e ()
178 idiv    = i0 IDIV   
179 ldiv :: Generator e g => g e ()
180 ldiv    = i0 LDIV   
181 fdiv :: Generator e g => g e ()
182 fdiv    = i0 FDIV   
183 ddiv :: Generator e g => g e ()
184 ddiv    = i0 DDIV   
185 irem :: Generator e g => g e ()
186 irem    = i0 IREM   
187 lrem :: Generator e g => g e ()
188 lrem    = i0 LREM   
189 frem :: Generator e g => g e ()
190 frem    = i0 FREM   
191 drem :: Generator e g => g e ()
192 drem    = i0 DREM   
193 ineg :: Generator e g => g e ()
194 ineg    = i0 INEG   
195 lneg :: Generator e g => g e ()
196 lneg    = i0 LNEG   
197 fneg :: Generator e g => g e ()
198 fneg    = i0 FNEG   
199 dneg :: Generator e g => g e ()
200 dneg    = i0 DNEG   
201 ishl :: Generator e g => g e ()
202 ishl    = i0 ISHL   
203 lshl :: Generator e g => g e ()
204 lshl    = i0 LSHL   
205 ishr :: Generator e g => g e ()
206 ishr    = i0 ISHR   
207 lshr :: Generator e g => g e ()
208 lshr    = i0 LSHR   
209 iushr :: Generator e g => g e ()
210 iushr   = i0 IUSHR  
211 lushr :: Generator e g => g e ()
212 lushr   = i0 LUSHR  
213 iand :: Generator e g => g e ()
214 iand    = i0 IAND   
215 land :: Generator e g => g e ()
216 land    = i0 LAND   
217 ior :: Generator e g => g e ()
218 ior     = i0 IOR    
219 lor :: Generator e g => g e ()
220 lor     = i0 LOR    
221 ixor :: Generator e g => g e ()
222 ixor    = i0 IXOR   
223 lxor :: Generator e g => g e ()
224 lxor    = i0 LXOR   
225
226 iinc :: Generator e g => Word8 -> Word8 -> g e ()
227 iinc x y = i0 (IINC x y)
228
229 i2l :: Generator e g => g e ()
230 i2l  = i0 I2L 
231 i2f :: Generator e g => g e ()
232 i2f  = i0 I2F 
233 i2d :: Generator e g => g e ()
234 i2d  = i0 I2D 
235 l2i :: Generator e g => g e ()
236 l2i  = i0 L2I 
237 l2f :: Generator e g => g e ()
238 l2f  = i0 L2F 
239 l2d :: Generator e g => g e ()
240 l2d  = i0 L2D 
241 f2i :: Generator e g => g e ()
242 f2i  = i0 F2I 
243 f2l :: Generator e g => g e ()
244 f2l  = i0 F2L 
245 f2d :: Generator e g => g e ()
246 f2d  = i0 F2D 
247 d2i :: Generator e g => g e ()
248 d2i  = i0 D2I 
249 d2l :: Generator e g => g e ()
250 d2l  = i0 D2L 
251 d2f :: Generator e g => g e ()
252 d2f  = i0 D2F 
253 i2b :: Generator e g => g e ()
254 i2b  = i0 I2B 
255 i2c :: Generator e g => g e ()
256 i2c  = i0 I2C 
257 i2s :: Generator e g => g e ()
258 i2s  = i0 I2S 
259 lcmp :: Generator e g => g e ()
260 lcmp = i0 LCMP
261
262 -- | Wide instruction
263 wide :: Generator e g => (Word8 -> Instruction) -> Constant Direct -> g e ()
264 wide fn c = do
265   ix <- addToPool c
266   let ix0 = fromIntegral (ix `div` 0x100) :: Word8
267       ix1 = fromIntegral (ix `mod` 0x100) :: Word8
268   i0 (WIDE ix0 $ fn ix1)
269
270 new :: Generator e g => B.ByteString -> g e ()
271 new cls =
272   i1 NEW (CClass cls)
273
274 newArray :: Generator e g => ArrayType -> g e ()
275 newArray t =
276   i0 (NEWARRAY $ atype2byte t)
277
278 allocNewArray :: Generator e g => B.ByteString -> g e ()
279 allocNewArray cls =
280   i1 ANEWARRAY (CClass cls)
281
282 invokeVirtual :: Generator e g => B.ByteString -> NameType Method -> g e ()
283 invokeVirtual cls sig =
284   i1 INVOKEVIRTUAL (CMethod cls sig)
285
286 invokeStatic :: Generator e g => B.ByteString -> NameType Method -> g e ()
287 invokeStatic cls sig =
288   i1 INVOKESTATIC (CMethod cls sig)
289
290 invokeSpecial :: Generator e g => B.ByteString -> NameType Method -> g e ()
291 invokeSpecial cls sig =
292   i1 INVOKESPECIAL (CMethod cls sig)
293
294 getStaticField :: Generator e g => B.ByteString -> NameType Field -> g e ()
295 getStaticField cls sig =
296   i1 GETSTATIC (CField cls sig)
297
298 loadString :: Generator e g => String -> g e ()
299 loadString str =
300   i8 LDC1 (CString $ fromString $ encodeString $ str)
301
302 allocArray :: Generator e g => B.ByteString -> g e ()
303 allocArray cls =
304   i1 ANEWARRAY (CClass cls)
305