Make dumpIfSet_dyn_or use dumpSDoc
[ghc-hetmet.git] / compiler / nativeGen / SPARC / AddrMode.hs
1
2 module SPARC.AddrMode (
3         AddrMode(..),
4         addrOffset
5 )
6
7 where
8
9 import SPARC.Imm
10 import SPARC.Base
11 import Reg
12
13 -- addressing modes ------------------------------------------------------------
14
15 -- | Represents a memory address in an instruction.
16 --      Being a RISC machine, the SPARC addressing modes are very regular.
17 --
18 data AddrMode
19         = AddrRegReg    Reg Reg         -- addr = r1 + r2
20         | AddrRegImm    Reg Imm         -- addr = r1 + imm
21
22
23 -- | Add an integer offset to the address in an AddrMode.
24 --
25 addrOffset :: AddrMode -> Int -> Maybe AddrMode
26 addrOffset addr off
27   = case addr of
28       AddrRegImm r (ImmInt n)
29        | fits13Bits n2 -> Just (AddrRegImm r (ImmInt n2))
30        | otherwise     -> Nothing
31        where n2 = n + off
32
33       AddrRegImm r (ImmInteger n)
34        | fits13Bits n2 -> Just (AddrRegImm r (ImmInt (fromInteger n2)))
35        | otherwise     -> Nothing
36        where n2 = n + toInteger off
37
38       AddrRegReg r (RegReal (RealRegSingle 0))
39        | fits13Bits off -> Just (AddrRegImm r (ImmInt off))
40        | otherwise     -> Nothing
41        
42       _ -> Nothing