diff options
Diffstat (limited to 'utils/genapply/GenApply.hs')
-rw-r--r-- | utils/genapply/GenApply.hs | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/utils/genapply/GenApply.hs b/utils/genapply/GenApply.hs index 33146b2a2c..2baf85896a 100644 --- a/utils/genapply/GenApply.hs +++ b/utils/genapply/GenApply.hs @@ -26,29 +26,32 @@ import System.IO -- Argument kinds (rougly equivalent to PrimRep) data ArgRep - = N -- non-ptr - | P -- ptr - | V -- void - | F -- float - | D -- double - | L -- long (64-bit) + = N -- non-ptr + | P -- ptr + | V -- void + | F -- float + | D -- double + | L -- long (64-bit) + | V16 -- 16-byte (128-bit) vectors -- size of a value in *words* argSize :: ArgRep -> Int -argSize N = 1 -argSize P = 1 -argSize V = 0 -argSize F = 1 -argSize D = (SIZEOF_DOUBLE `quot` SIZEOF_VOID_P :: Int) -argSize L = (8 `quot` SIZEOF_VOID_P :: Int) - -showArg :: ArgRep -> Char -showArg N = 'n' -showArg P = 'p' -showArg V = 'v' -showArg F = 'f' -showArg D = 'd' -showArg L = 'l' +argSize N = 1 +argSize P = 1 +argSize V = 0 +argSize F = 1 +argSize D = (SIZEOF_DOUBLE `quot` SIZEOF_VOID_P :: Int) +argSize L = (8 `quot` SIZEOF_VOID_P :: Int) +argSize V16 = (16 `quot` SIZEOF_VOID_P :: Int) + +showArg :: ArgRep -> String +showArg N = "n" +showArg P = "p" +showArg V = "v" +showArg F = "f" +showArg D = "d" +showArg L = "l" +showArg V16 = "v16" -- is a value a pointer? isPtr :: ArgRep -> Bool @@ -174,7 +177,7 @@ mkBitmap args = foldr f 0 args -- when we start passing args to stg_ap_* in regs). mkApplyName args - = text "stg_ap_" <> text (map showArg args) + = text "stg_ap_" <> text (concatMap showArg args) mkApplyRetName args = mkApplyName args <> text "_ret" @@ -496,11 +499,12 @@ formalParam arg n = text "arg" <> int n <> text ", " formalParamType arg = argRep arg -argRep F = text "F_" -argRep D = text "D_" -argRep L = text "L_" -argRep P = text "gcptr" -argRep _ = text "W_" +argRep F = text "F_" +argRep D = text "D_" +argRep L = text "L_" +argRep P = text "gcptr" +argRep V16 = text "V16_" +argRep _ = text "W_" genApply regstatus args = let @@ -758,7 +762,7 @@ genApplyFast regstatus args = -- void arguments. mkStackApplyEntryLabel:: [ArgRep] -> Doc -mkStackApplyEntryLabel args = text "stg_ap_stk_" <> text (map showArg args) +mkStackApplyEntryLabel args = text "stg_ap_stk_" <> text (concatMap showArg args) genStackApply :: RegStatus -> [ArgRep] -> Doc genStackApply regstatus args = @@ -783,7 +787,7 @@ genStackApply regstatus args = -- in HeapStackCheck.hc for more details. mkStackSaveEntryLabel :: [ArgRep] -> Doc -mkStackSaveEntryLabel args = text "stg_stk_save_" <> text (map showArg args) +mkStackSaveEntryLabel args = text "stg_stk_save_" <> text (concatMap showArg args) genStackSave :: RegStatus -> [ArgRep] -> Doc genStackSave regstatus args = @@ -849,6 +853,7 @@ applyTypes = [ [F], [D], [L], + [V16], [N], [P], [P,V], @@ -865,6 +870,10 @@ applyTypes = [ -- ToDo: the stack apply and stack save code doesn't make a distinction -- between N and P (they both live in the same register), only the bitmap -- changes, so we could share the apply/save code between lots of cases. +-- +-- NOTE: other places to change if you change stackApplyTypes: +-- - includes/rts/storage/FunTypes.h +-- - compiler/codeGen/CgCallConv.lhs: stdPattern stackApplyTypes = [ [], [N], @@ -872,6 +881,7 @@ stackApplyTypes = [ [F], [D], [L], + [V16], [N,N], [N,P], [P,N], |