[project @ 1999-04-29 11:53:12 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 Utils
16
17
18
19 retire rat q regfile
20   = do { perhaps <- retireable q
21        ; let (retired,missed) = jumpHazard perhaps
22        ; mapM (writeOut regfile rat) retired
23        ; return (cleanUp retired,missed)
24        }
25   where cleanUp = map removeVirtuals
26
27 --retireable :: Register r => AQ s (Trans i r w) -> ST s [Trans i r w]
28 retireable q = Q.deQueueWhile q complete
29
30 --jumpHazard :: (Register r,Word w) => [VTrans r w] -> ([VTrans r w],Bool)
31 jumpHazard [] = ([],False)
32 jumpHazard (instr:is) 
33   = if branchMissed instr then ([instr],True)
34        else (instr:is',False || die)
35   where (is',die) = jumpHazard is
36
37 --branchMissed :: (Register r,Word w) => VTrans r w -> Bool
38 branchMissed t = 
39   do { Reg (Virtual _ (Just pc)) (Val x) <- getDstPC t
40      ; Reg (Real spc) (Val y) <- getSpecPC t
41      ; guard $ ispc pc
42      ; guard $ isspecpc spc
43      ; return $ x /= y
44      }
45    `catchEx` False
46
47 --writeOut :: Register r => RF s r w -> RAT s r Int -> 
48 --                          VTrans r w -> ST s ()
49 writeOut file rat t
50   = do { let [Reg (Virtual vr (Just real)) (Val x)] = getDst t
51        ; RF.write file real x
52        ; a <- RAT.read rat real
53        ; do {v <- a
54             ; guard $ v == vr
55             ; return $ RAT.remove rat real
56             }
57          `catchEx` return ()
58        }
59
60
61