Commit 3452473b authored by thomie's avatar thomie Committed by Ben Gamari

Delete FastBool

This reverses some of the work done in Trac #1405, and assumes GHC is
smart enough to do its own unboxing of booleans now.

I would like to do some more performance measurements, but the code
changes can be reviewed already.

Test Plan:
With a perf build:
./inplace/bin/ghc-stage2 nofib/spectral/simple/Main.hs -fforce-recomp
+RTS -t --machine-readable

before:
```
  [("bytes allocated", "1300744864")
  ,("num_GCs", "302")
  ,("average_bytes_used", "8811118")
  ,("max_bytes_used", "24477464")
  ,("num_byte_usage_samples", "9")
  ,("peak_megabytes_allocated", "64")
  ,("init_cpu_seconds", "0.001")
  ,("init_wall_seconds", "0.001")
  ,("mutator_cpu_seconds", "2.833")
  ,("mutator_wall_seconds", "4.283")
  ,("GC_cpu_seconds", "0.960")
  ,("GC_wall_seconds", "0.961")
  ]
```

after:
```
  [("bytes allocated", "1301088064")
  ,("num_GCs", "310")
  ,("average_bytes_used", "8820253")
  ,("max_bytes_used", "24539904")
  ,("num_byte_usage_samples", "9")
  ,("peak_megabytes_allocated", "64")
  ,("init_cpu_seconds", "0.001")
  ,("init_wall_seconds", "0.001")
  ,("mutator_cpu_seconds", "2.876")
  ,("mutator_wall_seconds", "4.474")
  ,("GC_cpu_seconds", "0.965")
  ,("GC_wall_seconds", "0.979")
  ]
```

CPU time seems to be up a bit, but I'm not sure. Unfortunately CPU time
measurements are rather noisy.

Reviewers: austin, bgamari, rwbarton

Subscribers: nomeata

Differential Revision: https://phabricator.haskell.org/D1143

GHC Trac Issues: #1405
parent 9e8562ae
...@@ -4,7 +4,6 @@ module CodeGen.Platform ...@@ -4,7 +4,6 @@ module CodeGen.Platform
where where
import CmmExpr import CmmExpr
import FastBool
import Platform import Platform
import Reg import Reg
...@@ -97,7 +96,7 @@ globalRegMaybe platform ...@@ -97,7 +96,7 @@ globalRegMaybe platform
| otherwise -> NoRegs.globalRegMaybe | otherwise -> NoRegs.globalRegMaybe
freeReg :: Platform -> RegNo -> FastBool freeReg :: Platform -> RegNo -> Bool
freeReg platform freeReg platform
| platformUnregisterised platform = NoRegs.freeReg | platformUnregisterised platform = NoRegs.freeReg
| otherwise | otherwise
......
...@@ -441,7 +441,6 @@ Library ...@@ -441,7 +441,6 @@ Library
BufWrite BufWrite
Digraph Digraph
Encoding Encoding
FastBool
FastFunctions FastFunctions
FastMutInt FastMutInt
FastString FastString
......
...@@ -613,7 +613,6 @@ compiler_stage2_dll0_MODULES += \ ...@@ -613,7 +613,6 @@ compiler_stage2_dll0_MODULES += \
CodeGen.Platform.SPARC \ CodeGen.Platform.SPARC \
CodeGen.Platform.X86 \ CodeGen.Platform.X86 \
CodeGen.Platform.X86_64 \ CodeGen.Platform.X86_64 \
FastBool \
Hoopl \ Hoopl \
Hoopl.Dataflow \ Hoopl.Dataflow \
InteractiveEvalTypes \ InteractiveEvalTypes \
......
...@@ -56,7 +56,6 @@ import Maybes ...@@ -56,7 +56,6 @@ import Maybes
import UniqSupply import UniqSupply
import ErrUtils (Severity(..)) import ErrUtils (Severity(..))
import Outputable import Outputable
import FastBool hiding ( fastOr )
import SrcLoc import SrcLoc
import FastString import FastString
import qualified ErrUtils as Err import qualified ErrUtils as Err
...@@ -1319,7 +1318,7 @@ hasCafRefs dflags this_pkg this_mod p@(_,cvt_integer) arity expr ...@@ -1319,7 +1318,7 @@ hasCafRefs dflags this_pkg this_mod p@(_,cvt_integer) arity expr
| is_caf || mentions_cafs = MayHaveCafRefs | is_caf || mentions_cafs = MayHaveCafRefs
| otherwise = NoCafRefs | otherwise = NoCafRefs
where where
mentions_cafs = isFastTrue (cafRefsE p expr) mentions_cafs = cafRefsE p expr
is_dynamic_name = isDllName dflags this_pkg this_mod is_dynamic_name = isDllName dflags this_pkg this_mod
is_caf = not (arity > 0 || rhsIsStatic (targetPlatform dflags) is_dynamic_name cvt_integer expr) is_caf = not (arity > 0 || rhsIsStatic (targetPlatform dflags) is_dynamic_name cvt_integer expr)
...@@ -1329,38 +1328,34 @@ hasCafRefs dflags this_pkg this_mod p@(_,cvt_integer) arity expr ...@@ -1329,38 +1328,34 @@ hasCafRefs dflags this_pkg this_mod p@(_,cvt_integer) arity expr
-- CorePrep later on, and we don't want to duplicate that -- CorePrep later on, and we don't want to duplicate that
-- knowledge in rhsIsStatic below. -- knowledge in rhsIsStatic below.
cafRefsE :: CafRefEnv -> Expr a -> FastBool cafRefsE :: CafRefEnv -> Expr a -> Bool
cafRefsE p (Var id) = cafRefsV p id cafRefsE p (Var id) = cafRefsV p id
cafRefsE p (Lit lit) = cafRefsL p lit cafRefsE p (Lit lit) = cafRefsL p lit
cafRefsE p (App f a) = fastOr (cafRefsE p f) (cafRefsE p) a cafRefsE p (App f a) = cafRefsE p f || cafRefsE p a
cafRefsE p (Lam _ e) = cafRefsE p e cafRefsE p (Lam _ e) = cafRefsE p e
cafRefsE p (Let b e) = fastOr (cafRefsEs p (rhssOfBind b)) (cafRefsE p) e cafRefsE p (Let b e) = cafRefsEs p (rhssOfBind b) || cafRefsE p e
cafRefsE p (Case e _bndr _ alts) = fastOr (cafRefsE p e) (cafRefsEs p) (rhssOfAlts alts) cafRefsE p (Case e _bndr _ alts) = cafRefsE p e || cafRefsEs p (rhssOfAlts alts)
cafRefsE p (Tick _n e) = cafRefsE p e cafRefsE p (Tick _n e) = cafRefsE p e
cafRefsE p (Cast e _co) = cafRefsE p e cafRefsE p (Cast e _co) = cafRefsE p e
cafRefsE _ (Type _) = fastBool False cafRefsE _ (Type _) = False
cafRefsE _ (Coercion _) = fastBool False cafRefsE _ (Coercion _) = False
cafRefsEs :: CafRefEnv -> [Expr a] -> FastBool cafRefsEs :: CafRefEnv -> [Expr a] -> Bool
cafRefsEs _ [] = fastBool False cafRefsEs _ [] = False
cafRefsEs p (e:es) = fastOr (cafRefsE p e) (cafRefsEs p) es cafRefsEs p (e:es) = cafRefsE p e || cafRefsEs p es
cafRefsL :: CafRefEnv -> Literal -> FastBool cafRefsL :: CafRefEnv -> Literal -> Bool
-- Don't forget that mk_integer id might have Caf refs! -- Don't forget that mk_integer id might have Caf refs!
-- We first need to convert the Integer into its final form, to -- We first need to convert the Integer into its final form, to
-- see whether mkInteger is used. -- see whether mkInteger is used.
cafRefsL p@(_, cvt_integer) (LitInteger i _) = cafRefsE p (cvt_integer i) cafRefsL p@(_, cvt_integer) (LitInteger i _) = cafRefsE p (cvt_integer i)
cafRefsL _ _ = fastBool False cafRefsL _ _ = False
cafRefsV :: CafRefEnv -> Id -> FastBool cafRefsV :: CafRefEnv -> Id -> Bool
cafRefsV (subst, _) id cafRefsV (subst, _) id
| not (isLocalId id) = fastBool (mayHaveCafRefs (idCafInfo id)) | not (isLocalId id) = mayHaveCafRefs (idCafInfo id)
| Just id' <- lookupVarEnv subst id = fastBool (mayHaveCafRefs (idCafInfo id')) | Just id' <- lookupVarEnv subst id = mayHaveCafRefs (idCafInfo id')
| otherwise = fastBool False | otherwise = False
fastOr :: FastBool -> (a -> FastBool) -> a -> FastBool
-- hack for lazy-or over FastBool.
fastOr a f x = fastBool (isFastTrue a || isFastTrue (f x))
{- {-
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
......
...@@ -39,7 +39,6 @@ import FastString ...@@ -39,7 +39,6 @@ import FastString
import CLabel import CLabel
import Outputable import Outputable
import Platform import Platform
import FastBool
import UniqFM (listToUFM, lookupUFM) import UniqFM (listToUFM, lookupUFM)
import UniqSupply import UniqSupply
...@@ -362,9 +361,7 @@ ppc_regUsageOfInstr platform instr ...@@ -362,9 +361,7 @@ ppc_regUsageOfInstr platform instr
interesting :: Platform -> Reg -> Bool interesting :: Platform -> Reg -> Bool
interesting _ (RegVirtual _) = True interesting _ (RegVirtual _) = True
interesting platform (RegReal (RealRegSingle i)) interesting platform (RegReal (RealRegSingle i)) = freeReg platform i
= isFastTrue (freeReg platform i)
interesting _ (RegReal (RealRegPair{})) interesting _ (RegReal (RealRegPair{}))
= panic "PPC.Instr.interesting: no reg pairs on this arch" = panic "PPC.Instr.interesting: no reg pairs on this arch"
......
...@@ -60,7 +60,6 @@ import Unique ...@@ -60,7 +60,6 @@ import Unique
import CodeGen.Platform import CodeGen.Platform
import DynFlags import DynFlags
import Outputable import Outputable
import FastBool
import FastTypes import FastTypes
import Platform import Platform
...@@ -325,5 +324,5 @@ f21 = regSingle $ fReg 21 ...@@ -325,5 +324,5 @@ f21 = regSingle $ fReg 21
-- register allocator to attempt to map VRegs to. -- register allocator to attempt to map VRegs to.
allocatableRegs :: Platform -> [RealReg] allocatableRegs :: Platform -> [RealReg]
allocatableRegs platform allocatableRegs platform
= let isFree i = isFastTrue (freeReg platform i) = let isFree i = freeReg platform i
in map RealRegSingle $ filter isFree allMachRegNos in map RealRegSingle $ filter isFree allMachRegNos
...@@ -255,7 +255,7 @@ worst n classN classC ...@@ -255,7 +255,7 @@ worst n classN classC
-- register allocator to attempt to map VRegs to. -- register allocator to attempt to map VRegs to.
allocatableRegs :: [RegNo] allocatableRegs :: [RegNo]
allocatableRegs allocatableRegs
= let isFree i = isFastTrue (freeReg i) = let isFree i = freeReg i
in filter isFree allMachRegNos in filter isFree allMachRegNos
......
...@@ -10,7 +10,6 @@ import Reg ...@@ -10,7 +10,6 @@ import Reg
import CodeGen.Platform import CodeGen.Platform
import Outputable import Outputable
import Platform import Platform
import FastBool
import Data.Word import Data.Word
import Data.Bits import Data.Bits
...@@ -75,7 +74,7 @@ allocateReg platform ...@@ -75,7 +74,7 @@ allocateReg platform
(FreeRegs g f d) (FreeRegs g f d)
-- can't allocate free regs -- can't allocate free regs
| not $ isFastTrue (freeReg platform r) | not $ freeReg platform r
= pprPanic "SPARC.FreeRegs.allocateReg: not allocating pinned reg" (ppr reg) = pprPanic "SPARC.FreeRegs.allocateReg: not allocating pinned reg" (ppr reg)
-- a general purpose reg -- a general purpose reg
...@@ -131,7 +130,7 @@ releaseReg platform ...@@ -131,7 +130,7 @@ releaseReg platform
regs@(FreeRegs g f d) regs@(FreeRegs g f d)
-- don't release pinned reg -- don't release pinned reg
| not $ isFastTrue (freeReg platform r) | not $ freeReg platform r
= regs = regs
-- a general purpose reg -- a general purpose reg
......
...@@ -43,7 +43,6 @@ import BlockId ...@@ -43,7 +43,6 @@ import BlockId
import DynFlags import DynFlags
import Cmm import Cmm
import FastString import FastString
import FastBool
import Outputable import Outputable
import Platform import Platform
...@@ -279,8 +278,8 @@ interesting :: Platform -> Reg -> Bool ...@@ -279,8 +278,8 @@ interesting :: Platform -> Reg -> Bool
interesting platform reg interesting platform reg
= case reg of = case reg of
RegVirtual _ -> True RegVirtual _ -> True
RegReal (RealRegSingle r1) -> isFastTrue (freeReg platform r1) RegReal (RealRegSingle r1) -> freeReg platform r1
RegReal (RealRegPair r1 _) -> isFastTrue (freeReg platform r1) RegReal (RealRegPair r1 _) -> freeReg platform r1
......
...@@ -40,7 +40,6 @@ import Format ...@@ -40,7 +40,6 @@ import Format
import Unique import Unique
import Outputable import Outputable
import FastTypes import FastTypes
import FastBool
{- {-
The SPARC has 64 registers of interest; 32 integer registers and 32 The SPARC has 64 registers of interest; 32 integer registers and 32
...@@ -199,13 +198,8 @@ allocatableRegs :: [RealReg] ...@@ -199,13 +198,8 @@ allocatableRegs :: [RealReg]
allocatableRegs allocatableRegs
= let isFree rr = let isFree rr
= case rr of = case rr of
RealRegSingle r RealRegSingle r -> freeReg r
-> isFastTrue (freeReg r) RealRegPair r1 r2 -> freeReg r1 && freeReg r2
RealRegPair r1 r2
-> isFastTrue (freeReg r1)
&& isFastTrue (freeReg r2)
in filter isFree allRealRegs in filter isFree allRealRegs
......
...@@ -58,7 +58,6 @@ import OrdList ...@@ -58,7 +58,6 @@ import OrdList
import Outputable import Outputable
import Unique import Unique
import FastString import FastString
import FastBool ( isFastTrue )
import DynFlags import DynFlags
import Util import Util
...@@ -1176,7 +1175,7 @@ amodeCouldBeClobbered :: Platform -> AddrMode -> Bool ...@@ -1176,7 +1175,7 @@ amodeCouldBeClobbered :: Platform -> AddrMode -> Bool
amodeCouldBeClobbered platform amode = any (regClobbered platform) (addrModeRegs amode) amodeCouldBeClobbered platform amode = any (regClobbered platform) (addrModeRegs amode)
regClobbered :: Platform -> Reg -> Bool regClobbered :: Platform -> Reg -> Bool
regClobbered platform (RegReal (RealRegSingle rr)) = isFastTrue (freeReg platform rr) regClobbered platform (RegReal (RealRegSingle rr)) = freeReg platform rr
regClobbered _ _ = False regClobbered _ _ = False
-- getOperand: the operand is not required to remain valid across the -- getOperand: the operand is not required to remain valid across the
......
...@@ -29,7 +29,6 @@ import BlockId ...@@ -29,7 +29,6 @@ import BlockId
import CodeGen.Platform import CodeGen.Platform
import Cmm import Cmm
import FastString import FastString
import FastBool
import Outputable import Outputable
import Platform import Platform
...@@ -531,7 +530,7 @@ x86_regUsageOfInstr platform instr ...@@ -531,7 +530,7 @@ x86_regUsageOfInstr platform instr
-- | Is this register interesting for the register allocator? -- | Is this register interesting for the register allocator?
interesting :: Platform -> Reg -> Bool interesting :: Platform -> Reg -> Bool
interesting _ (RegVirtual _) = True interesting _ (RegVirtual _) = True
interesting platform (RegReal (RealRegSingle i)) = isFastTrue (freeReg platform i) interesting platform (RegReal (RealRegSingle i)) = freeReg platform i
interesting _ (RegReal (RealRegPair{})) = panic "X86.interesting: no reg pairs on this arch" interesting _ (RegReal (RealRegPair{})) = panic "X86.interesting: no reg pairs on this arch"
......
...@@ -58,7 +58,6 @@ import DynFlags ...@@ -58,7 +58,6 @@ import DynFlags
import Outputable import Outputable
import Platform import Platform
import FastTypes import FastTypes
import FastBool
-- | regSqueeze_class reg -- | regSqueeze_class reg
...@@ -447,6 +446,6 @@ instrClobberedRegs platform ...@@ -447,6 +446,6 @@ instrClobberedRegs platform
-- register allocator to attempt to map VRegs to. -- register allocator to attempt to map VRegs to.
allocatableRegs :: Platform -> [RealReg] allocatableRegs :: Platform -> [RealReg]
allocatableRegs platform allocatableRegs platform
= let isFree i = isFastTrue (freeReg platform i) = let isFree i = freeReg platform i
in map RealRegSingle $ filter isFree (allMachRegNos platform) in map RealRegSingle $ filter isFree (allMachRegNos platform)
{-
(c) The University of Glasgow, 2000-2006
\section{Fast booleans}
-}
{-# LANGUAGE CPP, MagicHash #-}
module FastBool (
--fastBool could be called bBox; isFastTrue, bUnbox; but they're not
FastBool, fastBool, isFastTrue, fastOr, fastAnd
) where
-- Import the beggars
import GHC.Exts
#ifdef DEBUG
import Panic
#endif
type FastBool = Int#
fastBool True = 1#
fastBool False = 0#
#ifdef DEBUG
--then waste time deciding whether to panic. FastBool should normally
--be at least as fast as Bool, one would hope...
isFastTrue 1# = True
isFastTrue 0# = False
isFastTrue _ = panic "FastTypes: isFastTrue"
-- note that fastOr and fastAnd are strict in both arguments
-- since they are unboxed
fastOr 1# _ = 1#
fastOr 0# x = x
fastOr _ _ = panicFastInt "FastTypes: fastOr"
fastAnd 0# _ = 0#
fastAnd 1# x = x
fastAnd _ _ = panicFastInt "FastTypes: fastAnd"
--these "panicFastInt"s (formerly known as "panic#") rely on
--FastInt = FastBool ( = Int# presumably),
--haha, true enough when __GLASGOW_HASKELL__. Why can't we have functions
--that return _|_ be kind-polymorphic ( ?? to be precise ) ?
#else /* ! DEBUG */
--Isn't comparison to zero sometimes faster on CPUs than comparison to 1?
-- (since using Int# as _synonym_ fails to guarantee that it will
-- only take on values of 0 and 1)
isFastTrue 0# = False
isFastTrue _ = True
-- note that fastOr and fastAnd are strict in both arguments
-- since they are unboxed
-- Also, to avoid incomplete-pattern warning
-- (and avoid wasting time with redundant runtime checks),
-- we don't pattern-match on both 0# and 1# .
fastOr 0# x = x
fastOr _ _ = 1#
fastAnd 0# _ = 0#
fastAnd _ x = x
#endif /* ! DEBUG */
fastBool :: Bool -> FastBool
isFastTrue :: FastBool -> Bool
fastOr :: FastBool -> FastBool -> FastBool
fastAnd :: FastBool -> FastBool -> FastBool
import CmmExpr import CmmExpr
import FastBool
#if !(MACHREGS_i386 || MACHREGS_x86_64 || MACHREGS_sparc || MACHREGS_powerpc) #if !(MACHREGS_i386 || MACHREGS_x86_64 || MACHREGS_sparc || MACHREGS_powerpc)
import Panic import Panic
#endif #endif
...@@ -823,17 +822,17 @@ globalRegMaybe _ = Nothing ...@@ -823,17 +822,17 @@ globalRegMaybe _ = Nothing
globalRegMaybe = panic "globalRegMaybe not defined for this platform" globalRegMaybe = panic "globalRegMaybe not defined for this platform"
#endif #endif
freeReg :: RegNo -> FastBool freeReg :: RegNo -> Bool
#if MACHREGS_i386 || MACHREGS_x86_64 #if MACHREGS_i386 || MACHREGS_x86_64
# if MACHREGS_i386 # if MACHREGS_i386
freeReg esp = fastBool False -- %esp is the C stack pointer freeReg esp = False -- %esp is the C stack pointer
freeReg esi = fastBool False -- Note [esi/edi not allocatable] freeReg esi = False -- Note [esi/edi not allocatable]
freeReg edi = fastBool False freeReg edi = False
# endif # endif
# if MACHREGS_x86_64 # if MACHREGS_x86_64
freeReg rsp = fastBool False -- %rsp is the C stack pointer freeReg rsp = False -- %rsp is the C stack pointer
# endif # endif
{- {-
...@@ -853,158 +852,158 @@ Hence, on x86 esi and edi are treated as not allocatable. ...@@ -853,158 +852,158 @@ Hence, on x86 esi and edi are treated as not allocatable.
-- split patterns in two functions to prevent overlaps -- split patterns in two functions to prevent overlaps
freeReg r = freeRegBase r freeReg r = freeRegBase r
freeRegBase :: RegNo -> FastBool freeRegBase :: RegNo -> Bool
# ifdef REG_Base # ifdef REG_Base
freeRegBase REG_Base = fastBool False freeRegBase REG_Base = False
# endif # endif
# ifdef REG_Sp # ifdef REG_Sp
freeRegBase REG_Sp = fastBool False freeRegBase REG_Sp = False
# endif # endif
# ifdef REG_SpLim # ifdef REG_SpLim
freeRegBase REG_SpLim = fastBool False freeRegBase REG_SpLim = False
# endif # endif
# ifdef REG_Hp # ifdef REG_Hp
freeRegBase REG_Hp = fastBool False freeRegBase REG_Hp = False
# endif # endif
# ifdef REG_HpLim # ifdef REG_HpLim
freeRegBase REG_HpLim = fastBool False freeRegBase REG_HpLim = False
# endif # endif
-- All other regs are considered to be "free", because we can track -- All other regs are considered to be "free", because we can track
-- their liveness accurately. -- their liveness accurately.
freeRegBase _ = fastBool True freeRegBase _ = True
#elif MACHREGS_powerpc #elif MACHREGS_powerpc
freeReg 0 = fastBool False -- Hack: r0 can't be used in all insns, freeReg 0 = False -- Hack: r0 can't be used in all insns,
-- but it's actually free -- but it's actually free
freeReg 1 = fastBool False -- The Stack Pointer freeReg 1 = False -- The Stack Pointer
# if !MACHREGS_darwin # if !MACHREGS_darwin
-- most non-darwin powerpc OSes use r2 as a TOC pointer or something like that -- most non-darwin powerpc OSes use r2 as a TOC pointer or something like that
freeReg 2 = fastBool False freeReg 2 = False
-- TODO: make this conditonal for ppc64 ELF -- TODO: make this conditonal for ppc64 ELF
freeReg 13 = fastBool False -- reserved for system thread ID freeReg 13 = False -- reserved for system thread ID
-- TODO: do not reserve r30 in ppc64 ELF -- TODO: do not reserve r30 in ppc64 ELF
-- at least linux in -fPIC relies on r30 in PLT stubs -- at least linux in -fPIC relies on r30 in PLT stubs
freeReg 30 = fastBool False freeReg 30 = False
# endif # endif
# ifdef REG_Base # ifdef REG_Base
freeReg REG_Base = fastBool False freeReg REG_Base = False
# endif # endif
# ifdef REG_R1 # ifdef REG_R1
freeReg REG_R1 = fastBool False freeReg REG_R1 = False
# endif # endif
# ifdef REG_R2 # ifdef REG_R2
freeReg REG_R2 = fastBool False freeReg REG_R2 = False
# endif # endif
# ifdef REG_R3 # ifdef REG_R3
freeReg REG_R3 = fastBool False freeReg REG_R3 = False
# endif # endif
# ifdef REG_R4 # ifdef REG_R4
freeReg REG_R4 = fastBool False freeReg REG_R4 = False
# endif # endif
# ifdef REG_R5 # ifdef REG_R5
freeReg REG_R5 = fastBool False freeReg REG_R5 = False
# endif # endif
# ifdef REG_R6 # ifdef REG_R6
freeReg REG_R6 = fastBool False freeReg REG_R6 = False
# endif # endif
# ifdef REG_R7 # ifdef REG_R7
freeReg REG_R7 = fastBool False freeReg REG_R7 = False
# endif # endif
# ifdef REG_R8 # ifdef REG_R8
freeReg REG_R8 = fastBool False freeReg REG_R8 = False
# endif # endif
# ifdef REG_R9 # ifdef REG_R9
freeReg REG_R9 = fastBool False freeReg REG_R9 = False
# endif # endif
# ifdef REG_R10 # ifdef REG_R10
freeReg REG_R10 = fastBool False freeReg REG_R10 = False
# endif