[project @ 2001-08-22 11:45:06 by sewardj]
[ghc-hetmet.git] / ghc / tests / programs / jeff-bug / ROB_insert.hs
1 module ROB_insert(insert)  where
2
3 import Hawk
4 import Trans
5 import LazyST
6
7 import qualified RF 
8 import qualified AQ as Q
9 import qualified RAT
10 import AQ(AQ)
11 import RAT(RAT)
12 import RF(RF) 
13 import Utils
14
15
16 import DLX
17
18
19 {-
20 insert :: (Register r,Word w) => 
21      RAT st r Int -> AQ st (VTrans r w) -> 
22      RF st r w -> [Trans StandardOp r w] -> ST st [VTrans r w] 
23 -}
24 insert rat q regfile instrs 
25   = mapM setAndSubst instrs
26    where 
27    setAndSubst t  =
28        do { (reg,alias) <- bind q t
29           ; src <- mapM (RAT.replace rat) $ getSrc t
30           ; let info = map convert $ getInfo t
31           ; let op = getOp t
32           ; RAT.write rat reg alias
33           ; dest <- mapM (RAT.replace rat) $ getDst t
34           ; new <- regRead q regfile $ Trans dest op src info
35           ; Q.enQueue q new
36           ; return $ new
37           }
38    bind q trans = Q.assignAddr q (head . getDstRegs $ trans)
39
40 {-
41 regRead :: (Register r,Word w) => AQ s (VTrans r w) -> RF s r w -> 
42                          VTrans r w -> ST s (VTrans r w)
43 -}
44 regRead q file t  
45   = do { cells <- mapM subst (getSrcRegs t)
46        ; return $ fillInSrcCells t cells
47        }
48    where 
49    subst (Virtual n x) 
50      = do { v <- liftST $ Q.getQVal q n
51           ; t <- liftEx v
52           ; [Reg _ val] <- return $ getDst t
53           ; return $ Reg (Virtual n x) val
54           }
55        `handle` (Reg (Virtual n x) NotKnown)
56    subst (Real r) 
57      = do { val <- RF.read file r
58           ; return $ Reg (Real r) (Val val)
59           }
60