2 Builtins(..), sumTyCon, prodTyCon,
3 combinePAVar, scalarZip, closureCtrFun,
4 initBuiltins, initBuiltinVars, initBuiltinTyCons, initBuiltinDataCons,
5 initBuiltinPAs, initBuiltinPRs,
6 initBuiltinBoxedTyCons, initBuiltinScalars,
12 import IfaceEnv ( lookupOrig )
15 import DataCon ( DataCon, dataConName, dataConWorkId )
16 import TyCon ( TyCon, tyConName, tyConDataCons )
17 import Class ( Class )
19 import Id ( mkSysLocal )
20 import Name ( Name, getOccString )
24 import TypeRep ( funTyCon )
25 import Type ( Type, mkTyConApp )
27 import TysWiredIn ( unitTyCon, unitDataCon,
29 intTyCon, intTyConName,
30 doubleTyCon, doubleTyConName,
31 boolTyCon, boolTyConName, trueDataCon, falseDataCon,
33 import PrelNames ( word8TyConName, gHC_PARR )
34 import BasicTypes ( Boxity(..) )
40 import Control.Monad ( liftM, zipWithM )
41 import Data.List ( unzip4 )
49 mAX_DPH_COMBINE :: Int
52 mAX_DPH_SCALAR_ARGS :: Int
53 mAX_DPH_SCALAR_ARGS = 3
55 data Modules = Modules {
58 , dph_Closure :: Module
59 , dph_Unboxed :: Module
60 , dph_Instances :: Module
61 , dph_Combinators :: Module
62 , dph_Scalar :: Module
63 , dph_Prelude_PArr :: Module
64 , dph_Prelude_Int :: Module
65 , dph_Prelude_Word8 :: Module
66 , dph_Prelude_Double :: Module
67 , dph_Prelude_Bool :: Module
68 , dph_Prelude_Tuple :: Module
71 dph_Modules :: PackageId -> Modules
72 dph_Modules pkg = Modules {
73 dph_PArray = mk (fsLit "Data.Array.Parallel.Lifted.PArray")
74 , dph_Repr = mk (fsLit "Data.Array.Parallel.Lifted.Repr")
75 , dph_Closure = mk (fsLit "Data.Array.Parallel.Lifted.Closure")
76 , dph_Unboxed = mk (fsLit "Data.Array.Parallel.Lifted.Unboxed")
77 , dph_Instances = mk (fsLit "Data.Array.Parallel.Lifted.Instances")
78 , dph_Combinators = mk (fsLit "Data.Array.Parallel.Lifted.Combinators")
79 , dph_Scalar = mk (fsLit "Data.Array.Parallel.Lifted.Scalar")
81 , dph_Prelude_PArr = mk (fsLit "Data.Array.Parallel.Prelude.Base.PArr")
82 , dph_Prelude_Int = mk (fsLit "Data.Array.Parallel.Prelude.Base.Int")
83 , dph_Prelude_Word8 = mk (fsLit "Data.Array.Parallel.Prelude.Base.Word8")
84 , dph_Prelude_Double = mk (fsLit "Data.Array.Parallel.Prelude.Base.Double")
85 , dph_Prelude_Bool = mk (fsLit "Data.Array.Parallel.Prelude.Base.Bool")
86 , dph_Prelude_Tuple = mk (fsLit "Data.Array.Parallel.Prelude.Base.Tuple")
89 mk = mkModule pkg . mkModuleNameFS
92 data Builtins = Builtins {
94 , parrayTyCon :: TyCon
96 , paDataCon :: DataCon
99 , prDataCon :: DataCon
100 , intPrimArrayTy :: Type
103 , enumerationTyCon :: TyCon
104 , sumTyCons :: Array Int TyCon
105 , closureTyCon :: TyCon
108 , mkClosureVar :: Var
109 , applyClosureVar :: Var
110 , mkClosurePVar :: Var
111 , applyClosurePVar :: Var
112 , replicatePAIntPrimVar :: Var
113 , upToPAIntPrimVar :: Var
114 , selectPAIntPrimVar :: Var
115 , truesPABoolPrimVar :: Var
117 , replicatePAVar :: Var
120 , combinePAVars :: Array Int Var
121 , scalarClass :: Class
122 , scalarZips :: Array Int Var
123 , closureCtrFuns :: Array Int Var
124 , liftingContext :: Var
127 sumTyCon :: Int -> Builtins -> TyCon
129 | n >= 2 && n <= mAX_DPH_SUM = sumTyCons bi ! n
130 | otherwise = pprPanic "sumTyCon" (ppr n)
132 prodTyCon :: Int -> Builtins -> TyCon
134 | n == 1 = wrapTyCon bi
135 | n >= 0 && n <= mAX_DPH_PROD = tupleTyCon Boxed n
136 | otherwise = pprPanic "prodTyCon" (ppr n)
138 combinePAVar :: Int -> Builtins -> Var
140 | n >= 2 && n <= mAX_DPH_COMBINE = combinePAVars bi ! n
141 | otherwise = pprPanic "combinePAVar" (ppr n)
143 scalarZip :: Int -> Builtins -> Var
145 | n >= 1 && n <= mAX_DPH_SCALAR_ARGS = scalarZips bi ! n
146 | otherwise = pprPanic "scalarZip" (ppr n)
148 closureCtrFun :: Int -> Builtins -> Var
150 | n >= 1 && n <= mAX_DPH_SCALAR_ARGS = closureCtrFuns bi ! n
151 | otherwise = pprPanic "closureCtrFun" (ppr n)
153 initBuiltins :: PackageId -> DsM Builtins
156 parrayTyCon <- externalTyCon dph_PArray (fsLit "PArray")
157 paTyCon <- externalTyCon dph_PArray (fsLit "PA")
158 let [paDataCon] = tyConDataCons paTyCon
159 preprTyCon <- externalTyCon dph_PArray (fsLit "PRepr")
160 prTyCon <- externalTyCon dph_PArray (fsLit "PR")
161 let [prDataCon] = tyConDataCons prTyCon
162 intPrimArrayTy <- externalType dph_Unboxed (fsLit "PArray_Int#")
163 closureTyCon <- externalTyCon dph_Closure (fsLit ":->")
165 voidTyCon <- externalTyCon dph_Repr (fsLit "Void")
166 wrapTyCon <- externalTyCon dph_Repr (fsLit "Wrap")
167 enumerationTyCon <- externalTyCon dph_Repr (fsLit "Enumeration")
168 sum_tcs <- mapM (externalTyCon dph_Repr)
169 [mkFastString ("Sum" ++ show i) | i <- [2..mAX_DPH_SUM]]
171 let sumTyCons = listArray (2, mAX_DPH_SUM) sum_tcs
173 voidVar <- externalVar dph_Repr (fsLit "void")
174 mkPRVar <- externalVar dph_PArray (fsLit "mkPR")
175 mkClosureVar <- externalVar dph_Closure (fsLit "mkClosure")
176 applyClosureVar <- externalVar dph_Closure (fsLit "$:")
177 mkClosurePVar <- externalVar dph_Closure (fsLit "mkClosureP")
178 applyClosurePVar <- externalVar dph_Closure (fsLit "$:^")
179 replicatePAIntPrimVar <- externalVar dph_Unboxed (fsLit "replicatePA_Int#")
180 upToPAIntPrimVar <- externalVar dph_Unboxed (fsLit "upToPA_Int#")
181 selectPAIntPrimVar <- externalVar dph_Unboxed (fsLit "selectPA_Int#")
182 truesPABoolPrimVar <- externalVar dph_Unboxed (fsLit "truesPA_Bool#")
183 lengthPAVar <- externalVar dph_PArray (fsLit "lengthPA#")
184 replicatePAVar <- externalVar dph_PArray (fsLit "replicatePA#")
185 emptyPAVar <- externalVar dph_PArray (fsLit "emptyPA")
186 packPAVar <- externalVar dph_PArray (fsLit "packPA#")
188 combines <- mapM (externalVar dph_PArray)
189 [mkFastString ("combine" ++ show i ++ "PA#")
190 | i <- [2..mAX_DPH_COMBINE]]
191 let combinePAVars = listArray (2, mAX_DPH_COMBINE) combines
193 scalarClass <- externalClass dph_Scalar (fsLit "Scalar")
194 scalar_map <- externalVar dph_Scalar (fsLit "scalar_map")
195 scalar_zip2 <- externalVar dph_Scalar (fsLit "scalar_zipWith")
196 scalar_zips <- mapM (externalVar dph_Scalar)
197 [mkFastString ("scalar_zipWith" ++ show i)
198 | i <- [3 .. mAX_DPH_SCALAR_ARGS]]
199 let scalarZips = listArray (1, mAX_DPH_SCALAR_ARGS)
200 (scalar_map : scalar_zip2 : scalar_zips)
201 closures <- mapM (externalVar dph_Closure)
202 [mkFastString ("closure" ++ show i)
203 | i <- [1 .. mAX_DPH_SCALAR_ARGS]]
204 let closureCtrFuns = listArray (1, mAX_DPH_COMBINE) closures
206 liftingContext <- liftM (\u -> mkSysLocal (fsLit "lc") u intPrimTy)
211 , parrayTyCon = parrayTyCon
213 , paDataCon = paDataCon
214 , preprTyCon = preprTyCon
216 , prDataCon = prDataCon
217 , intPrimArrayTy = intPrimArrayTy
218 , voidTyCon = voidTyCon
219 , wrapTyCon = wrapTyCon
220 , enumerationTyCon = enumerationTyCon
221 , sumTyCons = sumTyCons
222 , closureTyCon = closureTyCon
225 , mkClosureVar = mkClosureVar
226 , applyClosureVar = applyClosureVar
227 , mkClosurePVar = mkClosurePVar
228 , applyClosurePVar = applyClosurePVar
229 , replicatePAIntPrimVar = replicatePAIntPrimVar
230 , upToPAIntPrimVar = upToPAIntPrimVar
231 , selectPAIntPrimVar = selectPAIntPrimVar
232 , truesPABoolPrimVar = truesPABoolPrimVar
233 , lengthPAVar = lengthPAVar
234 , replicatePAVar = replicatePAVar
235 , emptyPAVar = emptyPAVar
236 , packPAVar = packPAVar
237 , combinePAVars = combinePAVars
238 , scalarClass = scalarClass
239 , scalarZips = scalarZips
240 , closureCtrFuns = closureCtrFuns
241 , liftingContext = liftingContext
245 dph_PArray = dph_PArray
246 , dph_Repr = dph_Repr
247 , dph_Closure = dph_Closure
248 , dph_Unboxed = dph_Unboxed
249 , dph_Scalar = dph_Scalar
254 initBuiltinVars :: Builtins -> DsM [(Var, Var)]
255 initBuiltinVars (Builtins { dphModules = mods })
257 uvars <- zipWithM externalVar umods ufs
258 vvars <- zipWithM externalVar vmods vfs
259 cvars <- zipWithM externalVar cmods cfs
260 return $ [(v,v) | v <- map dataConWorkId defaultDataConWorkers]
261 ++ zip (map dataConWorkId cons) cvars
264 (umods, ufs, vmods, vfs) = unzip4 (preludeVars mods)
266 (cons, cmods, cfs) = unzip3 (preludeDataCons mods)
268 defaultDataConWorkers :: [DataCon]
269 defaultDataConWorkers = [trueDataCon, falseDataCon, unitDataCon]
271 preludeDataCons :: Modules -> [(DataCon, Module, FastString)]
272 preludeDataCons (Modules { dph_Prelude_Tuple = dph_Prelude_Tuple })
273 = [mk_tup n dph_Prelude_Tuple (mkFastString $ "tup" ++ show n) | n <- [2..3]]
275 mk_tup n mod name = (tupleCon Boxed n, mod, name)
277 preludeVars :: Modules -> [(Module, FastString, Module, FastString)]
278 preludeVars (Modules { dph_Combinators = dph_Combinators
279 , dph_PArray = dph_PArray
280 , dph_Prelude_Int = dph_Prelude_Int
281 , dph_Prelude_Word8 = dph_Prelude_Word8
282 , dph_Prelude_Double = dph_Prelude_Double
283 , dph_Prelude_Bool = dph_Prelude_Bool
284 , dph_Prelude_PArr = dph_Prelude_PArr
287 mk gHC_PARR (fsLit "mapP") dph_Combinators (fsLit "mapPA")
288 , mk gHC_PARR (fsLit "zipWithP") dph_Combinators (fsLit "zipWithPA")
289 , mk gHC_PARR (fsLit "zipP") dph_Combinators (fsLit "zipPA")
290 , mk gHC_PARR (fsLit "unzipP") dph_Combinators (fsLit "unzipPA")
291 , mk gHC_PARR (fsLit "filterP") dph_Combinators (fsLit "filterPA")
292 , mk gHC_PARR (fsLit "lengthP") dph_Combinators (fsLit "lengthPA")
293 , mk gHC_PARR (fsLit "replicateP") dph_Combinators (fsLit "replicatePA")
294 , mk gHC_PARR (fsLit "!:") dph_Combinators (fsLit "indexPA")
295 , mk gHC_PARR (fsLit "crossMapP") dph_Combinators (fsLit "crossMapPA")
296 , mk gHC_PARR (fsLit "singletonP") dph_Combinators (fsLit "singletonPA")
297 , mk gHC_PARR (fsLit "concatP") dph_Combinators (fsLit "concatPA")
298 , mk gHC_PARR (fsLit "+:+") dph_Combinators (fsLit "appPA")
299 , mk gHC_PARR (fsLit "emptyP") dph_PArray (fsLit "emptyPA")
301 , mk' dph_Prelude_Int "div" "divV"
302 , mk' dph_Prelude_Int "mod" "modV"
303 , mk' dph_Prelude_Int "sqrt" "sqrtV"
304 , mk' dph_Prelude_Int "enumFromToP" "enumFromToPA"
305 , mk' dph_Prelude_Int "upToP" "upToPA"
307 ++ vars_Ord dph_Prelude_Int
308 ++ vars_Num dph_Prelude_Int
310 ++ vars_Ord dph_Prelude_Word8
311 ++ vars_Num dph_Prelude_Word8
313 [ mk' dph_Prelude_Word8 "div" "divV"
314 , mk' dph_Prelude_Word8 "mod" "modV"
315 , mk' dph_Prelude_Word8 "fromInt" "fromIntV"
316 , mk' dph_Prelude_Word8 "toInt" "toIntV"
319 ++ vars_Ord dph_Prelude_Double
320 ++ vars_Num dph_Prelude_Double
321 ++ vars_Fractional dph_Prelude_Double
322 ++ vars_Floating dph_Prelude_Double
323 ++ vars_RealFrac dph_Prelude_Double
325 [ mk dph_Prelude_Bool (fsLit "andP") dph_Prelude_Bool (fsLit "andPA")
326 , mk dph_Prelude_Bool (fsLit "orP") dph_Prelude_Bool (fsLit "orPA")
329 , mk dph_Prelude_PArr (fsLit "fromPArrayP") dph_Prelude_PArr (fsLit "fromPArrayPA")
330 , mk dph_Prelude_PArr (fsLit "toPArrayP") dph_Prelude_PArr (fsLit "toPArrayPA")
331 , mk dph_Prelude_PArr (fsLit "fromNestedPArrayP") dph_Prelude_PArr (fsLit "fromNestedPArrayPA")
332 , mk dph_Prelude_PArr (fsLit "combineP") dph_Combinators (fsLit "combine2PA")
336 mk' mod v v' = mk mod (fsLit v) mod (fsLit v')
338 vars_Ord mod = [mk' mod "==" "eqV"
344 ,mk' mod "min" "minV"
345 ,mk' mod "max" "maxV"
346 ,mk' mod "minimumP" "minimumPA"
347 ,mk' mod "maximumP" "maximumPA"
348 ,mk' mod "minIndexP" "minIndexPA"
349 ,mk' mod "maxIndexP" "maxIndexPA"
352 vars_Num mod = [mk' mod "+" "plusV"
353 ,mk' mod "-" "minusV"
355 ,mk' mod "negate" "negateV"
356 ,mk' mod "abs" "absV"
357 ,mk' mod "sumP" "sumPA"
358 ,mk' mod "productP" "productPA"
361 vars_Fractional mod = [mk' mod "/" "divideV"
362 ,mk' mod "recip" "recipV"
365 vars_Floating mod = [mk' mod "pi" "pi"
366 ,mk' mod "exp" "expV"
367 ,mk' mod "sqrt" "sqrtV"
368 ,mk' mod "log" "logV"
369 ,mk' mod "sin" "sinV"
370 ,mk' mod "tan" "tanV"
371 ,mk' mod "cos" "cosV"
372 ,mk' mod "asin" "asinV"
373 ,mk' mod "atan" "atanV"
374 ,mk' mod "acos" "acosV"
375 ,mk' mod "sinh" "sinhV"
376 ,mk' mod "tanh" "tanhV"
377 ,mk' mod "cosh" "coshV"
378 ,mk' mod "asinh" "asinhV"
379 ,mk' mod "atanh" "atanhV"
380 ,mk' mod "acosh" "acoshV"
382 ,mk' mod "logBase" "logBaseV"
385 vars_RealFrac mod = [mk' mod "fromInt" "fromIntV"
386 ,mk' mod "truncate" "truncateV"
387 ,mk' mod "round" "roundV"
388 ,mk' mod "ceiling" "ceilingV"
389 ,mk' mod "floor" "floorV"
392 initBuiltinTyCons :: Builtins -> DsM [(Name, TyCon)]
395 -- parr <- externalTyCon dph_Prelude_PArr (fsLit "PArr")
396 dft_tcs <- defaultTyCons
397 return $ (tyConName funTyCon, closureTyCon bi)
398 : (parrTyConName, parrayTyCon bi)
401 : (tyConName $ parrayTyCon bi, parrayTyCon bi)
403 : [(tyConName tc, tc) | tc <- dft_tcs]
405 defaultTyCons :: DsM [TyCon]
408 word8 <- dsLookupTyCon word8TyConName
409 return [intTyCon, boolTyCon, doubleTyCon, word8]
411 initBuiltinDataCons :: Builtins -> [(Name, DataCon)]
412 initBuiltinDataCons _ = [(dataConName dc, dc)| dc <- defaultDataCons]
414 defaultDataCons :: [DataCon]
415 defaultDataCons = [trueDataCon, falseDataCon, unitDataCon]
417 initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)]
420 dicts <- zipWithM externalVar mods fss
421 return $ zip tcs dicts
423 (tcs, mods, fss) = unzip3 ps
425 initBuiltinPAs :: Builtins -> DsM [(Name, Var)]
426 initBuiltinPAs = initBuiltinDicts . builtinPAs
428 builtinPAs :: Builtins -> [(Name, Module, FastString)]
429 builtinPAs bi@(Builtins { dphModules = mods })
431 mk (tyConName $ closureTyCon bi) (dph_Closure mods) (fsLit "dPA_Clo")
432 , mk (tyConName $ voidTyCon bi) (dph_Repr mods) (fsLit "dPA_Void")
433 , mk (tyConName $ parrayTyCon bi) (dph_Instances mods) (fsLit "dPA_PArray")
434 , mk unitTyConName (dph_Instances mods) (fsLit "dPA_Unit")
436 , mk intTyConName (dph_Instances mods) (fsLit "dPA_Int")
437 , mk word8TyConName (dph_Instances mods) (fsLit "dPA_Word8")
438 , mk doubleTyConName (dph_Instances mods) (fsLit "dPA_Double")
439 , mk boolTyConName (dph_Instances mods) (fsLit "dPA_Bool")
443 mk name mod fs = (name, mod, fs)
445 tups = map mk_tup [2..mAX_DPH_PROD]
446 mk_tup n = mk (tyConName $ tupleTyCon Boxed n)
448 (mkFastString $ "dPA_" ++ show n)
450 initBuiltinPRs :: Builtins -> DsM [(Name, Var)]
451 initBuiltinPRs = initBuiltinDicts . builtinPRs
453 builtinPRs :: Builtins -> [(Name, Module, FastString)]
454 builtinPRs bi@(Builtins { dphModules = mods }) =
456 mk (tyConName unitTyCon) (dph_Repr mods) (fsLit "dPR_Unit")
457 , mk (tyConName $ voidTyCon bi) (dph_Repr mods) (fsLit "dPR_Void")
458 , mk (tyConName $ wrapTyCon bi) (dph_Repr mods) (fsLit "dPR_Wrap")
459 , mk (tyConName $ enumerationTyCon bi) (dph_Repr mods) (fsLit "dPR_Enumeration")
460 , mk (tyConName $ closureTyCon bi) (dph_Closure mods) (fsLit "dPR_Clo")
463 , mk intTyConName (dph_Instances mods) (fsLit "dPR_Int")
464 , mk word8TyConName (dph_Instances mods) (fsLit "dPR_Word8")
465 , mk doubleTyConName (dph_Instances mods) (fsLit "dPR_Double")
468 ++ map mk_sum [2..mAX_DPH_SUM]
469 ++ map mk_prod [2..mAX_DPH_PROD]
471 mk name mod fs = (name, mod, fs)
473 mk_sum n = (tyConName $ sumTyCon n bi, dph_Repr mods,
474 mkFastString ("dPR_Sum" ++ show n))
476 mk_prod n = (tyConName $ prodTyCon n bi, dph_Repr mods,
477 mkFastString ("dPR_" ++ show n))
479 initBuiltinBoxedTyCons :: Builtins -> DsM [(Name, TyCon)]
480 initBuiltinBoxedTyCons = return . builtinBoxedTyCons
482 builtinBoxedTyCons :: Builtins -> [(Name, TyCon)]
483 builtinBoxedTyCons _ =
484 [(tyConName intPrimTyCon, intTyCon)]
487 initBuiltinScalars :: Builtins -> DsM [Var]
488 initBuiltinScalars bi
489 = mapM (uncurry externalVar) (preludeScalars $ dphModules bi)
492 preludeScalars :: Modules -> [(Module, FastString)]
493 preludeScalars (Modules { dph_Prelude_Int = dph_Prelude_Int
494 , dph_Prelude_Word8 = dph_Prelude_Word8
495 , dph_Prelude_Double = dph_Prelude_Double
498 mk dph_Prelude_Int "div"
499 , mk dph_Prelude_Int "mod"
500 , mk dph_Prelude_Int "sqrt"
502 ++ scalars_Ord dph_Prelude_Int
503 ++ scalars_Num dph_Prelude_Int
505 ++ scalars_Ord dph_Prelude_Word8
506 ++ scalars_Num dph_Prelude_Word8
508 [ mk dph_Prelude_Word8 "div"
509 , mk dph_Prelude_Word8 "mod"
510 , mk dph_Prelude_Word8 "fromInt"
511 , mk dph_Prelude_Word8 "toInt"
514 ++ scalars_Ord dph_Prelude_Double
515 ++ scalars_Num dph_Prelude_Double
516 ++ scalars_Fractional dph_Prelude_Double
517 ++ scalars_Floating dph_Prelude_Double
518 ++ scalars_RealFrac dph_Prelude_Double
520 mk mod s = (mod, fsLit s)
522 scalars_Ord mod = [mk mod "=="
532 scalars_Num mod = [mk mod "+"
539 scalars_Fractional mod = [mk mod "/"
543 scalars_Floating mod = [mk mod "pi"
563 scalars_RealFrac mod = [mk mod "fromInt"
571 externalVar :: Module -> FastString -> DsM Var
573 = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs)
575 externalTyCon :: Module -> FastString -> DsM TyCon
577 = dsLookupTyCon =<< lookupOrig mod (mkTcOccFS fs)
579 externalType :: Module -> FastString -> DsM Type
582 tycon <- externalTyCon mod fs
583 return $ mkTyConApp tycon []
585 externalClass :: Module -> FastString -> DsM Class
587 = dsLookupClass =<< lookupOrig mod (mkTcOccFS fs)
589 unitTyConName :: Name
590 unitTyConName = tyConName unitTyCon
593 primMethod :: TyCon -> String -> Builtins -> DsM (Maybe Var)
594 primMethod tycon method (Builtins { dphModules = mods })
595 | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
597 $ dsLookupGlobalId =<< lookupOrig (dph_Unboxed mods)
598 (mkVarOcc $ method ++ suffix)
600 | otherwise = return Nothing
602 primPArray :: TyCon -> Builtins -> DsM (Maybe TyCon)
603 primPArray tycon (Builtins { dphModules = mods })
604 | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
606 $ dsLookupTyCon =<< lookupOrig (dph_Unboxed mods)
607 (mkTcOcc $ "PArray" ++ suffix)
609 | otherwise = return Nothing
611 prim_ty_cons :: NameEnv String
612 prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon]
614 mk_prim tycon = (tyConName tycon, '_' : getOccString tycon)