X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FX86CodeGen.hs;h=b4b72b179c81b32e5ce6df152971fc3504f96283;hb=e956c113f38ae5cf78d79cf00de776f0331a332c;hp=e365367619d3c7374fa0927768826d1827479d65;hpb=359958941d8775bfc97ac8977f2a4d115808c02e;p=mate.git diff --git a/Mate/X86CodeGen.hs b/Mate/X86CodeGen.hs index e365367..b4b72b1 100644 --- a/Mate/X86CodeGen.hs +++ b/Mate/X86CodeGen.hs @@ -78,7 +78,10 @@ emitFromBB method sig cls hmap = do let calls' = calls `M.union` M.fromList (catMaybes cs) case successor bb of Return -> return (calls', bbstarts') - FallThrough t -> efBB (t, hmap M.! t) calls' bbstarts' lmap + FallThrough t -> do + -- TODO(bernhard): le dirty hax. see java/lang/Integer.toString(int, int) + jmp (getLabel t lmap) + efBB (t, hmap M.! t) calls' bbstarts' lmap OneTarget t -> efBB (t, hmap M.! t) calls' bbstarts' lmap TwoTarget t1 t2 -> do (calls'', bbstarts'') <- efBB (t1, hmap M.! t1) calls' bbstarts' lmap @@ -269,6 +272,7 @@ emitFromBB method sig cls hmap = do emit (LDC2 x) = do value <- case constsPool cls M.! x of (CString s) -> liftIO $ getUniqueStringAddr s + (CInteger i) -> liftIO $ return i e -> error $ "LDCI... missing impl.: " ++ show e push value emit (GETFIELD x) = do @@ -285,6 +289,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)