X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FnativeGen%2FAsmCodeGen.lhs;h=13a59ef22be04b135aa6f5569be55910bca39461;hb=e2a7f07969b47fef0cdf284e1bf98a0ad7b01d76;hp=fad365320359d973aa05cb7b15494385072731b0;hpb=dcef38bab91d45b56f7cf3ceeec96303d93728bb;p=ghc-hetmet.git diff --git a/ghc/compiler/nativeGen/AsmCodeGen.lhs b/ghc/compiler/nativeGen/AsmCodeGen.lhs index fad3653..13a59ef 100644 --- a/ghc/compiler/nativeGen/AsmCodeGen.lhs +++ b/ghc/compiler/nativeGen/AsmCodeGen.lhs @@ -1,21 +1,17 @@ % -% (c) The AQUA Project, Glasgow University, 1993-1996 +% (c) The AQUA Project, Glasgow University, 1993-1998 % \begin{code} -#include "HsVersions.h" +module AsmCodeGen ( nativeCodeGen ) where -module AsmCodeGen ( writeRealAsm, dumpRealAsm ) where +#include "HsVersions.h" -IMP_Ubiq(){-uitous-} -IMPORT_1_3(IO(Handle)) +import IO ( Handle ) +import List ( intersperse ) import MachMisc -#if __GLASGOW_HASKELL__ >= 202 -import MachRegs hiding (Addr) -#else import MachRegs -#endif import MachCode import PprMach @@ -24,12 +20,16 @@ import AbsCSyn ( AbstractC, MagicId ) import AsmRegAlloc ( runRegAllocate ) import OrdList ( OrdList ) import PrimOp ( commutableOp, PrimOp(..) ) -import PrimRep ( PrimRep{-instance Eq-} ) import RegAllocInfo ( mkMRegsState, MRegsState ) -import Stix ( StixTree(..), StixReg(..), CodeSegment ) -import UniqSupply ( returnUs, thenUs, mapUs, SYN_IE(UniqSM), UniqSupply ) -import Outputable ( printDoc ) -import Pretty ( Doc, vcat, Mode(..) ) +import Stix ( StixTree(..), StixReg(..), pprStixTrees ) +import PrimRep ( isFloatingRep ) +import UniqSupply ( returnUs, thenUs, mapUs, initUs, + initUs_, UniqSM, UniqSupply ) +import UniqFM ( UniqFM, emptyUFM, addToUFM, lookupUFM ) +import Outputable + +import GlaExts (trace) --tmp +#include "nativeGen/NCG.h" \end{code} The 96/03 native-code generator has machine-independent and @@ -78,32 +78,32 @@ The machine-dependent bits break down as follows: \end{description} So, here we go: -\begin{code} -writeRealAsm :: Handle -> AbstractC -> UniqSupply -> IO () -writeRealAsm handle absC us - = _scc_ "writeRealAsm" (printDoc LeftMode handle (runNCG absC us)) - -dumpRealAsm :: AbstractC -> UniqSupply -> String -dumpRealAsm absC us = show (runNCG absC us) -runNCG absC - = genCodeAbstractC absC `thenUs` \ treelists -> - let - stix = map (map genericOpt) treelists - in - codeGen stix +\begin{code} +nativeCodeGen :: AbstractC -> UniqSupply -> (SDoc, SDoc) +nativeCodeGen absC us + = let (stixRaw, us1) = initUs us (genCodeAbstractC absC) + stixOpt = map (map genericOpt) stixRaw + insns = initUs_ us1 (codeGen stixOpt) + debug_stix = vcat (map pprStixTrees stixOpt) + in + (debug_stix, insns) \end{code} @codeGen@ is the top-level code-generation function: \begin{code} -codeGen :: [[StixTree]] -> UniqSM Doc +codeGen :: [[StixTree]] -> UniqSM SDoc -codeGen trees - = mapUs genMachCode trees `thenUs` \ dynamic_codes -> +codeGen stixFinal + = mapUs genMachCode stixFinal `thenUs` \ dynamic_codes -> let - static_instrs = scheduleMachCode dynamic_codes + static_instrss = scheduleMachCode dynamic_codes + docs = map (vcat . map pprInstr) static_instrss in - returnUs (vcat (map pprInstr static_instrs)) + returnUs (vcat (intersperse (char ' ' + $$ text "# ___stg_split_marker" + $$ char ' ') + docs)) \end{code} Top level code generator for a chunk of stix code: @@ -121,10 +121,10 @@ exposed via the OrdList, but more might occur, so further analysis might be needed. \begin{code} -scheduleMachCode :: [InstrList] -> [Instr] +scheduleMachCode :: [InstrList] -> [[Instr]] scheduleMachCode - = concat . map (runRegAllocate freeRegsState reservedRegs) + = map (runRegAllocate freeRegsState reservedRegs) where freeRegsState = mkMRegsState (extractMappedRegNos freeRegs) \end{code} @@ -162,8 +162,8 @@ genericOpt (StJump addr) = StJump (genericOpt addr) genericOpt (StCondJump addr test) = StCondJump addr (genericOpt test) -genericOpt (StCall fn pk args) - = StCall fn pk (map genericOpt args) +genericOpt (StCall fn cconv pk args) + = StCall fn cconv pk (map genericOpt args) \end{code} Fold indices together when the types match: @@ -208,7 +208,6 @@ primOpt primOpt op arg@[StInt x] = case op of IntNegOp -> StInt (-x) - IntAbsOp -> StInt (abs x) _ -> StPrim op arg primOpt op args@[StInt x, StInt y] @@ -230,6 +229,7 @@ primOpt op args@[StInt x, StInt y] IntNeOp -> StInt (if x /= y then 1 else 0) IntLtOp -> StInt (if x < y then 1 else 0) IntLeOp -> StInt (if x <= y then 1 else 0) + -- ToDo: WordQuotOp, WordRemOp. _ -> StPrim op args \end{code} @@ -252,8 +252,8 @@ primOpt op args@[x, y@(StInt 0)] IntMulOp -> y AndOp -> y OrOp -> x + XorOp -> x SllOp -> x - SraOp -> x SrlOp -> x ISllOp -> x ISraOp -> x @@ -275,10 +275,10 @@ primOpt op args@[x, y@(StInt n)] = case op of IntMulOp -> case exactLog2 n of Nothing -> StPrim op args - Just p -> StPrim SllOp [x, StInt p] + Just p -> StPrim ISllOp [x, StInt p] IntQuotOp -> case exactLog2 n of Nothing -> StPrim op args - Just p -> StPrim SraOp [x, StInt p] + Just p -> StPrim ISrlOp [x, StInt p] _ -> StPrim op args \end{code}