Merge in new code generator branch.
[ghc-hetmet.git] / compiler / nativeGen / SPARC / CodeGen / Amode.hs
1
2 module SPARC.CodeGen.Amode (
3         getAmode
4 )
5
6 where
7
8 import {-# SOURCE #-} SPARC.CodeGen.Gen32
9 import SPARC.CodeGen.Base
10 import SPARC.AddrMode
11 import SPARC.Imm
12 import SPARC.Instr
13 import SPARC.Regs
14 import SPARC.Base
15 import NCGMonad
16 import Size
17
18 import OldCmm
19
20 import OrdList
21
22
23 -- | Generate code to reference a memory address.
24 getAmode 
25         :: CmmExpr      -- ^ expr producing an address
26         -> NatM Amode
27
28 getAmode tree@(CmmRegOff _ _) 
29         = getAmode (mangleIndexTree tree)
30
31 getAmode (CmmMachOp (MO_Sub _) [x, CmmLit (CmmInt i _)])
32   | fits13Bits (-i)
33   = do
34        (reg, code) <- getSomeReg x
35        let
36          off  = ImmInt (-(fromInteger i))
37        return (Amode (AddrRegImm reg off) code)
38
39
40 getAmode (CmmMachOp (MO_Add _) [x, CmmLit (CmmInt i _)])
41   | fits13Bits i
42   = do
43        (reg, code) <- getSomeReg x
44        let
45          off  = ImmInt (fromInteger i)
46        return (Amode (AddrRegImm reg off) code)
47
48 getAmode (CmmMachOp (MO_Add _) [x, y])
49   = do
50     (regX, codeX) <- getSomeReg x
51     (regY, codeY) <- getSomeReg y
52     let
53         code = codeX `appOL` codeY
54     return (Amode (AddrRegReg regX regY) code)
55
56 getAmode (CmmLit lit)
57   = do
58         let imm__2      = litToImm lit
59         tmp1    <- getNewRegNat II32
60         tmp2    <- getNewRegNat II32
61
62         let code = toOL [ SETHI (HI imm__2) tmp1
63                         , OR    False tmp1 (RIImm (LO imm__2)) tmp2]
64                 
65         return (Amode (AddrRegReg tmp2 g0) code)
66
67 getAmode other
68   = do
69        (reg, code) <- getSomeReg other
70        let
71             off  = ImmInt 0
72        return (Amode (AddrRegImm reg off) code)