ghc-8.0.2: The GHC API

Safe Haskell | None
Language | Haskell2010

SPARC.Instr

Synopsis

- data RI
  - = RIReg Reg
  - | RIImm Imm
- riZero :: RI -> Bool
- fpRelEA :: Int -> Reg -> Instr
- moveSp :: Int -> Instr
- isUnconditionalJump :: Instr -> Bool
- data Instr
  - = COMMENT FastString
  - | LDATA Section CmmStatics
  - | NEWBLOCK BlockId
  - | DELTA Int
  - | LD Format AddrMode Reg
  - | ST Format Reg AddrMode
  - | ADD Bool Bool Reg RI Reg
  - | SUB Bool Bool Reg RI Reg
  - | UMUL Bool Reg RI Reg
  - | SMUL Bool Reg RI Reg
  - | UDIV Bool Reg RI Reg
  - | SDIV Bool Reg RI Reg
  - | RDY Reg
  - | WRY Reg Reg
  - | AND Bool Reg RI Reg
  - | ANDN Bool Reg RI Reg
  - | OR Bool Reg RI Reg
  - | ORN Bool Reg RI Reg
  - | XOR Bool Reg RI Reg
  - | XNOR Bool Reg RI Reg
  - | SLL Reg RI Reg
  - | SRL Reg RI Reg
  - | SRA Reg RI Reg
  - | SETHI Imm Reg
  - | NOP
  - | FABS Format Reg Reg
  - | FADD Format Reg Reg Reg
  - | FCMP Bool Format Reg Reg
  - | FDIV Format Reg Reg Reg
  - | FMOV Format Reg Reg
  - | FMUL Format Reg Reg Reg
  - | FNEG Format Reg Reg
  - | FSQRT Format Reg Reg
  - | FSUB Format Reg Reg Reg
  - | FxTOy Format Format Reg Reg
  - | BI Cond Bool BlockId
  - | BF Cond Bool BlockId
  - | JMP AddrMode
  - | JMP_TBL AddrMode [Maybe BlockId] CLabel
  - | CALL (Either Imm Reg) Int Bool
- maxSpillSlots :: DynFlags -> Int

# Documentation

data RI Source #

Register or immediate

Constructors

RIReg Reg |
RIImm Imm |

riZero :: RI -> Bool Source #

Check if a RI represents a zero value. - a literal zero - register %g0, which is always zero.

fpRelEA :: Int -> Reg -> Instr Source #

Calculate the effective address which would be used by the corresponding fpRel sequence.

moveSp :: Int -> Instr Source #

Code to shift the stack pointer by n words.

isUnconditionalJump :: Instr -> Bool Source #

An instruction that will cause the one after it never to be exectuted

data Instr Source #

SPARC instruction set. Not complete. This is only the ones we need.

Constructors

COMMENT FastString |
LDATA Section CmmStatics |
NEWBLOCK BlockId |
DELTA Int |
LD Format AddrMode Reg |
ST Format Reg AddrMode |
ADD Bool Bool Reg RI Reg |
SUB Bool Bool Reg RI Reg |
UMUL Bool Reg RI Reg |
SMUL Bool Reg RI Reg |
UDIV Bool Reg RI Reg |
SDIV Bool Reg RI Reg |
RDY Reg |
WRY Reg Reg |
AND Bool Reg RI Reg |
ANDN Bool Reg RI Reg |
OR Bool Reg RI Reg |
ORN Bool Reg RI Reg |
XOR Bool Reg RI Reg |
XNOR Bool Reg RI Reg |
SLL Reg RI Reg |
SRL Reg RI Reg |
SRA Reg RI Reg |
SETHI Imm Reg |
NOP |
FABS Format Reg Reg |
FADD Format Reg Reg Reg |
FCMP Bool Format Reg Reg |
FDIV Format Reg Reg Reg |
FMOV Format Reg Reg |
FMUL Format Reg Reg Reg |
FNEG Format Reg Reg |
FSQRT Format Reg Reg |
FSUB Format Reg Reg Reg |
FxTOy Format Format Reg Reg |
BI Cond Bool BlockId |
BF Cond Bool BlockId |
JMP AddrMode |
JMP_TBL AddrMode [Maybe BlockId] CLabel |
CALL (Either Imm Reg) Int Bool |

Instances

Instruction Instr # | instance for sparc instruction set
Methods regUsageOfInstr :: Platform -> Instr -> RegUsage Source # patchRegsOfInstr :: Instr -> (Reg -> Reg) -> Instr Source # isJumpishInstr :: Instr -> Bool Source # jumpDestsOfInstr :: Instr -> [BlockId] Source # patchJumpInstr :: Instr -> (BlockId -> BlockId) -> Instr Source # mkSpillInstr :: DynFlags -> Reg -> Int -> Int -> Instr Source # mkLoadInstr :: DynFlags -> Reg -> Int -> Int -> Instr Source # takeDeltaInstr :: Instr -> Maybe Int Source # isMetaInstr :: Instr -> Bool Source # mkRegRegMoveInstr :: Platform -> Reg -> Reg -> Instr Source # takeRegRegMoveInstr :: Instr -> Maybe (Reg, Reg) Source # mkJumpInstr :: BlockId -> [Instr] Source # mkStackAllocInstr :: Platform -> Int -> Instr Source # mkStackDeallocInstr :: Platform -> Int -> Instr Source #

maxSpillSlots :: DynFlags -> Int Source #

The maximum number of spill slots available on the C stack. If we use up all of the slots, then we're screwed.

Why do we reserve 64 bytes, instead of using the whole thing?? -- BL 20090215