%
% (c) The GRASP Project, Glasgow University, 1992-1998
%
-% $Id: CgRetConv.lhs,v 1.29 2000/11/14 17:41:04 sewardj Exp $
+% $Id: CgRetConv.lhs,v 1.34 2003/10/09 11:58:46 simonpj Exp $
%
\section[CgRetConv]{Return conventions for the code generator}
mAX_Real_Double_REG, mAX_Real_Long_REG
)
import CmdLineOpts ( opt_Unregisterised )
-import Maybes ( catMaybes )
+import Maybes ( mapCatMaybes )
import PrimRep ( isFloatingRep, PrimRep(..), is64BitRep )
import TyCon ( TyCon, tyConFamilySize )
import Util ( isn'tIn )
ctrlReturnConvAlg tycon
= case (tyConFamilySize tycon) of
- 0 -> pprPanic "ctrlRetConvAlg" (ppr tycon)
size -> -- we're supposed to know...
if (size > (1::Int) && size <= mAX_FAMILY_SIZE_FOR_VEC_RETURNS) then
VectoredReturn size
else
- UnvectoredReturn size
+ UnvectoredReturn size
+ -- NB: unvectored returns Include size 0 (no constructors), so that
+ -- the following perverse code compiles (it crashed GHC in 5.02)
+ -- data T1
+ -- data T2 = T2 !T1 Int
+ -- The only value of type T1 is bottom, which never returns anyway.
\end{code}
%************************************************************************
\begin{code}
dataReturnConvPrim :: PrimRep -> MagicId
+dataReturnConvPrim PtrRep = VanillaReg PtrRep (_ILIT 1)
dataReturnConvPrim IntRep = VanillaReg IntRep (_ILIT 1)
dataReturnConvPrim WordRep = VanillaReg WordRep (_ILIT 1)
+dataReturnConvPrim Int32Rep = VanillaReg Int32Rep (_ILIT 1)
+dataReturnConvPrim Word32Rep = VanillaReg Word32Rep (_ILIT 1)
dataReturnConvPrim Int64Rep = LongReg Int64Rep (_ILIT 1)
dataReturnConvPrim Word64Rep = LongReg Word64Rep (_ILIT 1)
dataReturnConvPrim AddrRep = VanillaReg AddrRep (_ILIT 1)
dataReturnConvPrim Int8Rep = VanillaReg Int8Rep (_ILIT 1)
dataReturnConvPrim FloatRep = FloatReg (_ILIT 1)
dataReturnConvPrim DoubleRep = DoubleReg (_ILIT 1)
+dataReturnConvPrim StablePtrRep = VanillaReg StablePtrRep (_ILIT 1)
dataReturnConvPrim VoidRep = VoidReg
--- Return a primitive-array pointer in the usual register:
-dataReturnConvPrim ArrayRep = VanillaReg ArrayRep (_ILIT 1)
-dataReturnConvPrim ByteArrayRep = VanillaReg ByteArrayRep (_ILIT 1)
-dataReturnConvPrim PrimPtrRep = VanillaReg PrimPtrRep (_ILIT 1)
-dataReturnConvPrim ThreadIdRep = VanillaReg ThreadIdRep (_ILIT 1)
-
-dataReturnConvPrim StablePtrRep = VanillaReg StablePtrRep (_ILIT 1)
-dataReturnConvPrim ForeignObjRep = VanillaReg ForeignObjRep (_ILIT 1)
-dataReturnConvPrim WeakPtrRep = VanillaReg WeakPtrRep (_ILIT 1)
-
#ifdef DEBUG
dataReturnConvPrim rep = pprPanic "dataReturnConvPrim:" (ppr rep)
#endif
mkRegTbl' regs_in_use vanillas floats doubles longs
= (ok_vanilla, ok_float, ok_double, ok_long)
where
- ok_vanilla = catMaybes (map (select (VanillaReg VoidRep)) vanillas)
- ok_float = catMaybes (map (select FloatReg) floats)
- ok_double = catMaybes (map (select DoubleReg) doubles)
- ok_long = catMaybes (map (select (LongReg Int64Rep)) longs)
+ ok_vanilla = mapCatMaybes (select (VanillaReg VoidRep)) vanillas
+ ok_float = mapCatMaybes (select FloatReg) floats
+ ok_double = mapCatMaybes (select DoubleReg) doubles
+ ok_long = mapCatMaybes (select (LongReg Int64Rep)) longs
-- rep isn't looked at, hence we can use any old rep.
select :: (FastInt -> MagicId) -> Int{-cand-} -> Maybe Int