import RegAlloc.Linear.Stats
import RegAlloc.Linear.StackMap
import RegAlloc.Linear.Base
import RegAlloc.Linear.Stats
import RegAlloc.Linear.StackMap
import RegAlloc.Linear.Base
m >>= k = RegM $ \s -> case unReg m s of { (# s, a #) -> unReg (k a) s }
return a = RegM $ \s -> (# s, a #)
-- | Run a computation in the RegM register allocator monad.
m >>= k = RegM $ \s -> case unReg m s of { (# s, a #) -> unReg (k a) s }
return a = RegM $ \s -> (# s, a #)
-- | Run a computation in the RegM register allocator monad.
- -> RegM a
- -> (BlockAssignment, StackMap, RegAllocStats, a)
+ -> RegM freeRegs a
+ -> (BlockAssignment freeRegs, StackMap, RegAllocStats, a)
spillR reg temp = RegM $ \ s@RA_State{ra_delta=delta, ra_stack=stack} ->
let (stack',slot) = getStackSlotFor stack temp
spillR reg temp = RegM $ \ s@RA_State{ra_delta=delta, ra_stack=stack} ->
let (stack',slot) = getStackSlotFor stack temp
loadR reg slot = RegM $ \ s@RA_State{ra_delta=delta} ->
(# s, mkLoadInstr reg delta slot #)
loadR reg slot = RegM $ \ s@RA_State{ra_delta=delta} ->
(# s, mkLoadInstr reg delta slot #)
setFreeRegsR regs = RegM $ \ s ->
(# s{ra_freeregs = regs}, () #)
setFreeRegsR regs = RegM $ \ s ->
(# s{ra_freeregs = regs}, () #)
setAssigR assig = RegM $ \ s ->
(# s{ra_assig=assig}, () #)
setAssigR assig = RegM $ \ s ->
(# s{ra_assig=assig}, () #)
setBlockAssigR assig = RegM $ \ s ->
(# s{ra_blockassig = assig}, () #)
setBlockAssigR assig = RegM $ \ s ->
(# s{ra_blockassig = assig}, () #)
setDeltaR n = RegM $ \ s ->
(# s{ra_delta = n}, () #)
setDeltaR n = RegM $ \ s ->
(# s{ra_delta = n}, () #)
- case splitUniqSupply (ra_us s) of
- (us1, us2) -> (# s{ra_us = us2}, uniqFromSupply us1 #)
+ case takeUniqFromSupply (ra_us s) of
+ (uniq, us) -> (# s{ra_us = us}, uniq #)