module SPARC.CodeGen.Base (
        InstrBlock,
        CondCode(..),
        ChildCode64(..),
        Amode(..),
        Register(..),
        setFormatOfRegister,
        getRegisterReg,
        mangleIndexTree
)
where
import SPARC.Instr
import SPARC.Cond
import SPARC.AddrMode
import SPARC.Regs
import Format
import Reg
import CodeGen.Platform
import DynFlags
import Cmm
import PprCmmExpr ()
import Platform
import Outputable
import OrdList
type InstrBlock
        = OrdList Instr
data CondCode
        = CondCode Bool Cond InstrBlock
data ChildCode64
   = ChildCode64
        InstrBlock
        Reg
data Amode
        = Amode
                
                
                AddrMode
                
                
                InstrBlock
data Register
        = Fixed Format Reg InstrBlock
        | Any   Format (Reg -> InstrBlock)
setFormatOfRegister
        :: Register -> Format -> Register
setFormatOfRegister reg format
 = case reg of
        Fixed _ reg code        -> Fixed format reg code
        Any _ codefn            -> Any   format codefn
getRegisterReg :: Platform -> CmmReg -> Reg
getRegisterReg _ (CmmLocal (LocalReg u pk))
        = RegVirtual $ mkVirtualReg u (cmmTypeFormat pk)
getRegisterReg platform (CmmGlobal mid)
  = case globalRegMaybe platform mid of
        Just reg -> RegReal reg
        Nothing  -> pprPanic
                        "SPARC.CodeGen.Base.getRegisterReg: global is in memory"
                        (ppr $ CmmGlobal mid)
mangleIndexTree :: DynFlags -> CmmExpr -> CmmExpr
mangleIndexTree dflags (CmmRegOff reg off)
        = CmmMachOp (MO_Add width) [CmmReg reg, CmmLit (CmmInt (fromIntegral off) width)]
        where width = typeWidth (cmmRegType dflags reg)
mangleIndexTree _ _
        = panic "SPARC.CodeGen.Base.mangleIndexTree: no match"