X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FX86CodeGen.hs;h=df251a67abc38ef3d06ec948b7f20638088ab521;hb=f0b4e78c77e6503703fd7ace19e203ce06718397;hp=dea2a4b0eb8e2c6c5575e80da79b5be40b28014f;hpb=2113a216f0dbae2f4ef41aba13b157c9b1ad1e78;p=mate.git diff --git a/Mate/X86CodeGen.hs b/Mate/X86CodeGen.hs index dea2a4b..df251a6 100644 --- a/Mate/X86CodeGen.hs +++ b/Mate/X86CodeGen.hs @@ -7,6 +7,7 @@ import Data.Int import Data.Maybe import qualified Data.Map as M import qualified Data.ByteString.Lazy as B +import Control.Monad import Foreign import Foreign.C.Types @@ -179,10 +180,11 @@ emitFromBB cls hmap = do -- causes SIGILL. in the signal handler we patch it to the acutal call. -- place a nop at the end, therefore the disasm doesn't screw up emit32 (0xffffffff :: Word32) >> emit8 (0x90 :: Word8) - -- discard arguments (TODO(bernhard): don't hardcode it) - add esp (4 :: Word32) - -- push result on stack (TODO(bernhard): if any) - push eax + -- discard arguments on stack + let argcnt = (methodGetArgsCount cls cpidx) * 4 + when (argcnt > 0) (add esp argcnt) + -- push result on stack if method has a return value + when (methodHaveReturnValue cls cpidx) (push eax) return $ Just $ (w32_calladdr, (l, cls, cpidx)) emit' insn = emit insn >> return Nothing @@ -197,9 +199,11 @@ emitFromBB cls hmap = do call (trapaddr - w32_calladdr) add esp (4 :: Word32) emit (BIPUSH val) = push ((fromIntegral val) :: Word32) + emit (SIPUSH val) = push ((fromIntegral $ ((fromIntegral val) :: Int16)) :: Word32) emit (ICONST_0) = push (0 :: Word32) emit (ICONST_1) = push (1 :: Word32) emit (ICONST_2) = push (2 :: Word32) + emit (ICONST_4) = push (4 :: Word32) emit (ICONST_5) = push (5 :: Word32) emit (ILOAD_ x) = do push (Disp (cArgs_ x), ebp)