[project @ 1999-06-09 09:35:54 by simonpj]
[ghc-hetmet.git] / ghc / tests / programs / jeff-bug / ROB_retire.hs
1 module ROB_retire(retire)  where
2
3 import LazyST
4 import Hawk
5 import Trans
6
7 import qualified RF
8 import qualified AQ as Q
9 import qualified RAT 
10 import RF(RF)
11 import AQ(AQ)
12 import RAT(RAT)
13
14 import DLX
15 import Monad
16 import Utils
17
18
19
20 retire rat q regfile
21   = do { perhaps <- retireable q
22        ; let (retired,missed) = jumpHazard perhaps
23        ; mapM (writeOut regfile rat) retired
24        ; return (cleanUp retired,missed)
25        }
26   where cleanUp = map removeVirtuals
27
28 --retireable :: Register r => AQ s (Trans i r w) -> ST s [Trans i r w]
29 retireable q = Q.deQueueWhile q complete
30
31 --jumpHazard :: (Register r,Word w) => [VTrans r w] -> ([VTrans r w],Bool)
32 jumpHazard [] = ([],False)
33 jumpHazard (instr:is) 
34   = if branchMissed instr then ([instr],True)
35        else (instr:is',False || die)
36   where (is',die) = jumpHazard is
37
38 --branchMissed :: (Register r,Word w) => VTrans r w -> Bool
39 branchMissed t = 
40   do { Reg (Virtual _ (Just pc)) (Val x) <- getDstPC t
41      ; Reg (Real spc) (Val y) <- getSpecPC t
42      ; guard $ ispc pc
43      ; guard $ isspecpc spc
44      ; return $ x /= y
45      }
46    `catchEx` False
47
48 --writeOut :: Register r => RF s r w -> RAT s r Int -> 
49 --                          VTrans r w -> ST s ()
50 writeOut file rat t
51   = do { let [Reg (Virtual vr (Just real)) (Val x)] = getDst t
52        ; RF.write file real x
53        ; a <- RAT.read rat real
54        ; do {v <- a
55             ; guard $ v == vr
56             ; return $ RAT.remove rat real
57             }
58          `catchEx` return ()
59        }
60
61
62