X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=mate.git;a=blobdiff_plain;f=Mate%2FX86CodeGen.hs;h=448c966e19d5f41e51003e39685ac0a21f7e2601;hp=710b5b60d5a1589adc5c1d7253dd0ef23416ac89;hb=717a866d25642626b22b9b3abbd8f98ce95c5e10;hpb=f0c1382a5ac2cf98fd6a9dcd3d193e47ca9ed8aa diff --git a/Mate/X86CodeGen.hs b/Mate/X86CodeGen.hs index 710b5b6..448c966 100644 --- a/Mate/X86CodeGen.hs +++ b/Mate/X86CodeGen.hs @@ -173,6 +173,17 @@ 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 + return $ Just (trapaddr, InstanceOf $ buildClassID cls cpidx) emit' insn = emit insn >> return Nothing emit :: J.Instruction -> CodeGen e s () @@ -236,10 +247,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