1 module ROB_retire(retire) where
8 import qualified AQ as Q
21 = do { perhaps <- retireable q
22 ; let (retired,missed) = jumpHazard perhaps
23 ; mapM (writeOut regfile rat) retired
24 ; return (cleanUp retired,missed)
26 where cleanUp = map removeVirtuals
28 --retireable :: Register r => AQ s (Trans i r w) -> ST s [Trans i r w]
29 retireable q = Q.deQueueWhile q complete
31 --jumpHazard :: (Register r,Word w) => [VTrans r w] -> ([VTrans r w],Bool)
32 jumpHazard [] = ([],False)
34 = if branchMissed instr then ([instr],True)
35 else (instr:is',False || die)
36 where (is',die) = jumpHazard is
38 --branchMissed :: (Register r,Word w) => VTrans r w -> Bool
40 do { Reg (Virtual _ (Just pc)) (Val x) <- getDstPC t
41 ; Reg (Real spc) (Val y) <- getSpecPC t
43 ; guard $ isspecpc spc
48 --writeOut :: Register r => RF s r w -> RAT s r Int ->
49 -- VTrans r w -> ST s ()
51 = do { let [Reg (Virtual vr (Just real)) (Val x)] = getDst t
52 ; RF.write file real x
53 ; a <- RAT.read rat real
56 ; return $ RAT.remove rat real