X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FX86CodeGen.hs;h=f1f9969da9237e802697d7890eeffa923993d577;hb=8981d77c48cc12673620159b4f6b8274b07abddf;hp=710b5b60d5a1589adc5c1d7253dd0ef23416ac89;hpb=3c1c1355bc77bf53846255a628416aa36a730e23;p=mate.git diff --git a/Mate/X86CodeGen.hs b/Mate/X86CodeGen.hs index 710b5b6..f1f9969 100644 --- a/Mate/X86CodeGen.hs +++ b/Mate/X86CodeGen.hs @@ -91,6 +91,13 @@ emitFromBB cls method = do -- TODO(bernhard): implement `emit' as function which accepts a list of -- instructions, so we can use patterns for optimizations where + forceRegDump :: CodeGen e s () + forceRegDump = do + push esi + mov esi (0x13371234 :: Word32) + mov esi (Addr 0) + pop esi + getCurrentOffset :: CodeGen e s Word32 getCurrentOffset = do ep <- getEntryPoint @@ -173,6 +180,18 @@ emitFromBB cls method = do mov eax (Addr 0x00000000) -- it's a trap push eax return $ Just (trapaddr, StaticField $ buildStaticFieldID cls cpidx) + emit' (INSTANCEOF cpidx) = do + pop eax + mov eax (Disp 0, eax) -- mtable of objectref + trapaddr <- getCurrentOffset + -- place something like `mov edx $mtable_of_objref' instead + emit32 (0x9090ffff :: Word32) >> emit8 (0x90 :: Word8) + cmp eax edx + sete al + movzxb eax al + push eax + forceRegDump + return $ Just (trapaddr, InstanceOf $ buildClassID cls cpidx) emit' insn = emit insn >> return Nothing emit :: J.Instruction -> CodeGen e s () @@ -236,10 +255,6 @@ emitFromBB cls method = do mtable <- liftIO $ getMethodTable objname mov (Disp 0, eax) mtable emit (CHECKCAST _) = nop -- TODO(bernhard): ... - -- TODO(bernhard): ... - emit (INSTANCEOF _) = do - pop eax - push (1 :: Word32) emit ATHROW = -- TODO(bernhard): ... emit32 (0xffffffff :: Word32) emit I2C = do