Makefile: fix for new javac version
[mate.git] / Mate / X86CodeGen.hs
index d895d63991857363ade7bfc903435f241630d6f8..80def613ec26ec7b5cbb8d4fcdaffefd668cf03e 100644 (file)
@@ -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
@@ -237,7 +240,8 @@ emitFromBB method sig cls hmap =  do
     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)
@@ -269,6 +273,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 +290,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)
@@ -322,10 +328,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