X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FConstants.lhs;h=091a7de4dc19ee475407289ec19e3a63fc787638;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=f5538ce500708a03e28ee40eef79e60dd837dbf3;hpb=8ed11e08a598c6fb6bc77e2cf1c8e74af397476d;p=ghc-hetmet.git diff --git a/ghc/compiler/main/Constants.lhs b/ghc/compiler/main/Constants.lhs index f5538ce..091a7de 100644 --- a/ghc/compiler/main/Constants.lhs +++ b/ghc/compiler/main/Constants.lhs @@ -1,70 +1,10 @@ % -% (c) The GRASP/AQUA Project, Glasgow University, 1992-1994 +% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section[Constants]{Info about this compilation} -!!!!! THIS CODE MUST AGREE WITH SMinterface.h !!!!!! - -*** This SHOULD BE the only module that is CPP'd with "stgdefs.h" stuff. - \begin{code} -module Constants ( - uNFOLDING_USE_THRESHOLD, - uNFOLDING_CREATION_THRESHOLD, - iNTERFACE_UNFOLD_THRESHOLD, - lIBERATE_CASE_THRESHOLD, - uNFOLDING_CHEAP_OP_COST, - uNFOLDING_DEAR_OP_COST, - uNFOLDING_NOREP_LIT_COST, - uNFOLDING_CON_DISCOUNT_WEIGHT, - uNFOLDING_KEENESS_FACTOR, - - mAX_SPEC_ALL_PTRS, - mAX_SPEC_ALL_NONPTRS, - mAX_SPEC_MIXED_FIELDS, - mAX_SPEC_SELECTEE_SIZE, - - tARGET_MIN_INT, tARGET_MAX_INT, - - mIN_UPD_SIZE, - mIN_SIZE_NonUpdHeapObject, - mIN_SIZE_NonUpdStaticHeapObject, - - mAX_FAMILY_SIZE_FOR_VEC_RETURNS, - - sTD_UF_SIZE, cON_UF_SIZE, - sCC_STD_UF_SIZE, sCC_CON_UF_SIZE, - uF_RET, - uF_SUB, - uF_SUA, - uF_UPDATEE, - uF_COST_CENTRE, - - mAX_Vanilla_REG, - mAX_Float_REG, - mAX_Double_REG, - mAX_Long_REG, - - mIN_MP_INT_SIZE, - mP_STRUCT_SIZE, - - oTHER_TAG, iND_TAG, -- semi-tagging stuff - - lIVENESS_R1, - lIVENESS_R2, - lIVENESS_R3, - lIVENESS_R4, - lIVENESS_R5, - lIVENESS_R6, - lIVENESS_R7, - lIVENESS_R8, - - mAX_INTLIKE, mIN_INTLIKE, - - - spARelToInt, - spBRelToInt - ) where +module Constants (module Constants) where -- This magical #include brings in all the everybody-knows-these magic -- constants unfortunately, we need to be *explicit* about which one @@ -72,107 +12,135 @@ module Constants ( -- be in trouble. #include "HsVersions.h" -#include "../../includes/GhcConstants.h" +#include "../includes/ghcconfig.h" +#include "../includes/MachRegs.h" +#include "../includes/Constants.h" +#include "../includes/MachDeps.h" +#include "../includes/DerivedConstants.h" -import Util +-- import Util \end{code} All pretty arbitrary: + \begin{code} -uNFOLDING_USE_THRESHOLD = ( 8 :: Int) -uNFOLDING_CREATION_THRESHOLD = (30 :: Int) -- Discounts can be big -iNTERFACE_UNFOLD_THRESHOLD = (30 :: Int) -lIBERATE_CASE_THRESHOLD = (10 :: Int) - -uNFOLDING_CHEAP_OP_COST = ( 1 :: Int) -uNFOLDING_DEAR_OP_COST = ( 4 :: Int) -uNFOLDING_NOREP_LIT_COST = ( 20 :: Int) -- Strings can be pretty big -uNFOLDING_CON_DISCOUNT_WEIGHT = ( 3 :: Int) -uNFOLDING_KEENESS_FACTOR = ( 2.0 :: Float) +mAX_TUPLE_SIZE = (62 :: Int) -- Should really match the number + -- of decls in Data.Tuple +mAX_CONTEXT_REDUCTION_DEPTH = (20 :: Int) \end{code} + \begin{code} -mAX_SPEC_ALL_PTRS = (MAX_SPEC_ALL_PTRS :: Int) -mAX_SPEC_ALL_NONPTRS = (MAX_SPEC_ALL_NONPTRS :: Int) -mAX_SPEC_MIXED_FIELDS = (MAX_SPEC_OTHER_SIZE :: Int) +-- specialised fun/thunk/constr closure types +mAX_SPEC_THUNK_SIZE = (MAX_SPEC_THUNK_SIZE :: Int) +mAX_SPEC_FUN_SIZE = (MAX_SPEC_FUN_SIZE :: Int) +mAX_SPEC_CONSTR_SIZE = (MAX_SPEC_CONSTR_SIZE :: Int) + +-- pre-compiled thunk types mAX_SPEC_SELECTEE_SIZE = (MAX_SPEC_SELECTEE_SIZE :: Int) +mAX_SPEC_AP_SIZE = (MAX_SPEC_AP_SIZE :: Int) --- closure sizes: these do NOT include the header +-- closure sizes: these do NOT include the header (see below for header sizes) mIN_UPD_SIZE = (MIN_UPD_SIZE::Int) mIN_SIZE_NonUpdHeapObject = (MIN_NONUPD_SIZE::Int) -mIN_SIZE_NonUpdStaticHeapObject = (0::Int) \end{code} -Sizes of gmp objects: \begin{code} -mIN_MP_INT_SIZE = (MIN_MP_INT_SIZE :: Int) -mP_STRUCT_SIZE = (MP_STRUCT_SIZE :: Int) +mIN_INTLIKE, mAX_INTLIKE :: Int +mIN_INTLIKE = MIN_INTLIKE +mAX_INTLIKE = MAX_INTLIKE + +mIN_CHARLIKE, mAX_CHARLIKE :: Int +mIN_CHARLIKE = MIN_CHARLIKE +mAX_CHARLIKE = MAX_CHARLIKE \end{code} +A section of code-generator-related MAGIC CONSTANTS. + \begin{code} -tARGET_MIN_INT, tARGET_MAX_INT :: Integer -tARGET_MIN_INT = -536870912 -tARGET_MAX_INT = 536870912 +mAX_FAMILY_SIZE_FOR_VEC_RETURNS = (MAX_VECTORED_RTN::Int) -- pretty arbitrary +-- If you change this, you may need to change runtimes/standard/Update.lhc \end{code} - -Constants for semi-tagging; the tags associated with the data -constructors will start at 0 and go up. + \begin{code} -oTHER_TAG = (INFO_OTHER_TAG :: Integer) -- (-1) unevaluated, probably -iND_TAG = (INFO_IND_TAG :: Integer) -- (-2) NOT USED, REALLY +mAX_Vanilla_REG = (MAX_VANILLA_REG :: Int) +mAX_Float_REG = (MAX_FLOAT_REG :: Int) +mAX_Double_REG = (MAX_DOUBLE_REG :: Int) +mAX_Long_REG = (MAX_LONG_REG :: Int) + +mAX_Real_Vanilla_REG = (MAX_REAL_VANILLA_REG :: Int) +mAX_Real_Float_REG = (MAX_REAL_FLOAT_REG :: Int) +mAX_Real_Double_REG = (MAX_REAL_DOUBLE_REG :: Int) +#ifdef MAX_REAL_LONG_REG +mAX_Real_Long_REG = (MAX_REAL_LONG_REG :: Int) +#else +mAX_Real_Long_REG = (0::Int) +#endif \end{code} -Stuff for liveness masks: +Closure header sizes. + \begin{code} -lIVENESS_R1 = (LIVENESS_R1 :: Int) -lIVENESS_R2 = (LIVENESS_R2 :: Int) -lIVENESS_R3 = (LIVENESS_R3 :: Int) -lIVENESS_R4 = (LIVENESS_R4 :: Int) -lIVENESS_R5 = (LIVENESS_R5 :: Int) -lIVENESS_R6 = (LIVENESS_R6 :: Int) -lIVENESS_R7 = (LIVENESS_R7 :: Int) -lIVENESS_R8 = (LIVENESS_R8 :: Int) +sTD_HDR_SIZE = (STD_HDR_SIZE :: Int) +pROF_HDR_SIZE = (PROF_HDR_SIZE :: Int) +gRAN_HDR_SIZE = (GRAN_HDR_SIZE :: Int) \end{code} +Info Table sizes. + \begin{code} -mIN_INTLIKE, mAX_INTLIKE :: Integer -- Only used to compare with (MachInt Integer) -mIN_INTLIKE = MIN_INTLIKE -mAX_INTLIKE = MAX_INTLIKE +sTD_ITBL_SIZE = (STD_ITBL_SIZE :: Int) +rET_ITBL_SIZE = (RET_ITBL_SIZE :: Int) +pROF_ITBL_SIZE = (PROF_ITBL_SIZE :: Int) +gRAN_ITBL_SIZE = (GRAN_ITBL_SIZE :: Int) +tICKY_ITBL_SIZE = (TICKY_ITBL_SIZE :: Int) \end{code} +Size of a double in StgWords. + \begin{code} --- THESE ARE DIRECTION SENSITIVE! -spARelToInt :: Int{-VirtualSpAOffset-} -> Int{-VirtualSpAOffset-} -> Int -spBRelToInt :: Int{-VirtualSpBOffset-} -> Int{-VirtualSpBOffset-} -> Int +dOUBLE_SIZE = SIZEOF_DOUBLE :: Int +wORD64_SIZE = 8 :: Int +iNT64_SIZE = wORD64_SIZE +\end{code} + +This tells the native code generator the size of the spill +area is has available. -spARelToInt spA off = spA - off -- equiv to: AREL(spA - off) -spBRelToInt spB off = off - spB -- equiv to: BREL(spB - off) +\begin{code} +rESERVED_C_STACK_BYTES = (RESERVED_C_STACK_BYTES :: Int) \end{code} -A section of code-generator-related MAGIC CONSTANTS. +The amount of (Haskell) stack to leave free for saving registers when +returning to the scheduler. + \begin{code} -mAX_FAMILY_SIZE_FOR_VEC_RETURNS = (MAX_VECTORED_RTN::Int) -- pretty arbitrary --- If you change this, you may need to change runtimes/standard/Update.lhc +rESERVED_STACK_WORDS = (RESERVED_STACK_WORDS :: Int) +\end{code} + +Size of a word, in bytes + +\begin{code} +wORD_SIZE = (SIZEOF_HSWORD :: Int) +wORD_SIZE_IN_BITS = wORD_SIZE * 8 :: Int +\end{code} + +Size of a storage manager block (in bytes). --- The update frame sizes -sTD_UF_SIZE = (NOSCC_STD_UF_SIZE::Int) -cON_UF_SIZE = (NOSCC_CON_UF_SIZE::Int) +\begin{code} +bLOCK_SIZE = (BLOCK_SIZE :: Int) +bLOCK_SIZE_W = (bLOCK_SIZE `quot` wORD_SIZE :: Int) +\end{code} --- Same again, with profiling -sCC_STD_UF_SIZE = (SCC_STD_UF_SIZE::Int) -sCC_CON_UF_SIZE = (SCC_CON_UF_SIZE::Int) +Number of bits to shift a bitfield left by in an info table. --- Offsets in an update frame. They don't change with profiling! -uF_RET = (UF_RET::Int) -uF_SUB = (UF_SUB::Int) -uF_SUA = (UF_SUA::Int) -uF_UPDATEE = (UF_UPDATEE::Int) -uF_COST_CENTRE = (UF_COST_CENTRE::Int) +\begin{code} +bITMAP_BITS_SHIFT = (BITMAP_BITS_SHIFT :: Int) \end{code} +Constants derived from headers in ghc/includes, generated by the program +../includes/mkDerivedConstants.c. + \begin{code} -mAX_Vanilla_REG = (MAX_VANILLA_REG :: Int) -mAX_Float_REG = (MAX_FLOAT_REG :: Int) -mAX_Double_REG = (MAX_DOUBLE_REG :: Int) -mAX_Long_REG = (MAX_LONG_REG :: Int) +#include "../includes/GHCConstants.h" \end{code}