X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FX86CodeGen.hs;h=d09304d70428463ddd400351c27fdf234be83bee;hb=ddde95f7fdbd24354004e126da18d44ad97d7e37;hp=2b820b6379274638ebf5f6c8a93042e3144c0dcd;hpb=fbd2a5f852ab4f94c0a0c20f7a572c99e75f9daf;p=mate.git diff --git a/Mate/X86CodeGen.hs b/Mate/X86CodeGen.hs index 2b820b6..d09304d 100644 --- a/Mate/X86CodeGen.hs +++ b/Mate/X86CodeGen.hs @@ -74,7 +74,7 @@ emitFromBB method sig cls hmap = do bb_offset <- getCodeOffset let bbstarts' = M.insert bid bb_offset bbstarts defineLabel $ getLabel bid lmap - cs <- mapM emit' $ code bb + cs <- mapM emit'' $ code bb let calls' = calls `M.union` M.fromList (catMaybes cs) case successor bb of Return -> return (calls', bbstarts') @@ -123,6 +123,9 @@ emitFromBB method sig cls hmap = do let imm8 = is8BitOffset offset return $ Just (calladdr + (if imm8 then 3 else 6), trapcause imm8) + emit'' :: J.Instruction -> CodeGen e s (Maybe (Word32, TrapCause)) + emit'' insn = newNamedLabel ("jvm_insn: " ++ show insn) >>= defineLabel >> emit' insn + emit' :: J.Instruction -> CodeGen e s (Maybe (Word32, TrapCause)) emit' (INVOKESPECIAL cpidx) = emitInvoke cpidx True emit' (INVOKESTATIC cpidx) = emitInvoke cpidx False @@ -282,6 +285,7 @@ emitFromBB method sig cls hmap = do emit IDIV = do pop ebx; pop eax; xor edx edx; div ebx; push eax emit IREM = do pop ebx; pop eax; xor edx edx; div ebx; push edx emit IXOR = do pop ebx; pop eax; xor eax ebx; push eax + emit IUSHR = do pop ecx; pop eax; sar eax cl; push eax emit INEG = do pop eax; neg eax; push eax emit (IINC x imm) = add (Disp (cArgs x), ebp) (s8_w32 imm) @@ -319,10 +323,17 @@ emitFromBB method sig cls hmap = do emitIF cond = let sid = case successor bb of TwoTarget _ t -> t; _ -> error "bad" l = getLabel sid lmap - in case cond of - C_EQ -> je l; C_NE -> jne l - C_LT -> jl l; C_GT -> jg l - C_GE -> jge l; C_LE -> jle l + sid2 = case successor bb of TwoTarget t _ -> t; _ -> error "bad" + l2 = getLabel sid2 lmap + in do + case cond of + C_EQ -> je l; C_NE -> jne l + C_LT -> jl l; C_GT -> jg l + C_GE -> jge l; C_LE -> jle l + -- TODO(bernhard): ugly workaround, to get broken emitBB working + -- (it didn't work for gnu/classpath/SystemProperties.java) + jmp l2 + callMalloc :: CodeGen e s () callMalloc = do