2 -- WARNING: This module is a temporary kludge. It will soon go away entirely (once
3 -- VECTORISE SCALAR pragmas are fully implemented.)
5 -- | Mapping of prelude functions to vectorised versions.
6 -- Functions like filterP currently have a working but naive version in GHC.PArr
7 -- During vectorisation we replace these by calls to filterPA, which are
8 -- defined in dph-common Data.Array.Parallel.Lifted.Combinators
10 -- As renamer only sees the GHC.PArr functions, if you want to add a new function
11 -- to the vectoriser there has to be a definition for it in GHC.PArr, even though
12 -- it will never be used at runtime.
14 module Vectorise.Builtins.Prelude
18 import Vectorise.Builtins.Modules
24 preludeVars :: Modules
25 -> [( Module, FastString -- Maps the original variable to the one in the DPH
26 , Module, FastString)] -- packages that it should be rewritten to.
27 preludeVars (Modules { dph_Combinators = _dph_Combinators
28 , dph_Prelude_Int = dph_Prelude_Int
29 , dph_Prelude_Word8 = dph_Prelude_Word8
30 , dph_Prelude_Double = dph_Prelude_Double
31 , dph_Prelude_Bool = dph_Prelude_Bool
35 -- Map scalar functions to versions using closures.
36 mk' dph_Prelude_Int "div" "divV"
37 , mk' dph_Prelude_Int "mod" "modV"
38 , mk' dph_Prelude_Int "sqrt" "sqrtV"
39 , mk' dph_Prelude_Int "enumFromToP" "enumFromToPA"
41 ++ vars_Ord dph_Prelude_Int
42 ++ vars_Num dph_Prelude_Int
44 ++ vars_Ord dph_Prelude_Word8
45 ++ vars_Num dph_Prelude_Word8
47 [ mk' dph_Prelude_Word8 "div" "divV"
48 , mk' dph_Prelude_Word8 "mod" "modV"
49 , mk' dph_Prelude_Word8 "fromInt" "fromIntV"
50 , mk' dph_Prelude_Word8 "toInt" "toIntV"
53 ++ vars_Ord dph_Prelude_Double
54 ++ vars_Num dph_Prelude_Double
55 ++ vars_Fractional dph_Prelude_Double
56 ++ vars_Floating dph_Prelude_Double
57 ++ vars_RealFrac dph_Prelude_Double
59 [ mk dph_Prelude_Bool (fsLit "andP") dph_Prelude_Bool (fsLit "andPA")
60 , mk dph_Prelude_Bool (fsLit "orP") dph_Prelude_Bool (fsLit "orPA")
62 , mk gHC_CLASSES (fsLit "not") dph_Prelude_Bool (fsLit "notV")
63 , mk gHC_CLASSES (fsLit "&&") dph_Prelude_Bool (fsLit "andV")
64 , mk gHC_CLASSES (fsLit "||") dph_Prelude_Bool (fsLit "orV")
68 mk' mod v v' = mk mod (fsLit v) mod (fsLit v')
71 = [ mk' mod "==" "eqV"
77 , mk' mod "min" "minV"
78 , mk' mod "max" "maxV"
79 , mk' mod "minimumP" "minimumPA"
80 , mk' mod "maximumP" "maximumPA"
81 , mk' mod "minIndexP" "minIndexPA"
82 , mk' mod "maxIndexP" "maxIndexPA"
86 = [ mk' mod "+" "plusV"
87 , mk' mod "-" "minusV"
89 , mk' mod "negate" "negateV"
90 , mk' mod "abs" "absV"
91 , mk' mod "sumP" "sumPA"
92 , mk' mod "productP" "productPA"
96 = [ mk' mod "/" "divideV"
97 , mk' mod "recip" "recipV"
101 = [ mk' mod "pi" "pi"
102 , mk' mod "exp" "expV"
103 , mk' mod "sqrt" "sqrtV"
104 , mk' mod "log" "logV"
105 , mk' mod "sin" "sinV"
106 , mk' mod "tan" "tanV"
107 , mk' mod "cos" "cosV"
108 , mk' mod "asin" "asinV"
109 , mk' mod "atan" "atanV"
110 , mk' mod "acos" "acosV"
111 , mk' mod "sinh" "sinhV"
112 , mk' mod "tanh" "tanhV"
113 , mk' mod "cosh" "coshV"
114 , mk' mod "asinh" "asinhV"
115 , mk' mod "atanh" "atanhV"
116 , mk' mod "acosh" "acoshV"
117 , mk' mod "**" "powV"
118 , mk' mod "logBase" "logBaseV"
122 = [ mk' mod "fromInt" "fromIntV"
123 , mk' mod "truncate" "truncateV"
124 , mk' mod "round" "roundV"
125 , mk' mod "ceiling" "ceilingV"
126 , mk' mod "floor" "floorV"
129 preludeScalars :: Modules -> [(Module, FastString)]
130 preludeScalars (Modules { dph_Prelude_Int = dph_Prelude_Int
131 , dph_Prelude_Word8 = dph_Prelude_Word8
132 , dph_Prelude_Double = dph_Prelude_Double
134 = [ mk dph_Prelude_Int "div"
135 , mk dph_Prelude_Int "mod"
136 , mk dph_Prelude_Int "sqrt"
138 ++ scalars_Ord dph_Prelude_Int
139 ++ scalars_Num dph_Prelude_Int
141 ++ scalars_Ord dph_Prelude_Word8
142 ++ scalars_Num dph_Prelude_Word8
144 [ mk dph_Prelude_Word8 "div"
145 , mk dph_Prelude_Word8 "mod"
146 , mk dph_Prelude_Word8 "fromInt"
147 , mk dph_Prelude_Word8 "toInt"
150 ++ scalars_Ord dph_Prelude_Double
151 ++ scalars_Num dph_Prelude_Double
152 ++ scalars_Fractional dph_Prelude_Double
153 ++ scalars_Floating dph_Prelude_Double
154 ++ scalars_RealFrac dph_Prelude_Double
156 mk mod s = (mod, fsLit s)
177 scalars_Fractional mod