maxlocals: store it in new data type RawMethod, with MapBB & Co
[mate.git] / Mate / X86CodeGen.hs
index e3fa8d6cc67436b6f84dd65f7082af86bd72b8a6..c2c336fab736e33ec8cd6cf3b163cb5d169fe186 100644 (file)
@@ -46,23 +46,23 @@ type BBStarts = M.Map BlockID Int
 type CompileInfo = (EntryPoint, BBStarts, Int, TrapMap)
 
 
-emitFromBB :: B.ByteString -> MethodSignature -> Class Direct -> MapBB -> CodeGen e s (CompileInfo, [Instruction])
-emitFromBB method sig cls hmap =  do
+emitFromBB :: B.ByteString -> MethodSignature -> Class Direct -> RawMethod -> CodeGen e s (CompileInfo, [Instruction])
+emitFromBB methodname sig cls method =  do
         let keys = M.keys hmap
         llmap <- mapM (newNamedLabel . (++) "bb_" . show) keys
         let lmap = zip keys llmap
         ep <- getEntryPoint
         push ebp
         mov ebp esp
-        -- TODO(bernhard): determine a reasonable value.
-        --                 e.g. (locals used) * 4
-        sub esp (0x60 :: Word32)
+        sub esp (fromIntegral ((rawLocals method) * 4) :: Word32)
 
         (calls, bbstarts) <- efBB (0, hmap M.! 0) M.empty M.empty lmap
         d <- disassemble
         end <- getCodeOffset
         return ((ep, bbstarts, end, calls), d)
   where
+  hmap = rawMapBB method
+
   getLabel :: BlockID -> [(BlockID, Label)] -> Label
   getLabel _ [] = error "label not found!"
   getLabel i ((x,l):xs) = if i==x then l else getLabel i xs
@@ -257,14 +257,14 @@ emitFromBB method sig cls hmap =  do
     emit (ICONST_3) = push (3 :: Word32)
     emit (ICONST_4) = push (4 :: Word32)
     emit (ICONST_5) = push (5 :: Word32)
+
     emit (ALOAD_ x) = emit (ILOAD_ x)
-    emit (ILOAD_ x) = push (Disp (cArgs_ x), ebp)
+    emit (ILOAD_ x) = emit (ILOAD $ cArgs_ x)
     emit (ALOAD x) = emit (ILOAD x)
     emit (ILOAD x) = push (Disp (cArgs x), ebp)
+
     emit (ASTORE_ x) = emit (ISTORE_ x)
-    emit (ISTORE_ x) = do
-        pop eax
-        mov (Disp (cArgs_ x), ebp) eax
+    emit (ISTORE_ x) = emit (ISTORE $ cArgs_ x)
     emit (ASTORE x) = emit (ISTORE x)
     emit (ISTORE x) = do
         pop eax
@@ -355,13 +355,14 @@ emitFromBB method sig cls hmap =  do
       else 4 + (thisMethodArgCnt * 4) - (4 * x')
     where x' = fromIntegral x
 
-  cArgs_ :: IMM -> Word32
-  cArgs_ x = cArgs $ case x of I0 -> 0; I1 -> 1; I2 -> 2; I3 -> 3
+  cArgs_ :: IMM -> Word8
+  cArgs_ x = case x of I0 -> 0; I1 -> 1; I2 -> 2; I3 -> 3
 
+  -- TODO: factor this out to `compileBB'
   thisMethodArgCnt :: Word32
   thisMethodArgCnt = isNonStatic + fromIntegral (length args)
     where
-    m = fromJust $ lookupMethodSig method sig cls
+    m = fromJust $ lookupMethodSig methodname sig cls
     (MethodSignature args _) = sig
     isNonStatic = if S.member ACC_STATIC (methodAccessFlags m)
         then 0 else 1 -- one argument for the this pointer