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