2 module SPARC.CodeGen.Amode (
8 import {-# SOURCE #-} SPARC.CodeGen.Gen32
9 import SPARC.CodeGen.Base
23 -- | Generate code to reference a memory address.
25 :: CmmExpr -- ^ expr producing an address
28 getAmode tree@(CmmRegOff _ _)
29 = getAmode (mangleIndexTree tree)
31 getAmode (CmmMachOp (MO_Sub _) [x, CmmLit (CmmInt i _)])
34 (reg, code) <- getSomeReg x
36 off = ImmInt (-(fromInteger i))
37 return (Amode (AddrRegImm reg off) code)
40 getAmode (CmmMachOp (MO_Add _) [x, CmmLit (CmmInt i _)])
43 (reg, code) <- getSomeReg x
45 off = ImmInt (fromInteger i)
46 return (Amode (AddrRegImm reg off) code)
48 getAmode (CmmMachOp (MO_Add _) [x, y])
50 (regX, codeX) <- getSomeReg x
51 (regY, codeY) <- getSomeReg y
53 code = codeX `appOL` codeY
54 return (Amode (AddrRegReg regX regY) code)
58 let imm__2 = litToImm lit
59 tmp1 <- getNewRegNat II32
60 tmp2 <- getNewRegNat II32
62 let code = toOL [ SETHI (HI imm__2) tmp1
63 , OR False tmp1 (RIImm (LO imm__2)) tmp2]
65 return (Amode (AddrRegReg tmp2 g0) code)
69 (reg, code) <- getSomeReg other
72 return (Amode (AddrRegImm reg off) code)