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
emit (INSTANCEOF _) = do
pop eax
push (1 :: Word32)
- emit ATHROW = nop -- TODO(bernhard): ...
+ emit ATHROW = do -- TODO(bernhard): ...
+ emit32 (0xffffffff :: Word32)
emit I2C = do
pop eax
and eax (0x000000ff :: Word32)
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
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)
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