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')
- 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
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
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