summaryrefslogtreecommitdiff
path: root/compiler/codeGen/CgCallConv.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/codeGen/CgCallConv.hs')
-rw-r--r--compiler/codeGen/CgCallConv.hs59
1 files changed, 31 insertions, 28 deletions
diff --git a/compiler/codeGen/CgCallConv.hs b/compiler/codeGen/CgCallConv.hs
index 45edd64666..e468936a7a 100644
--- a/compiler/codeGen/CgCallConv.hs
+++ b/compiler/codeGen/CgCallConv.hs
@@ -70,7 +70,7 @@ mkArgDescr _nm args
let arg_bits = argBits dflags arg_reps
arg_reps = filter nonVoidArg (map idCgRep args)
-- Getting rid of voids eases matching of standard patterns
- case stdPattern arg_reps of
+ case stdPattern dflags arg_reps of
Just spec_id -> return (ArgSpec spec_id)
Nothing -> return (ArgGen arg_bits)
@@ -79,33 +79,36 @@ argBits _ [] = []
argBits dflags (PtrArg : args) = False : argBits dflags args
argBits dflags (arg : args) = take (cgRepSizeW dflags arg) (repeat True) ++ argBits dflags args
-stdPattern :: [CgRep] -> Maybe StgHalfWord
-stdPattern [] = Just ARG_NONE -- just void args, probably
-
-stdPattern [PtrArg] = Just ARG_P
-stdPattern [FloatArg] = Just ARG_F
-stdPattern [DoubleArg] = Just ARG_D
-stdPattern [LongArg] = Just ARG_L
-stdPattern [NonPtrArg] = Just ARG_N
-
-stdPattern [NonPtrArg,NonPtrArg] = Just ARG_NN
-stdPattern [NonPtrArg,PtrArg] = Just ARG_NP
-stdPattern [PtrArg,NonPtrArg] = Just ARG_PN
-stdPattern [PtrArg,PtrArg] = Just ARG_PP
-
-stdPattern [NonPtrArg,NonPtrArg,NonPtrArg] = Just ARG_NNN
-stdPattern [NonPtrArg,NonPtrArg,PtrArg] = Just ARG_NNP
-stdPattern [NonPtrArg,PtrArg,NonPtrArg] = Just ARG_NPN
-stdPattern [NonPtrArg,PtrArg,PtrArg] = Just ARG_NPP
-stdPattern [PtrArg,NonPtrArg,NonPtrArg] = Just ARG_PNN
-stdPattern [PtrArg,NonPtrArg,PtrArg] = Just ARG_PNP
-stdPattern [PtrArg,PtrArg,NonPtrArg] = Just ARG_PPN
-stdPattern [PtrArg,PtrArg,PtrArg] = Just ARG_PPP
-
-stdPattern [PtrArg,PtrArg,PtrArg,PtrArg] = Just ARG_PPPP
-stdPattern [PtrArg,PtrArg,PtrArg,PtrArg,PtrArg] = Just ARG_PPPPP
-stdPattern [PtrArg,PtrArg,PtrArg,PtrArg,PtrArg,PtrArg] = Just ARG_PPPPPP
-stdPattern _ = Nothing
+stdPattern :: DynFlags -> [CgRep] -> Maybe StgHalfWord
+stdPattern dflags reps
+ = fmap (toStgHalfWord dflags)
+ $ case reps of
+ [] -> Just ARG_NONE -- just void args, probably
+
+ [PtrArg] -> Just ARG_P
+ [FloatArg] -> Just ARG_F
+ [DoubleArg] -> Just ARG_D
+ [LongArg] -> Just ARG_L
+ [NonPtrArg] -> Just ARG_N
+
+ [NonPtrArg,NonPtrArg] -> Just ARG_NN
+ [NonPtrArg,PtrArg] -> Just ARG_NP
+ [PtrArg,NonPtrArg] -> Just ARG_PN
+ [PtrArg,PtrArg] -> Just ARG_PP
+
+ [NonPtrArg,NonPtrArg,NonPtrArg] -> Just ARG_NNN
+ [NonPtrArg,NonPtrArg,PtrArg] -> Just ARG_NNP
+ [NonPtrArg,PtrArg,NonPtrArg] -> Just ARG_NPN
+ [NonPtrArg,PtrArg,PtrArg] -> Just ARG_NPP
+ [PtrArg,NonPtrArg,NonPtrArg] -> Just ARG_PNN
+ [PtrArg,NonPtrArg,PtrArg] -> Just ARG_PNP
+ [PtrArg,PtrArg,NonPtrArg] -> Just ARG_PPN
+ [PtrArg,PtrArg,PtrArg] -> Just ARG_PPP
+
+ [PtrArg,PtrArg,PtrArg,PtrArg] -> Just ARG_PPPP
+ [PtrArg,PtrArg,PtrArg,PtrArg,PtrArg] -> Just ARG_PPPPP
+ [PtrArg,PtrArg,PtrArg,PtrArg,PtrArg,PtrArg] -> Just ARG_PPPPPP
+ _ -> Nothing
-------------------------------------------------------------------------