projects
/
hs-java.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
asm: add `areturn'
[hs-java.git]
/
JVM
/
Assembler.hs
diff --git
a/JVM/Assembler.hs
b/JVM/Assembler.hs
index 7ac59c64a0915734a64e55f261d51ac32e9f95bf..c80363bf743c6b97613698969a618ffb961bc895 100644
(file)
--- a/
JVM/Assembler.hs
+++ b/
JVM/Assembler.hs
@@
-239,10
+239,10
@@
data Instruction =
| LCMP -- ^ 148
| FCMP CMP -- ^ 149, 150
| DCMP CMP -- ^ 151, 152
| LCMP -- ^ 148
| FCMP CMP -- ^ 149, 150
| DCMP CMP -- ^ 151, 152
- | IF CMP
-- ^ 153, 154, 155, 156, 157, 158
+ | IF CMP
Word16
-- ^ 153, 154, 155, 156, 157, 158
| IF_ICMP CMP Word16 -- ^ 159, 160, 161, 162, 163, 164
| IF_ACMP CMP Word16 -- ^ 165, 166
| IF_ICMP CMP Word16 -- ^ 159, 160, 161, 162, 163, 164
| IF_ACMP CMP Word16 -- ^ 165, 166
- | GOTO
-- ^ 167
+ | GOTO
Word16
-- ^ 167
| JSR Word16 -- ^ 168
| RET -- ^ 169
| TABLESWITCH Word32 Word32 Word32 [Word32] -- ^ 170
| JSR Word16 -- ^ 168
| RET -- ^ 169
| TABLESWITCH Word32 Word32 Word32 [Word32] -- ^ 170
@@
-251,6
+251,7
@@
data Instruction =
| LRETURN -- ^ 173
| FRETURN -- ^ 174
| DRETURN -- ^ 175
| LRETURN -- ^ 173
| FRETURN -- ^ 174
| DRETURN -- ^ 175
+ | ARETURN -- ^ 176
| RETURN -- ^ 177
| GETSTATIC Word16 -- ^ 178
| PUTSTATIC Word16 -- ^ 179
| RETURN -- ^ 177
| GETSTATIC Word16 -- ^ 178
| PUTSTATIC Word16 -- ^ 179
@@
-475,12
+476,12
@@
instance BinaryState Integer Instruction where
put (DCMP C_LT) = putByte 151
put (DCMP C_GT) = putByte 152
put (DCMP c) = fail $ "No such instruction: DCMP " ++ show c
put (DCMP C_LT) = putByte 151
put (DCMP C_GT) = putByte 152
put (DCMP c) = fail $ "No such instruction: DCMP " ++ show c
- put (IF c
) = putByte (fromIntegral $ 153 + fromEnum c)
+ put (IF c
x) = putByte (fromIntegral $ 153 + fromEnum c) >> put x
put (IF_ACMP C_EQ x) = put1 165 x
put (IF_ACMP C_NE x) = put1 166 x
put (IF_ACMP c _) = fail $ "No such instruction: IF_ACMP " ++ show c
put (IF_ICMP c x) = putByte (fromIntegral $ 159 + fromEnum c) >> put x
put (IF_ACMP C_EQ x) = put1 165 x
put (IF_ACMP C_NE x) = put1 166 x
put (IF_ACMP c _) = fail $ "No such instruction: IF_ACMP " ++ show c
put (IF_ICMP c x) = putByte (fromIntegral $ 159 + fromEnum c) >> put x
- put
GOTO = putByte 167
+ put
(GOTO x) = put1 167 x
put (JSR x) = put1 168 x
put RET = putByte 169
put (TABLESWITCH def low high offs) = do
put (JSR x) = put1 168 x
put RET = putByte 169
put (TABLESWITCH def low high offs) = do
@@
-503,6
+504,7
@@
instance BinaryState Integer Instruction where
put LRETURN = putByte 173
put FRETURN = putByte 174
put DRETURN = putByte 175
put LRETURN = putByte 173
put FRETURN = putByte 174
put DRETURN = putByte 175
+ put ARETURN = putByte 176
put RETURN = putByte 177
put (GETSTATIC x) = put1 178 x
put (PUTSTATIC x) = put1 179 x
put RETURN = putByte 177
put (GETSTATIC x) = put1 178 x
put (PUTSTATIC x) = put1 179 x
@@
-646,7
+648,7
@@
instance BinaryState Integer Instruction where
152 -> return $ DCMP C_GT
165 -> IF_ACMP C_EQ <$> get
166 -> IF_ACMP C_NE <$> get
152 -> return $ DCMP C_GT
165 -> IF_ACMP C_EQ <$> get
166 -> IF_ACMP C_NE <$> get
- 167 ->
return GOTO
+ 167 ->
GOTO <$> get
168 -> JSR <$> get
169 -> return RET
170 -> do
168 -> JSR <$> get
169 -> return RET
170 -> do
@@
-670,6
+672,7
@@
instance BinaryState Integer Instruction where
173 -> return LRETURN
174 -> return FRETURN
175 -> return DRETURN
173 -> return LRETURN
174 -> return FRETURN
175 -> return DRETURN
+ 176 -> return ARETURN
177 -> return RETURN
178 -> GETSTATIC <$> get
179 -> PUTSTATIC <$> get
177 -> return RETURN
178 -> GETSTATIC <$> get
179 -> PUTSTATIC <$> get
@@
-704,7
+707,7
@@
instance BinaryState Integer Instruction where
| inRange (34, 37) c -> imm 34 FLOAD_ c
| inRange (38, 41) c -> imm 38 DLOAD_ c
| inRange (42, 45) c -> imm 42 ALOAD_ c
| inRange (34, 37) c -> imm 34 FLOAD_ c
| inRange (38, 41) c -> imm 38 DLOAD_ c
| inRange (42, 45) c -> imm 42 ALOAD_ c
- | inRange (153, 158) c ->
return $ IF (toEnum $ fromIntegral $ c-153)
+ | inRange (153, 158) c ->
IF (toEnum $ fromIntegral $ c-153) <$> get
| inRange (159, 164) c -> IF_ICMP (toEnum $ fromIntegral $ c-159) <$> get
| otherwise -> fail $ "Unknown instruction byte code: " ++ show c
| inRange (159, 164) c -> IF_ICMP (toEnum $ fromIntegral $ c-159) <$> get
| otherwise -> fail $ "Unknown instruction byte code: " ++ show c