Disassembly
The Harpy package also contains a disassembler, so let's put it to work.
disasm :: e -> s -> CodeGen e s a -> IO String disasm e s cg = do let cg' = do cg; getCodeBufferList (_, r) <- runCodeGen cg' e s case r of Left msg -> error (show msg) Right bs -> fmap concat $ mapM disAsm bs where disAsm (ptr, n) = do r <- disassembleBlock ptr n case r of Left msg -> error $ show msg Right insns -> return $ unlines $ map showIntel insnsUsing the same example as in the last post we get.
main = do let fun x = (x+1) * x `quot` 2 str <- disasmIO fun putStr strAnd here is the sad truth:
003d6d20 53 push ebx 003d6d21 51 push ecx 003d6d22 52 push edx 003d6d23 8b 44 24 10 mov eax,dword ptr [esp+16] 003d6d27 50 push eax 003d6d28 6a 01 push 1H 003d6d2a 5b pop ebx 003d6d2b 58 pop eax 003d6d2c 03 c3 add eax,ebx 003d6d2e 50 push eax 003d6d2f 8b 44 24 14 mov eax,dword ptr [esp+20] 003d6d33 50 push eax 003d6d34 5b pop ebx 003d6d35 58 pop eax 003d6d36 0f af c3 imul eax,ebx 003d6d39 50 push eax 003d6d3a 6a 02 push 2H 003d6d3c 5b pop ebx 003d6d3d 58 pop eax 003d6d3e 8b d0 mov edx,eax 003d6d40 c1 fa 1f sar edx,1fH 003d6d43 f7 fb idiv eax,ebx 003d6d45 50 push eax 003d6d46 58 pop eax 003d6d47 5a pop edx 003d6d48 59 pop ecx 003d6d49 5b pop ebx 003d6d4a c3 ret
Labels: Code generation, Haskell
2 Comments:
push eax
pop eax
ouch!
I said it would make any compiler writer weep. :)
No worries, I'll make it better.
Post a Comment
<< Home