ghc-9.6.3: The GHC API

Safe Haskell | Safe-Inferred
Language | Haskell2010

GHC.CmmToAsm.X86.Instr

Synopsis

- data Instr
  - = COMMENT FastString
  - | LOCATION Int Int Int String
  - | LDATA Section (Alignment, RawCmmStatics)
  - | NEWBLOCK BlockId
  - | UNWIND CLabel UnwindTable
  - | DELTA Int
  - | MOV Format Operand Operand
  - | CMOV Cond Format Operand Reg
  - | MOVZxL Format Operand Operand
  - | MOVSxL Format Operand Operand
  - | LEA Format Operand Operand
  - | ADD Format Operand Operand
  - | ADC Format Operand Operand
  - | SUB Format Operand Operand
  - | SBB Format Operand Operand
  - | MUL Format Operand Operand
  - | MUL2 Format Operand
  - | IMUL Format Operand Operand
  - | IMUL2 Format Operand
  - | DIV Format Operand
  - | IDIV Format Operand
  - | ADD_CC Format Operand Operand
  - | SUB_CC Format Operand Operand
  - | AND Format Operand Operand
  - | OR Format Operand Operand
  - | XOR Format Operand Operand
  - | NOT Format Operand
  - | NEGI Format Operand
  - | BSWAP Format Reg
  - | SHL Format Operand Operand
  - | SAR Format Operand Operand
  - | SHR Format Operand Operand
  - | BT Format Imm Operand
  - | NOP
  - | X87Store Format AddrMode
  - | CVTSS2SD Reg Reg
  - | CVTSD2SS Reg Reg
  - | CVTTSS2SIQ Format Operand Reg
  - | CVTTSD2SIQ Format Operand Reg
  - | CVTSI2SS Format Operand Reg
  - | CVTSI2SD Format Operand Reg
  - | FDIV Format Operand Operand
  - | SQRT Format Operand Reg
  - | TEST Format Operand Operand
  - | CMP Format Operand Operand
  - | SETCC Cond Operand
  - | PUSH Format Operand
  - | POP Format Operand
  - | JMP Operand [Reg]
  - | JXX Cond BlockId
  - | JXX_GBL Cond Imm
  - | JMP_TBL Operand [Maybe JumpDest] Section CLabel
  - | CALL (Either Imm Reg) [Reg]
  - | CLTD Format
  - | FETCHGOT Reg
  - | FETCHPC Reg
  - | POPCNT Format Operand Reg
  - | LZCNT Format Operand Reg
  - | TZCNT Format Operand Reg
  - | BSF Format Operand Reg
  - | BSR Format Operand Reg
  - | PDEP Format Operand Operand Reg
  - | PEXT Format Operand Operand Reg
  - | PREFETCH PrefetchVariant Format Operand
  - | LOCK Instr
  - | XADD Format Operand Operand
  - | CMPXCHG Format Operand Operand
  - | XCHG Format Operand Reg
  - | MFENCE
- data Operand
  - = OpReg Reg
  - | OpImm Imm
  - | OpAddr AddrMode
- data PrefetchVariant
  - = NTA
  - | Lvl0
  - | Lvl1
  - | Lvl2
- data JumpDest
  - = DestBlockId BlockId
  - | DestImm Imm
- getJumpDestBlockId :: JumpDest -> Maybe BlockId
- canShortcut :: Instr -> Maybe JumpDest
- shortcutStatics :: (BlockId -> Maybe JumpDest) -> (Alignment, RawCmmStatics) -> (Alignment, RawCmmStatics)
- shortcutJump :: (BlockId -> Maybe JumpDest) -> Instr -> Instr
- allocMoreStack :: Platform -> Int -> NatCmmDecl statics Instr -> UniqSM (NatCmmDecl statics Instr, [(BlockId, BlockId)])
- maxSpillSlots :: NCGConfig -> Int
- archWordFormat :: Bool -> Format
- takeRegRegMoveInstr :: Instr -> Maybe (Reg, Reg)
- regUsageOfInstr :: Platform -> Instr -> RegUsage
- takeDeltaInstr :: Instr -> Maybe Int
- mkLoadInstr :: NCGConfig -> Reg -> Int -> Int -> [Instr]
- mkJumpInstr :: BlockId -> [Instr]
- mkStackAllocInstr :: Platform -> Int -> [Instr]
- mkStackDeallocInstr :: Platform -> Int -> [Instr]
- mkSpillInstr :: NCGConfig -> Reg -> Int -> Int -> [Instr]
- mkRegRegMoveInstr :: Platform -> Reg -> Reg -> Instr
- jumpDestsOfInstr :: Instr -> [BlockId]
- patchRegsOfInstr :: Instr -> (Reg -> Reg) -> Instr
- patchJumpInstr :: Instr -> (BlockId -> BlockId) -> Instr
- isMetaInstr :: Instr -> Bool
- isJumpishInstr :: Instr -> Bool

# Documentation

data Instr Source #

Constructors

COMMENT FastString |
LOCATION Int Int Int String |
LDATA Section (Alignment, RawCmmStatics) |
NEWBLOCK BlockId |
UNWIND CLabel UnwindTable |
DELTA Int |
MOV Format Operand Operand | N.B. when used with the `II64` `Format`, the source operand is interpreted to be a 32-bit sign-extended value. True 64-bit operands need to be moved with `MOVABS`, which we currently don't use.
CMOV Cond Format Operand Reg |
MOVZxL Format Operand Operand | The format argument is the size of operand 1 (the number of bits we keep) We always zero *all* high bits, even though this isn't how the actual instruction works. The code generator also seems to rely on this behaviour and it's faster to execute on many cpus as well so for now I'm just documenting the fact.
MOVSxL Format Operand Operand |
LEA Format Operand Operand |
ADD Format Operand Operand |
ADC Format Operand Operand |
SUB Format Operand Operand |
SBB Format Operand Operand |
MUL Format Operand Operand |
MUL2 Format Operand |
IMUL Format Operand Operand |
IMUL2 Format Operand |
DIV Format Operand |
IDIV Format Operand |
ADD_CC Format Operand Operand |
SUB_CC Format Operand Operand |
AND Format Operand Operand |
OR Format Operand Operand |
XOR Format Operand Operand |
NOT Format Operand |
NEGI Format Operand |
BSWAP Format Reg |
SHL Format Operand Operand |
SAR Format Operand Operand |
SHR Format Operand Operand |
BT Format Imm Operand |
NOP |
X87Store Format AddrMode |
CVTSS2SD Reg Reg |
CVTSD2SS Reg Reg |
CVTTSS2SIQ Format Operand Reg |
CVTTSD2SIQ Format Operand Reg |
CVTSI2SS Format Operand Reg |
CVTSI2SD Format Operand Reg |
FDIV Format Operand Operand |
SQRT Format Operand Reg |
TEST Format Operand Operand |
CMP Format Operand Operand |
SETCC Cond Operand |
PUSH Format Operand |
POP Format Operand |
JMP Operand [Reg] |
JXX Cond BlockId |
JXX_GBL Cond Imm |
JMP_TBL Operand [Maybe JumpDest] Section CLabel |
CALL | X86 call instruction

Fields

- (Either Imm Reg)

  Jump target

- [Reg]

  Arguments (required for register allocation)

CLTD Format |
FETCHGOT Reg |
FETCHPC Reg |
POPCNT Format Operand Reg |
LZCNT Format Operand Reg |
TZCNT Format Operand Reg |
BSF Format Operand Reg |
BSR Format Operand Reg |
PDEP Format Operand Operand Reg |
PEXT Format Operand Operand Reg |
PREFETCH PrefetchVariant Format Operand |
LOCK Instr |
XADD Format Operand Operand |
CMPXCHG Format Operand Operand |
XCHG Format Operand Reg |
MFENCE |

#### Instances

Instances details

Instruction Instr Source # | Instruction instance for x86 instruction set.

Instance details

Defined in GHC.CmmToAsm.X86

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 :: NCGConfig -> Reg -> Int -> Int -> [Instr] Source #

mkLoadInstr :: NCGConfig -> 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 #

pprInstr :: Platform -> Instr -> SDoc Source #

mkComment :: FastString -> [Instr] Source #

data Operand Source #

Constructors

OpReg Reg |
OpImm Imm |
OpAddr AddrMode |

data PrefetchVariant Source #

Constructors

NTA |
Lvl0 |
Lvl1 |
Lvl2 |

data JumpDest Source #

Constructors

DestBlockId BlockId |
DestImm Imm |

#### Instances

Instances details

Outputable JumpDest Source # |
Instance details Defined in GHC.CmmToAsm.X86.Instr Methods ppr :: JumpDest -> SDoc Source #

getJumpDestBlockId :: JumpDest -> Maybe BlockId Source #

canShortcut :: Instr -> Maybe JumpDest Source #

shortcutStatics :: (BlockId -> Maybe JumpDest) -> (Alignment, RawCmmStatics) -> (Alignment, RawCmmStatics) Source #

shortcutJump :: (BlockId -> Maybe JumpDest) -> Instr -> Instr Source #

allocMoreStack :: Platform -> Int -> NatCmmDecl statics Instr -> UniqSM (NatCmmDecl statics Instr, [(BlockId, BlockId)]) Source #

maxSpillSlots :: NCGConfig -> Int Source #

archWordFormat :: Bool -> Format Source #

takeRegRegMoveInstr :: Instr -> Maybe (Reg, Reg) Source #

Check whether an instruction represents a reg-reg move. The register allocator attempts to eliminate reg->reg moves whenever it can, by assigning the src and dest temporaries to the same real register.

regUsageOfInstr :: Platform -> Instr -> RegUsage Source #

Returns which registers are read and written as a (read, written) pair.

takeDeltaInstr :: Instr -> Maybe Int Source #

See if this instruction is telling us the current C stack delta

mkLoadInstr :: NCGConfig -> Reg -> Int -> Int -> [Instr] Source #

Make a spill reload instruction.

mkJumpInstr :: BlockId -> [Instr] Source #

Make an unconditional branch instruction.

mkStackAllocInstr :: Platform -> Int -> [Instr] Source #

mkStackDeallocInstr :: Platform -> Int -> [Instr] Source #

mkSpillInstr :: NCGConfig -> Reg -> Int -> Int -> [Instr] Source #

Make a spill instruction.

mkRegRegMoveInstr :: Platform -> Reg -> Reg -> Instr Source #

Make a reg-reg move instruction.

jumpDestsOfInstr :: Instr -> [BlockId] Source #

patchRegsOfInstr :: Instr -> (Reg -> Reg) -> Instr Source #

Applies the supplied function to all registers in instructions. Typically used to change virtual registers to real registers.

patchJumpInstr :: Instr -> (BlockId -> BlockId) -> Instr Source #

isMetaInstr :: Instr -> Bool Source #

isJumpishInstr :: Instr -> Bool Source #