X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FcodeGen%2FCgExpr.lhs;h=e76289892aa0c072d62d3ddac610856b89ed81e4;hb=354ce4040a514f3016323f2e330c7eac527ce3b2;hp=9dbe3a2212af8af76909cc080e45063d9cf31c88;hpb=74b1006ed8565ff3c39edcdaf859d606dd652641;p=ghc-hetmet.git diff --git a/ghc/compiler/codeGen/CgExpr.lhs b/ghc/compiler/codeGen/CgExpr.lhs index 9dbe3a2..e762898 100644 --- a/ghc/compiler/codeGen/CgExpr.lhs +++ b/ghc/compiler/codeGen/CgExpr.lhs @@ -1,7 +1,7 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: CgExpr.lhs,v 1.20 1999/03/11 11:32:26 simonm Exp $ +% $Id: CgExpr.lhs,v 1.29 1999/06/28 16:29:45 simonpj Exp $ % %******************************************************** %* * @@ -22,10 +22,10 @@ import AbsCUtils ( mkAbstractCs ) import CLabel ( mkClosureTblLabel ) import SMRep ( fixedHdrSize ) -import CgBindery ( getArgAmodes, CgIdInfo, nukeDeadBindings ) +import CgBindery ( getArgAmodes, getArgAmode, CgIdInfo, + nukeDeadBindings, addBindC, addBindsC ) import CgCase ( cgCase, saveVolatileVarsAndRegs, - restoreCurrentCostCentre, - splitTyConAppThroughNewTypes ) + restoreCurrentCostCentre ) import CgClosure ( cgRhsClosure, cgStdRhsClosure ) import CgCon ( buildDynCon, cgReturnDataCon ) import CgLetNoEscape ( cgLetNoEscapeClosure ) @@ -36,7 +36,7 @@ import CgTailCall ( cgTailCall, performReturn, performPrimReturn, ) import ClosureInfo ( mkClosureLFInfo, mkSelectorLFInfo, mkApLFInfo, layOutDynCon ) -import CostCentre ( sccAbleCostCentre, isDictCC, isSccCountCostCentre ) +import CostCentre ( sccAbleCostCentre, isSccCountCostCentre ) import Id ( idPrimRep, idType, Id ) import VarSet import DataCon ( DataCon, dataConTyCon ) @@ -48,7 +48,7 @@ import PrimOp ( primOpOutOfLine, import PrimRep ( getPrimRepSize, PrimRep(..), isFollowableRep ) import TyCon ( maybeTyConSingleCon, isUnboxedTupleTyCon, isEnumerationTyCon ) -import Type ( Type, typePrimRep ) +import Type ( Type, typePrimRep, splitTyConApp_maybe, repType ) import Maybes ( assocMaybe, maybeToBool ) import Unique ( mkBuiltinUnique ) import BasicTypes ( TopLevelFlag(..), RecFlag(..) ) @@ -116,12 +116,32 @@ NOTE about _ccall_GC_: A _ccall_GC_ is treated as an out-of-line primop for the case expression code, because we want a proper stack frame on the stack when we perform it. When we get here, however, we need to actually -perform the call, so we treat it an an inline primop. +perform the call, so we treat it as an inline primop. \begin{code} cgExpr (StgCon (PrimOp op@(CCallOp _ _ may_gc@True _)) args res_ty) = primRetUnboxedTuple op args res_ty +-- tagToEnum# is special: we need to pull the constructor out of the table, +-- and perform an appropriate return. + +cgExpr (StgCon (PrimOp TagToEnumOp) [arg] res_ty) + = ASSERT(isEnumerationTyCon tycon) + getArgAmode arg `thenFC` \amode -> + -- save the tag in a temporary in case amode overlaps + -- with node. + absC (CAssign dyn_tag amode) `thenC` + performReturn ( + CAssign (CReg node) + (CVal (CIndex + (CLbl (mkClosureTblLabel tycon) PtrRep) + dyn_tag PtrRep) PtrRep)) + (\ sequel -> mkDynamicAlgReturnCode tycon dyn_tag sequel) + where + dyn_tag = CTemp (mkBuiltinUnique 0) IntRep + (Just (tycon,_)) = splitTyConApp_maybe res_ty + + cgExpr x@(StgCon (PrimOp op) args res_ty) | primOpOutOfLine op = tailCallPrimOp op args | otherwise @@ -144,7 +164,6 @@ cgExpr x@(StgCon (PrimOp op) args res_ty) ReturnsAlg tycon | isUnboxedTupleTyCon tycon -> primRetUnboxedTuple op args res_ty - | isEnumerationTyCon tycon -> performReturn (COpStmt [dyn_tag] op arg_amodes [{-no vol_regs-}]) @@ -158,9 +177,9 @@ cgExpr x@(StgCon (PrimOp op) args res_ty) -- about to return anyway. dyn_tag = CTemp (mkBuiltinUnique 0) IntRep - closure_lbl = CTableEntry + closure_lbl = CVal (CIndex (CLbl (mkClosureTblLabel tycon) PtrRep) - dyn_tag PtrRep + dyn_tag PtrRep) PtrRep \end{code} @@ -233,7 +252,7 @@ centre. cgExpr (StgSCC cc expr) = ASSERT(sccAbleCostCentre cc) costCentresC - (if isDictCC cc then SLIT("SET_DICT_CCC") else SLIT("SET_CCC")) + SLIT("SET_CCC") [mkCCostCentre cc, mkIntCLit (if isSccCountCostCentre cc then 1 else 0)] `thenC` cgExpr expr @@ -443,7 +462,7 @@ primRetUnboxedTuple op args res_ty allocate some temporaries for the return values. -} let - (tc,ty_args) = case splitTyConAppThroughNewTypes res_ty of + (tc,ty_args) = case splitTyConApp_maybe (repType res_ty) of Nothing -> pprPanic "primRetUnboxedTuple" (ppr res_ty) Just pr -> pr prim_reps = map typePrimRep ty_args