X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=compiler%2Fcmm%2FCmmCallConv.hs;h=2a013467b41b77f966d24ac4fcfea6f340ace32c;hb=8a2809c29de9f23eba7ca682b48390033a9d40f6;hp=ee16fe95c1a7c3ba72158e40801f384a4f1d476c;hpb=0e504ed52a791feb3fd265e5dfd141b5f4a8b1b6;p=ghc-hetmet.git diff --git a/compiler/cmm/CmmCallConv.hs b/compiler/cmm/CmmCallConv.hs index ee16fe9..2a01346 100644 --- a/compiler/cmm/CmmCallConv.hs +++ b/compiler/cmm/CmmCallConv.hs @@ -1,8 +1,8 @@ module CmmCallConv ( ParamLocation(..), ArgumentFormat, - assignRegs, assignArguments, + argumentsSize, ) where #include "HsVersions.h" @@ -15,26 +15,35 @@ import Constants import StaticFlags (opt_Unregisterised) import Panic +-- Calculate the 'GlobalReg' or stack locations for function call +-- parameters as used by the Cmm calling convention. + data ParamLocation = RegisterParam GlobalReg | StackParam WordOff -assignRegs :: [LocalReg] -> ArgumentFormat LocalReg -assignRegs regs = assignRegs' regs 0 availRegs - where - assignRegs' (r:rs) offset availRegs = (r,assignment):assignRegs' rs new_offset remaining - where - (assignment, new_offset, remaining) = assign_reg (localRegRep r) offset availRegs +type ArgumentFormat a = [(a, ParamLocation)] assignArguments :: (a -> MachRep) -> [a] -> ArgumentFormat a assignArguments f reps = assignArguments' reps 0 availRegs where assignArguments' [] offset availRegs = [] - assignArguments' (r:rs) offset availRegs = (r,assignment):assignArguments' rs new_offset remaining + assignArguments' (r:rs) offset availRegs = + (r,assignment):assignArguments' rs new_offset remaining where - (assignment, new_offset, remaining) = assign_reg (f r) offset availRegs + (assignment, new_offset, remaining) = + assign_reg (f r) offset availRegs -type ArgumentFormat a = [(a, ParamLocation)] +argumentsSize :: (a -> MachRep) -> [a] -> WordOff +argumentsSize f reps = maximum (0 : map arg_top args) + where + args = assignArguments f reps + + arg_top (a, StackParam offset) = -offset + arg_top (_, RegisterParam _) = 0 + +----------------------------------------------------------------------------- +-- Local information about the registers available type AvailRegs = ( [GlobalReg] -- available vanilla regs. , [GlobalReg] -- floats @@ -65,7 +74,8 @@ availRegs = (regList VanillaReg useVanillaRegs, regList f max = map f [1 .. max] slot_size :: LocalReg -> Int -slot_size reg = ((machRepByteWidth (localRegRep reg) - 1) `div` wORD_SIZE) + 1 +slot_size reg = + ((machRepByteWidth (localRegRep reg) - 1) `div` wORD_SIZE) + 1 slot_size' :: MachRep -> Int slot_size' reg = ((machRepByteWidth reg - 1) `div` wORD_SIZE) + 1