SPARC.Instr

ghc-8.0.0.20160204: 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