2 module SPARC.AddrMode (
13 -- addressing modes ------------------------------------------------------------
15 -- | Represents a memory address in an instruction.
16 -- Being a RISC machine, the SPARC addressing modes are very regular.
19 = AddrRegReg Reg Reg -- addr = r1 + r2
20 | AddrRegImm Reg Imm -- addr = r1 + imm
23 -- | Add an integer offset to the address in an AddrMode.
25 addrOffset :: AddrMode -> Int -> Maybe AddrMode
28 AddrRegImm r (ImmInt n)
29 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt n2))
30 | otherwise -> Nothing
33 AddrRegImm r (ImmInteger n)
34 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt (fromInteger n2)))
35 | otherwise -> Nothing
36 where n2 = n + toInteger off
38 AddrRegReg r (RegReal (RealRegSingle 0))
39 | fits13Bits off -> Just (AddrRegImm r (ImmInt off))
40 | otherwise -> Nothing