Safe Haskell | None |
---|---|
Language | Haskell2010 |
- newtype Bytes = Bytes {}
- class HasBytes a where
- data Size
- class HasSize a where
- class IsSize s
- data Access
- data Operand :: Access -> Size -> *
- resizeOperand :: IsSize s' => Operand RW s -> Operand RW s'
- addr :: IsSize s => Address s -> Operand rw s'
- addr8 :: IsSize s => Address s -> Operand rw S8
- addr16 :: IsSize s => Address s -> Operand rw S16
- addr32 :: IsSize s => Address s -> Operand rw S32
- addr64 :: IsSize s => Address s -> Operand rw S64
- ipBase :: Operand rw s
- rax :: FromReg c => c S64
- rcx :: FromReg c => c S64
- rdx :: FromReg c => c S64
- rbx :: FromReg c => c S64
- rsp :: FromReg c => c S64
- rbp :: FromReg c => c S64
- rsi :: FromReg c => c S64
- rdi :: FromReg c => c S64
- r8 :: FromReg c => c S64
- r9 :: FromReg c => c S64
- r10 :: FromReg c => c S64
- r11 :: FromReg c => c S64
- r12 :: FromReg c => c S64
- r13 :: FromReg c => c S64
- r14 :: FromReg c => c S64
- r15 :: FromReg c => c S64
- eax :: FromReg c => c S32
- ecx :: FromReg c => c S32
- edx :: FromReg c => c S32
- ebx :: FromReg c => c S32
- esp :: FromReg c => c S32
- ebp :: FromReg c => c S32
- esi :: FromReg c => c S32
- edi :: FromReg c => c S32
- r8d :: FromReg c => c S32
- r9d :: FromReg c => c S32
- r10d :: FromReg c => c S32
- r11d :: FromReg c => c S32
- r12d :: FromReg c => c S32
- r13d :: FromReg c => c S32
- r14d :: FromReg c => c S32
- r15d :: FromReg c => c S32
- ax :: FromReg c => c S16
- cx :: FromReg c => c S16
- dx :: FromReg c => c S16
- bx :: FromReg c => c S16
- sp :: FromReg c => c S16
- bp :: FromReg c => c S16
- si :: FromReg c => c S16
- di :: FromReg c => c S16
- r8w :: FromReg c => c S16
- r9w :: FromReg c => c S16
- r10w :: FromReg c => c S16
- r11w :: FromReg c => c S16
- r12w :: FromReg c => c S16
- r13w :: FromReg c => c S16
- r14w :: FromReg c => c S16
- r15w :: FromReg c => c S16
- al :: FromReg c => c S8
- cl :: FromReg c => c S8
- dl :: FromReg c => c S8
- bl :: FromReg c => c S8
- spl :: FromReg c => c S8
- bpl :: FromReg c => c S8
- sil :: FromReg c => c S8
- dil :: FromReg c => c S8
- r8b :: FromReg c => c S8
- r9b :: FromReg c => c S8
- r10b :: FromReg c => c S8
- r11b :: FromReg c => c S8
- r12b :: FromReg c => c S8
- r13b :: FromReg c => c S8
- r14b :: FromReg c => c S8
- r15b :: FromReg c => c S8
- ah :: FromReg c => c S8
- ch :: FromReg c => c S8
- dh :: FromReg c => c S8
- bh :: FromReg c => c S8
- xmm0 :: FromReg c => c S128
- xmm1 :: FromReg c => c S128
- xmm2 :: FromReg c => c S128
- xmm3 :: FromReg c => c S128
- xmm4 :: FromReg c => c S128
- xmm5 :: FromReg c => c S128
- xmm6 :: FromReg c => c S128
- xmm7 :: FromReg c => c S128
- data Condition
- pattern O :: Condition
- pattern NO :: Condition
- pattern B :: Condition
- pattern C :: Condition
- pattern NB :: Condition
- pattern NC :: Condition
- pattern E :: Condition
- pattern Z :: Condition
- pattern NE :: Condition
- pattern NZ :: Condition
- pattern NA :: Condition
- pattern BE :: Condition
- pattern A :: Condition
- pattern NBE :: Condition
- pattern S :: Condition
- pattern NS :: Condition
- pattern P :: Condition
- pattern NP :: Condition
- pattern L :: Condition
- pattern NL :: Condition
- pattern NG :: Condition
- pattern LE :: Condition
- pattern G :: Condition
- pattern NLE :: Condition
- data Code where
- pattern Ret :: Code
- pattern Nop :: Code
- pattern PushF :: Code
- pattern PopF :: Code
- pattern Cmc :: Code
- pattern Clc :: Code
- pattern Stc :: Code
- pattern Cli :: Code
- pattern Sti :: Code
- pattern Cld :: Code
- pattern Std :: Code
- pattern Inc :: () => forall s. IsSize s => Operand RW s -> Code
- pattern Dec :: () => forall s. IsSize s => Operand RW s -> Code
- pattern Not :: () => forall s. IsSize s => Operand RW s -> Code
- pattern Neg :: () => forall s. IsSize s => Operand RW s -> Code
- pattern Add :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Or :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Adc :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Sbb :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern And :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Sub :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Xor :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Cmp :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Test :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Mov :: () => forall s r. IsSize s => Operand RW s -> Operand r s -> Code
- pattern Cmov :: () => forall s. IsSize s => Condition -> Operand RW s -> Operand RW s -> Code
- pattern Rol :: () => forall s r. IsSize s => Operand RW s -> Operand r S8 -> Code
- pattern Ror :: () => forall s r. IsSize s => Operand RW s -> Operand r S8 -> Code
- pattern Rcl :: () => forall s r. IsSize s => Operand RW s -> Operand r S8 -> Code
- pattern Rcr :: () => forall s r. IsSize s => Operand RW s -> Operand r S8 -> Code
- pattern Shl :: () => forall s r. IsSize s => Operand RW s -> Operand r S8 -> Code
- pattern Shr :: () => forall s r. IsSize s => Operand RW s -> Operand r S8 -> Code
- pattern Sar :: () => forall s r. IsSize s => Operand RW s -> Operand r S8 -> Code
- pattern Xchg :: () => forall s. IsSize s => Operand RW s -> Operand RW s -> Code
- pattern Movd :: () => forall s s' r. (IsSize s, IsSize s') => Operand RW s -> Operand r s' -> Code
- pattern Movq :: () => forall s s' r. (IsSize s, IsSize s') => Operand RW s -> Operand r s' -> Code
- pattern Movdqa :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Paddb :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Paddw :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Paddd :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Paddq :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Psubb :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Psubw :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Psubd :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Psubq :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Pxor :: () => forall r. Operand RW S128 -> Operand r S128 -> Code
- pattern Psllw :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Pslld :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Psllq :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Pslldq :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Psrlw :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Psrld :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Psrlq :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Psrldq :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Psraw :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Psrad :: () => forall r. Operand RW S128 -> Operand r S8 -> Code
- pattern Lea :: () => forall s s'. (IsSize s, IsSize s') => Operand RW s -> Operand RW s' -> Code
- pattern J :: Condition -> Maybe Size -> Code
- pattern Pop :: Operand RW S64 -> Code
- pattern Push :: () => forall r. Operand r S64 -> Code
- pattern Call :: Operand RW S64 -> Code
- pattern Jmpq :: Operand RW S64 -> Code
- pattern Jmp :: Maybe Size -> Code
- pattern Data :: Bytes -> Code
- pattern Align :: Int -> Code
- pattern Label :: Code
- (<>) :: Monoid m => m -> m -> m
- (<.>) :: Code -> Code -> Code
- (<:>) :: Code -> Code -> Code
- jmp :: Code -> Code
- jmp_back :: Code
- jmp8 :: Code
- jmp32 :: Code
- j :: Condition -> Code -> Code
- j8 :: Condition -> Code -> Code
- j32 :: Condition -> Code -> Code
- j_back :: Code -> Condition -> Code
- j_back8 :: Code -> Condition -> Code
- j_back32 :: Code -> Condition -> Code
- if_ :: Condition -> Code -> Code -> Code
- lea8 :: IsSize s => Operand RW s -> Operand RW S8 -> Code
- leaData :: (HasBytes t, IsSize s) => Operand RW s -> t -> Code
- class Callable a
- compile :: Callable a => Code -> a
- callFun :: Operand RW S64 -> FunPtr a -> Code
- saveNonVolatile :: Code -> Code
- arg1 :: FromReg c => c S64
- arg2 :: FromReg c => c S64
- arg3 :: FromReg c => c S64
- arg4 :: FromReg c => c S64
- result :: FromReg c => c S64
- class CallableHs a
- hsPtr :: CallableHs a => a -> FunPtr a
- runTests :: IO ()
- newtype CString = CString String
- traceReg :: IsSize s => String -> Operand RW s -> Code
- printf :: FunPtr a
Byte sequences
Sizes (in bits)
ssize
Operands
Memory references
Registers
64 bit registers
32 bit registers
16 bit registers
8 bit low registers
8 bit high registers
SSE registers
Conditions
Assembly codes
pattern Cmov :: () => forall s. IsSize s => Condition -> Operand RW s -> Operand RW s -> Code Source #
pattern Movd :: () => forall s s' r. (IsSize s, IsSize s') => Operand RW s -> Operand r s' -> Code Source #
pattern Movq :: () => forall s s' r. (IsSize s, IsSize s') => Operand RW s -> Operand r s' -> Code Source #
pattern Lea :: () => forall s s'. (IsSize s, IsSize s') => Operand RW s -> Operand RW s' -> Code Source #
Compound assembly codes
auto size jump; the extra argument is the code between the jump and the label
Compilation
unsafeCallForeignPtr
Callable Bool Source # | |
Callable Int Source # | |
Callable Int8 Source # | |
Callable Int16 Source # | |
Callable Int32 Source # | |
Callable Int64 Source # | |
Callable Word Source # | |
Callable Word8 Source # | |
Callable Word16 Source # | |
Callable Word32 Source # | |
Callable Word64 Source # | |
Callable (IO ()) Source # | |
Callable (Word64 -> Word64) Source # | |
Callable (Ptr a -> Int) Source # | |
Callable (Ptr a -> Int64) Source # | |
Callable (Ptr a -> Word) Source # | |
Callable (Ptr a -> Word64) Source # | |
Calling C and Haskell from Assembly
saveNonVolatile :: Code -> Code Source #
Save the non-volatile registers
Note: R12..R15 should be preserved on both Windows and Linux. This is the responsability of the user (this won't save them).
hsPtr :: CallableHs a => a -> FunPtr a Source #