harpy 0.4.3.0 → 0.5.0.0
raw patch · 5 files changed
+49/−37 lines, 5 filesdep ~disassemblerdep ~mtldep ~parsecPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: disassembler, mtl, parsec
API changes (from Hackage documentation)
- Harpy.Call: conv[a9D8] :: FunPtr () -> IO ()
- Harpy.Call: conv[a9E4] :: FunPtr (Word32 -> Word32) -> Word32 -> IO Word32
- Harpy.Call: conv[a9IR] :: FunPtr (Ptr a[a9IK] -> Ptr b[a9IL] -> Ptr c[a9IM] -> Ptr d[a9IN] -> Ptr e[a9IO] -> Ptr f[a9IP] -> Ptr g[a9IQ] -> ()) -> Ptr a[a9IK] -> Ptr b[a9IL] -> Ptr c[a9IM] -> Ptr d[a9IN] -> Ptr e[a9IO] -> Ptr f[a9IP] -> Ptr g[a9IQ] -> IO ()
- Harpy.X86Assembler: ah :: Reg8
- Harpy.X86Assembler: al :: Reg8
- Harpy.X86Assembler: ax :: Reg16
- Harpy.X86Assembler: bh :: Reg8
- Harpy.X86Assembler: bl :: Reg8
- Harpy.X86Assembler: bp :: Reg16
- Harpy.X86Assembler: bx :: Reg16
- Harpy.X86Assembler: ch :: Reg8
- Harpy.X86Assembler: cl :: Reg8
- Harpy.X86Assembler: cx :: Reg16
- Harpy.X86Assembler: dh :: Reg8
- Harpy.X86Assembler: di :: Reg16
- Harpy.X86Assembler: dl :: Reg8
- Harpy.X86Assembler: dx :: Reg16
- Harpy.X86Assembler: eax :: Reg32
- Harpy.X86Assembler: ebp :: Reg32
- Harpy.X86Assembler: ebx :: Reg32
- Harpy.X86Assembler: ecx :: Reg32
- Harpy.X86Assembler: edi :: Reg32
- Harpy.X86Assembler: edx :: Reg32
- Harpy.X86Assembler: esi :: Reg32
- Harpy.X86Assembler: esp :: Reg32
- Harpy.X86Assembler: si :: Reg16
- Harpy.X86Assembler: sp :: Reg16
- Harpy.X86Assembler: xmm0 :: XMMReg
- Harpy.X86Assembler: xmm1 :: XMMReg
- Harpy.X86Assembler: xmm2 :: XMMReg
- Harpy.X86Assembler: xmm3 :: XMMReg
- Harpy.X86Assembler: xmm4 :: XMMReg
- Harpy.X86Assembler: xmm5 :: XMMReg
- Harpy.X86Assembler: xmm6 :: XMMReg
- Harpy.X86Assembler: xmm7 :: XMMReg
- Harpy.X86CodeGen: x86_adc :: Word8
- Harpy.X86CodeGen: x86_add :: Word8
- Harpy.X86CodeGen: x86_address_prefix :: Word8
- Harpy.X86CodeGen: x86_and :: Word8
- Harpy.X86CodeGen: x86_breakpoint :: CodeGen s e ()
- Harpy.X86CodeGen: x86_cc_a :: Int
- Harpy.X86CodeGen: x86_cc_ae :: Int
- Harpy.X86CodeGen: x86_cc_b :: Int
- Harpy.X86CodeGen: x86_cc_be :: Int
- Harpy.X86CodeGen: x86_cc_c :: Int
- Harpy.X86CodeGen: x86_cc_e :: Int
- Harpy.X86CodeGen: x86_cc_eq :: Int
- Harpy.X86CodeGen: x86_cc_ge :: Int
- Harpy.X86CodeGen: x86_cc_gez :: Int
- Harpy.X86CodeGen: x86_cc_le :: Int
- Harpy.X86CodeGen: x86_cc_lt :: Int
- Harpy.X86CodeGen: x86_cc_lz :: Int
- Harpy.X86CodeGen: x86_cc_na :: Int
- Harpy.X86CodeGen: x86_cc_nae :: Int
- Harpy.X86CodeGen: x86_cc_nb :: Int
- Harpy.X86CodeGen: x86_cc_nbe :: Int
- Harpy.X86CodeGen: x86_cc_nc :: Int
- Harpy.X86CodeGen: x86_cc_ne :: Int
- Harpy.X86CodeGen: x86_cc_no :: Int
- Harpy.X86CodeGen: x86_cc_np :: Int
- Harpy.X86CodeGen: x86_cc_ns :: Int
- Harpy.X86CodeGen: x86_cc_nz :: Int
- Harpy.X86CodeGen: x86_cc_o :: Int
- Harpy.X86CodeGen: x86_cc_p :: Int
- Harpy.X86CodeGen: x86_cc_pe :: Int
- Harpy.X86CodeGen: x86_cc_po :: Int
- Harpy.X86CodeGen: x86_cc_s :: Int
- Harpy.X86CodeGen: x86_cc_z :: Int
- Harpy.X86CodeGen: x86_cdq :: CodeGen s e ()
- Harpy.X86CodeGen: x86_cld :: CodeGen s e ()
- Harpy.X86CodeGen: x86_cmp :: Word8
- Harpy.X86CodeGen: x86_cs_prefix :: Word8
- Harpy.X86CodeGen: x86_ds_prefix :: Word8
- Harpy.X86CodeGen: x86_dword_size :: Int
- Harpy.X86CodeGen: x86_eax :: Word8
- Harpy.X86CodeGen: x86_eax_mask :: Int
- Harpy.X86CodeGen: x86_ebp :: Word8
- Harpy.X86CodeGen: x86_ebp_mask :: Int
- Harpy.X86CodeGen: x86_ebx :: Word8
- Harpy.X86CodeGen: x86_ebx_mask :: Int
- Harpy.X86CodeGen: x86_ecx :: Word8
- Harpy.X86CodeGen: x86_ecx_mask :: Int
- Harpy.X86CodeGen: x86_edi :: Word8
- Harpy.X86CodeGen: x86_edi_mask :: Int
- Harpy.X86CodeGen: x86_edx :: Word8
- Harpy.X86CodeGen: x86_edx_mask :: Int
- Harpy.X86CodeGen: x86_es_prefix :: Word8
- Harpy.X86CodeGen: x86_esi :: Word8
- Harpy.X86CodeGen: x86_esi_mask :: Int
- Harpy.X86CodeGen: x86_esp :: Word8
- Harpy.X86CodeGen: x86_fabs :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fadd :: Word8
- Harpy.X86CodeGen: x86_fcom :: Word8
- Harpy.X86CodeGen: x86_fcomp :: Word8
- Harpy.X86CodeGen: x86_fcos :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fdiv :: Word8
- Harpy.X86CodeGen: x86_fdivr :: Word8
- Harpy.X86CodeGen: x86_fmul :: Word8
- Harpy.X86CodeGen: x86_fp_c0 :: Word32
- Harpy.X86CodeGen: x86_fp_c1 :: Word32
- Harpy.X86CodeGen: x86_fp_c2 :: Word32
- Harpy.X86CodeGen: x86_fp_c3 :: Word32
- Harpy.X86CodeGen: x86_fp_cc_mask :: Word32
- Harpy.X86CodeGen: x86_fpatan :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fpcw_denopex_mask :: Word32
- Harpy.X86CodeGen: x86_fpcw_invopex_mask :: Word32
- Harpy.X86CodeGen: x86_fpcw_ovfex_mask :: Word32
- Harpy.X86CodeGen: x86_fpcw_prec_double :: Word32
- Harpy.X86CodeGen: x86_fpcw_prec_extended :: Word32
- Harpy.X86CodeGen: x86_fpcw_prec_single :: Word32
- Harpy.X86CodeGen: x86_fpcw_precc_mask :: Word32
- Harpy.X86CodeGen: x86_fpcw_precex_mask :: Word32
- Harpy.X86CodeGen: x86_fpcw_round_down :: Word32
- Harpy.X86CodeGen: x86_fpcw_round_nearest :: Word32
- Harpy.X86CodeGen: x86_fpcw_round_tozero :: Word32
- Harpy.X86CodeGen: x86_fpcw_round_up :: Word32
- Harpy.X86CodeGen: x86_fpcw_roundc_mask :: Word32
- Harpy.X86CodeGen: x86_fpcw_undfex_mask :: Word32
- Harpy.X86CodeGen: x86_fpcw_zerodiv_mask :: Word32
- Harpy.X86CodeGen: x86_fprem :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fprem1 :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fptan :: CodeGen s e ()
- Harpy.X86CodeGen: x86_frndint :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fs_prefix :: Word8
- Harpy.X86CodeGen: x86_fsin :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fsqrt :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fsub :: Word8
- Harpy.X86CodeGen: x86_fsubr :: Word8
- Harpy.X86CodeGen: x86_ftst :: CodeGen s e ()
- Harpy.X86CodeGen: x86_fxam :: CodeGen s e ()
- Harpy.X86CodeGen: x86_gs_prefix :: Word8
- Harpy.X86CodeGen: x86_likely_prefix :: Word8
- Harpy.X86CodeGen: x86_lock_prefix :: Word8
- Harpy.X86CodeGen: x86_movsb :: CodeGen s e ()
- Harpy.X86CodeGen: x86_movsd :: CodeGen s e ()
- Harpy.X86CodeGen: x86_movsl :: CodeGen s e ()
- Harpy.X86CodeGen: x86_operand_prefix :: Word8
- Harpy.X86CodeGen: x86_or :: Word8
- Harpy.X86CodeGen: x86_qword_size :: Int
- Harpy.X86CodeGen: x86_rcl :: Word8
- Harpy.X86CodeGen: x86_rcr :: Word8
- Harpy.X86CodeGen: x86_rep_prefix :: Word8
- Harpy.X86CodeGen: x86_repnz_prefix :: Word8
- Harpy.X86CodeGen: x86_repz_prefix :: Word8
- Harpy.X86CodeGen: x86_rol :: Word8
- Harpy.X86CodeGen: x86_ror :: Word8
- Harpy.X86CodeGen: x86_sar :: Word8
- Harpy.X86CodeGen: x86_sbb :: Word8
- Harpy.X86CodeGen: x86_shl :: Word8
- Harpy.X86CodeGen: x86_shld :: Word8
- Harpy.X86CodeGen: x86_shlr :: Word8
- Harpy.X86CodeGen: x86_shr :: Word8
- Harpy.X86CodeGen: x86_ss_prefix :: Word8
- Harpy.X86CodeGen: x86_sse_pd :: X86_SSE_PFX
- Harpy.X86CodeGen: x86_sse_ps :: X86_SSE_PFX
- Harpy.X86CodeGen: x86_sse_sd :: X86_SSE_PFX
- Harpy.X86CodeGen: x86_sse_ss :: X86_SSE_PFX
- Harpy.X86CodeGen: x86_stosb :: CodeGen s e ()
- Harpy.X86CodeGen: x86_stosd :: CodeGen s e ()
- Harpy.X86CodeGen: x86_stosl :: CodeGen s e ()
- Harpy.X86CodeGen: x86_sub :: Word8
- Harpy.X86CodeGen: x86_unlikely_prefix :: Word8
- Harpy.X86CodeGen: x86_wait :: CodeGen s e ()
- Harpy.X86CodeGen: x86_xor :: Word8
+ Harpy.Call: callAsVoid :: CodeGen e t ()
+ Harpy.Call: conv :: FunPtr () -> IO ()
+ Harpy.X86Assembler: al, bh, dh, ch, ah, bl, dl, cl :: Reg8
+ Harpy.X86Assembler: ax, di, si, bp, sp, bx, dx, cx :: Reg16
+ Harpy.X86Assembler: breakpoint :: CodeGen e s ()
+ Harpy.X86Assembler: cdq :: CodeGen e s ()
+ Harpy.X86Assembler: cld :: CodeGen e s ()
+ Harpy.X86Assembler: eax, edi, esi, ebp, esp, ebx, edx, ecx :: Reg32
+ Harpy.X86Assembler: fabs :: CodeGen e s ()
+ Harpy.X86Assembler: fchs :: CodeGen e s ()
+ Harpy.X86Assembler: fcomi :: FPReg -> CodeGen e s ()
+ Harpy.X86Assembler: fcomip :: FPReg -> CodeGen e s ()
+ Harpy.X86Assembler: fcompp :: CodeGen e s ()
+ Harpy.X86Assembler: fcos :: CodeGen e s ()
+ Harpy.X86Assembler: fld1 :: CodeGen e s ()
+ Harpy.X86Assembler: fldpi :: CodeGen e s ()
+ Harpy.X86Assembler: fldz :: CodeGen e s ()
+ Harpy.X86Assembler: fnstsw :: CodeGen e s ()
+ Harpy.X86Assembler: fp0 :: FPReg
+ Harpy.X86Assembler: fp1 :: FPReg
+ Harpy.X86Assembler: fp2 :: FPReg
+ Harpy.X86Assembler: fp3 :: FPReg
+ Harpy.X86Assembler: fp4 :: FPReg
+ Harpy.X86Assembler: fp5 :: FPReg
+ Harpy.X86Assembler: fp6 :: FPReg
+ Harpy.X86Assembler: fp7 :: FPReg
+ Harpy.X86Assembler: fpTop :: FPTopReg
+ Harpy.X86Assembler: fpatan :: CodeGen e s ()
+ Harpy.X86Assembler: fprem :: CodeGen e s ()
+ Harpy.X86Assembler: fprem1 :: CodeGen e s ()
+ Harpy.X86Assembler: fptan :: CodeGen e s ()
+ Harpy.X86Assembler: frem :: CodeGen e s ()
+ Harpy.X86Assembler: frndint :: CodeGen e s ()
+ Harpy.X86Assembler: fsin :: CodeGen e s ()
+ Harpy.X86Assembler: fsqrt :: CodeGen e s ()
+ Harpy.X86Assembler: fstsw :: CodeGen e s ()
+ Harpy.X86Assembler: ftst :: CodeGen e s ()
+ Harpy.X86Assembler: fucomi :: FPReg -> CodeGen e s ()
+ Harpy.X86Assembler: fucomip :: FPReg -> CodeGen e s ()
+ Harpy.X86Assembler: fucompp :: CodeGen e s ()
+ Harpy.X86Assembler: fxam :: CodeGen e s ()
+ Harpy.X86Assembler: fxch :: FPReg -> CodeGen e s ()
+ Harpy.X86Assembler: movsb :: CodeGen e s ()
+ Harpy.X86Assembler: movsl :: CodeGen e s ()
+ Harpy.X86Assembler: nop :: CodeGen e s ()
+ Harpy.X86Assembler: onlyCl :: CodeGen e s a
+ Harpy.X86Assembler: onlyEbp :: CodeGen e s a
+ Harpy.X86Assembler: popad :: CodeGen e s ()
+ Harpy.X86Assembler: popfd :: CodeGen e s ()
+ Harpy.X86Assembler: pushad :: CodeGen e s ()
+ Harpy.X86Assembler: pushfd :: CodeGen e s ()
+ Harpy.X86Assembler: rdtsc :: CodeGen e s ()
+ Harpy.X86Assembler: stosb :: CodeGen e s ()
+ Harpy.X86Assembler: stosd :: CodeGen e s ()
+ Harpy.X86Assembler: stosl :: CodeGen e s ()
+ Harpy.X86Assembler: wait :: CodeGen e s ()
+ Harpy.X86Assembler: xmm0, xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1 :: XMMReg
+ Harpy.X86CodeGen: x86_breakpoint, x86_movsd, x86_movsl, x86_movsb, x86_stosd, x86_stosl, x86_stosb, x86_cld :: CodeGen s e ()
+ Harpy.X86CodeGen: x86_cc_a, x86_cc_nc, x86_cc_nb, x86_cc_ae, x86_cc_ge, x86_cc_nbe :: Int
+ Harpy.X86CodeGen: x86_cc_b, x86_cc_na, x86_cc_be, x86_cc_le, x86_cc_nae, x86_cc_c :: Int
+ Harpy.X86CodeGen: x86_cc_lz, x86_cc_pe, x86_cc_p, x86_cc_ns, x86_cc_gez, x86_cc_s :: Int
+ Harpy.X86CodeGen: x86_cc_no, x86_cc_lt, x86_cc_nz, x86_cc_ne, x86_cc_z, x86_cc_e, x86_cc_eq :: Int
+ Harpy.X86CodeGen: x86_cc_np, x86_cc_o, x86_cc_po :: Int
+ Harpy.X86CodeGen: x86_cdq, x86_wait :: CodeGen s e ()
+ Harpy.X86CodeGen: x86_cmp, x86_add, x86_xor, x86_sub, x86_and, x86_sbb, x86_adc, x86_or :: Word8
+ Harpy.X86CodeGen: x86_dword_size, x86_qword_size :: Int
+ Harpy.X86CodeGen: x86_eax, x86_edi, x86_esi, x86_ebp, x86_esp, x86_ebx, x86_edx, x86_ecx :: Word8
+ Harpy.X86CodeGen: x86_edi_mask, x86_edx_mask, x86_ecx_mask, x86_eax_mask, x86_ebp_mask, x86_ebx_mask, x86_esi_mask :: Int
+ Harpy.X86CodeGen: x86_fadd, x86_fsubr, x86_fsub, x86_fcomp, x86_fcom, x86_fmul :: Word8
+ Harpy.X86CodeGen: x86_fdiv, x86_fdivr :: Word8
+ Harpy.X86CodeGen: x86_fp_c0, x86_fp_cc_mask, x86_fp_c3, x86_fp_c2, x86_fp_c1 :: Word32
+ Harpy.X86CodeGen: x86_fpcw_invopex_mask, x86_fpcw_roundc_mask, x86_fpcw_precc_mask, x86_fpcw_precex_mask, x86_fpcw_undfex_mask, x86_fpcw_ovfex_mask, x86_fpcw_zerodiv_mask, x86_fpcw_denopex_mask :: Word32
+ Harpy.X86CodeGen: x86_fpcw_prec_single, x86_fpcw_prec_extended, x86_fpcw_prec_double :: Word32
+ Harpy.X86CodeGen: x86_fpcw_round_nearest, x86_fpcw_round_tozero, x86_fpcw_round_up, x86_fpcw_round_down :: Word32
+ Harpy.X86CodeGen: x86_fsin, x86_fptan, x86_fsqrt, x86_frndint, x86_fprem1, x86_fprem, x86_fpatan, x86_fxam, x86_ftst, x86_fabs, x86_fcos :: CodeGen s e ()
+ Harpy.X86CodeGen: x86_lock_prefix, x86_address_prefix, x86_operand_prefix, x86_likely_prefix, x86_unlikely_prefix, x86_gs_prefix, x86_fs_prefix, x86_es_prefix, x86_ds_prefix, x86_ss_prefix, x86_cs_prefix, x86_rep_prefix, x86_repz_prefix, x86_repnz_prefix :: Word8
+ Harpy.X86CodeGen: x86_sar, x86_shr, x86_shl, x86_rcr, x86_rcl, x86_ror, x86_rol, x86_shlr, x86_shld :: Word8
+ Harpy.X86CodeGen: x86_sse_sd, x86_sse_ps, x86_sse_pd, x86_sse_ss :: X86_SSE_PFX
- Harpy.X86CodeGen: x86_mov_mem_imm :: Num a => Word32 -> Word32 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_mem_imm :: (Eq a, Num a) => Word32 -> Word32 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_mem_reg :: Num t => Word32 -> Word8 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_mem_reg :: (Eq t, Num t) => Word32 -> Word8 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_membase_imm :: Num a => Word8 -> Word32 -> Word32 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_membase_imm :: (Eq a, Num a) => Word8 -> Word32 -> Word32 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_membase_reg :: Num t => Word8 -> Word32 -> Word8 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_membase_reg :: (Eq t, Num t) => Word8 -> Word32 -> Word8 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_memindex_imm :: Num a => Word8 -> Word32 -> Word8 -> Word8 -> Word32 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_memindex_imm :: (Eq a, Num a) => Word8 -> Word32 -> Word8 -> Word8 -> Word32 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_memindex_reg :: Num t => Word8 -> Word32 -> Word8 -> Word8 -> Word8 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_memindex_reg :: (Eq t, Num t) => Word8 -> Word32 -> Word8 -> Word8 -> Word8 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_reg_mem :: Num t => Word8 -> Word32 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_reg_mem :: (Eq t, Num t) => Word8 -> Word32 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_reg_membase :: Num t => Word8 -> Word8 -> Word32 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_reg_membase :: (Eq t, Num t) => Word8 -> Word8 -> Word32 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_reg_memindex :: Num t => Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_reg_memindex :: (Eq t, Num t) => Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_reg_reg :: Num t => Word8 -> Word8 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_reg_reg :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_reg_regp :: Num t => Word8 -> Word8 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_reg_regp :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_mov_regp_reg :: Num t => Word8 -> Word8 -> t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_mov_regp_reg :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_padding :: Num t => t -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_padding :: (Eq t, Num t) => t -> CodeGen e s ()
- Harpy.X86CodeGen: x86_xadd_mem_reg :: Num a => Word32 -> Word8 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_xadd_mem_reg :: (Eq a, Num a) => Word32 -> Word8 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_xadd_membase_reg :: Num a => Word8 -> Word32 -> Word8 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_xadd_membase_reg :: (Eq a, Num a) => Word8 -> Word32 -> Word8 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_xadd_reg_reg :: Num a => Word8 -> Word8 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_xadd_reg_reg :: (Eq a, Num a) => Word8 -> Word8 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_xchg_mem_reg :: Num a => Word32 -> Word8 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_xchg_mem_reg :: (Eq a, Num a) => Word32 -> Word8 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_xchg_membase_reg :: Num a => Word8 -> Word32 -> Word8 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_xchg_membase_reg :: (Eq a, Num a) => Word8 -> Word32 -> Word8 -> a -> CodeGen e s ()
- Harpy.X86CodeGen: x86_xchg_reg_reg :: Num a => Word8 -> Word8 -> a -> CodeGen e s ()
+ Harpy.X86CodeGen: x86_xchg_reg_reg :: (Eq a, Num a) => Word8 -> Word8 -> a -> CodeGen e s ()
Files
- Harpy.hs +3/−1
- Harpy/Call.hs +2/−2
- Harpy/CodeGenMonad.hs +11/−1
- Harpy/X86CodeGen.hs +23/−23
- harpy.cabal +10/−10
Harpy.hs view
@@ -15,8 +15,10 @@ ---------------------------------------------------------------------------- module Harpy(module Harpy.CodeGenMonad, module Harpy.Call,- module Harpy.X86Assembler) where+ module Harpy.X86Assembler,+ module Control.Monad.Trans) where import Harpy.CodeGenMonad import Harpy.Call import Harpy.X86Assembler+import Control.Monad.Trans
Harpy/Call.hs view
@@ -23,8 +23,8 @@ #ifndef __HADDOCK__ $(callDecl "callAsVoid" [t|()|])-$(callDecl "callAsWord32ToWord32" [t|Word32 -> Word32|])-$(callDecl "callAs7PtrToVoid" [t|forall a b c d e f g . Ptr a -> Ptr b -> Ptr c -> Ptr d -> Ptr e -> Ptr f -> Ptr g -> () |])+-- $(callDecl "callAsWord32ToWord32" [t|Word32 -> Word32|])+-- $(callDecl "callAs7PtrToVoid" [t|forall a b c d e f g . Ptr a -> Ptr b -> Ptr c -> Ptr d -> Ptr e -> Ptr f -> Ptr g -> () |]) #else
Harpy/CodeGenMonad.hs view
@@ -86,6 +86,7 @@ import Data.List import qualified Data.Map as Map import Foreign+import Foreign.C.Types import System.IO import Control.Monad.Trans@@ -225,6 +226,12 @@ runCodeGen cg uenv ustate = runCodeGenWithConfig cg uenv ustate defaultCodeGenConfig +foreign import ccall "static stdlib.h"+ memalign :: CUInt -> CUInt -> IO (Ptr a)++foreign import ccall "static sys/mman.h"+ mprotect :: CUInt -> CUInt -> Int -> IO Int+ -- | Like 'runCodeGen', but allows more control over the code -- generation process. In addition to a code generator and a user -- environment and state, a code generation configuration must be@@ -234,7 +241,10 @@ runCodeGenWithConfig (CodeGen cg) uenv ustate conf = do (buf, sze) <- case customCodeBuffer conf of Nothing -> do let initSize = codeBufferSize conf- arr <- mallocBytes initSize+ let size = fromIntegral initSize+ arr <- memalign 0x1000 size+ -- 0x7 = PROT_{READ,WRITE,EXEC}+ _ <- mprotect (fromIntegral $ ptrToIntPtr arr) size 0x7 return (arr, initSize) Just (buf, sze) -> return (buf, sze) let env = CodeGenEnv {tailContext = True}
Harpy/X86CodeGen.hs view
@@ -651,7 +651,7 @@ x86_cmpxchg_membase_reg basereg disp reg = emit8 0x0f >> emit8 0xb1 >> x86_membase_emit reg basereg disp -x86_xchg :: Num a => a -> CodeGen e s ()+x86_xchg :: (Eq a, Num a) => a -> CodeGen e s () x86_xchg size = if size == 1 then emit8 0x86 else emit8 0x87 x86_xchg_reg_reg dreg reg size =@@ -661,7 +661,7 @@ x86_xchg_membase_reg basereg disp reg size = do x86_xchg size ; x86_membase_emit reg basereg disp -x86_xadd :: Num a => a -> CodeGen e s ()+x86_xadd :: (Eq a, Num a) => a -> CodeGen e s () x86_xadd size = do emit8 0x0f ; if size == 1 then emit8 0xc0 else emit8 0xc1 x86_xadd_reg_reg dreg reg size = x86_xadd size >> x86_reg_emit reg dreg x86_xadd_mem_reg mem reg size = x86_xadd size >> x86_mem_emit reg mem@@ -871,7 +871,7 @@ do emit8 0xf7 x86_membase_emit (6 + (if is_signed then 1 else 0)) basereg disp -x86_mov1 :: Num t => t -> CodeGen e s ()+x86_mov1 :: (Eq t, Num t) => t -> CodeGen e s () x86_mov1 size = case size of 1 -> emit8 0x88@@ -879,7 +879,7 @@ 4 -> emit8 0x89 _ -> failCodeGen (PP.text "invalid operand size") -x86_mov2 :: Num t => t -> CodeGen e s ()+x86_mov2 :: (Eq t, Num t) => t -> CodeGen e s () x86_mov2 size = case size of 1 -> emit8 0x8a@@ -887,42 +887,42 @@ 4 -> emit8 0x8b _ -> failCodeGen (PP.text "invalid operand size") -x86_mov_mem_reg :: (Num t) => Word32 -> Word8 -> t -> CodeGen e s ()+x86_mov_mem_reg :: (Eq t, Num t) => Word32 -> Word8 -> t -> CodeGen e s () x86_mov_mem_reg mem reg size = do x86_mov1 size ; x86_mem_emit reg mem -x86_mov_regp_reg :: (Num t) => Word8 -> Word8 -> t -> CodeGen e s ()+x86_mov_regp_reg :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s () x86_mov_regp_reg regp reg size = do x86_mov1 size ; x86_regp_emit reg regp -x86_mov_reg_regp :: (Num t) => Word8 -> Word8 -> t -> CodeGen e s ()+x86_mov_reg_regp :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s () x86_mov_reg_regp reg regp size = do x86_mov2 size ; x86_regp_emit reg regp -x86_mov_membase_reg :: (Num t) => Word8 -> Word32 -> Word8 -> t -> CodeGen e s ()+x86_mov_membase_reg :: (Eq t, Num t) => Word8 -> Word32 -> Word8 -> t -> CodeGen e s () x86_mov_membase_reg basereg disp reg size = do x86_mov1 size ; x86_membase_emit reg basereg disp -x86_mov_memindex_reg :: (Num t) => Word8 -> Word32 -> Word8 -> Word8 -> Word8 -> t -> CodeGen e s ()+x86_mov_memindex_reg :: (Eq t, Num t) => Word8 -> Word32 -> Word8 -> Word8 -> Word8 -> t -> CodeGen e s () x86_mov_memindex_reg basereg disp indexreg shft reg size = do x86_mov1 size ; x86_memindex_emit reg basereg disp indexreg shft -x86_mov_reg_reg :: (Num t) => Word8 -> Word8 -> t -> CodeGen e s ()+x86_mov_reg_reg :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s () x86_mov_reg_reg dreg reg size = do x86_mov2 size x86_reg_emit dreg reg -x86_mov_reg_mem :: (Num t) => Word8 -> Word32 -> t -> CodeGen e s ()+x86_mov_reg_mem :: (Eq t, Num t) => Word8 -> Word32 -> t -> CodeGen e s () x86_mov_reg_mem reg mem size = do x86_mov2 size x86_mem_emit reg mem -x86_mov_reg_membase :: (Num t) => Word8 -> Word8 -> Word32 -> t -> CodeGen e s ()+x86_mov_reg_membase :: (Eq t, Num t) => Word8 -> Word8 -> Word32 -> t -> CodeGen e s () x86_mov_reg_membase reg basereg disp size = do x86_mov2 size x86_membase_emit reg basereg disp -x86_mov_reg_memindex :: (Num t) => Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> t -> CodeGen e s ()+x86_mov_reg_memindex :: (Eq t, Num t) => Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> t -> CodeGen e s () x86_mov_reg_memindex _ _ _ 4 _ _ = failCodeGen $ PP.text "x86_mov_reg_memindex: cannot use (E)SP as index register" x86_mov_reg_memindex reg basereg disp indexreg shft size = @@ -933,7 +933,7 @@ x86_mov_reg_imm reg imm = emit8 (0xb8 + reg) >> x86_imm_emit32 imm -x86_mov_mem_imm :: (Num a) => Word32 -> Word32 -> a -> CodeGen e s ()+x86_mov_mem_imm :: (Eq a, Num a) => Word32 -> Word32 -> a -> CodeGen e s () x86_mov_mem_imm mem imm size = if size == 1 then do emit8 0xc6; @@ -948,7 +948,7 @@ x86_mem_emit 0 mem x86_imm_emit32 imm -x86_mov_membase_imm :: (Num a) => Word8 -> Word32 -> Word32 -> a -> CodeGen e s ()+x86_mov_membase_imm :: (Eq a, Num a) => Word8 -> Word32 -> Word32 -> a -> CodeGen e s () x86_mov_membase_imm basereg disp imm size = if size == 1 then do emit8 0xc6 @@ -963,7 +963,7 @@ x86_membase_emit 0 basereg disp x86_imm_emit32 imm -x86_mov_memindex_imm :: (Num a) => Word8 -> Word32 -> Word8 -> Word8 -> Word32 -> a -> CodeGen e s ()+x86_mov_memindex_imm :: (Eq a, Num a) => Word8 -> Word32 -> Word8 -> Word8 -> Word32 -> a -> CodeGen e s () x86_mov_memindex_imm basereg disp indexreg shft imm size = if size == 1 then do emit8 0xc6 @@ -1429,7 +1429,7 @@ -- Fast instruction sequences for 1 to 7-byte noops. -x86_padding ::(Num t) => t -> CodeGen e s ()+x86_padding :: (Eq t, Num t) => t -> CodeGen e s () x86_padding size = case size of 1 -> x86_nop@@ -1489,38 +1489,38 @@ -- TODO: Move signatures to definition, delete duplicates. x86_xchg_reg_reg ::- (Num a) =>+ (Eq a, Num a) => Word8 -> Word8 -> a -> CodeGen e s () x86_xchg_mem_reg ::- (Num a) =>+ (Eq a, Num a) => Word32 -> Word8 -> a -> CodeGen e s () x86_xchg_membase_reg ::- (Num a) =>+ (Eq a, Num a) => Word8 -> Word32 -> Word8 -> a -> CodeGen e s () x86_xadd_reg_reg ::- (Num a) =>+ (Eq a, Num a) => Word8 -> Word8 -> a -> CodeGen e s () x86_xadd_mem_reg ::- (Num a) =>+ (Eq a, Num a) => Word32 -> Word8 -> a -> CodeGen e s () x86_xadd_membase_reg ::- (Num a) =>+ (Eq a, Num a) => Word8 -> Word32 -> Word8
harpy.cabal view
@@ -1,13 +1,13 @@ Cabal-version: >=1.2 Build-type: Simple Name: harpy-Version: 0.4.3.0+Version: 0.5.0.0 License: GPL License-file: COPYING Author: Dirk Kleeblatt <klee@cs.tu-berlin.de>- Martin Grabmueller <martin.grabmueller@eleven.de>-Maintainer: klee@cs.tu-berlin.de, martin.grabmueller@eleven.de-Homepage: http://uebb.cs.tu-berlin.de/harpy/+ Martin Grabmueller <martin@grabmueller.de>+Maintainer: klee@cs.tu-berlin.de, martin@grabmueller.de+Homepage: http://code.haskell.org/harpy/ Category: Code Generation Synopsis: Runtime code generation for x86 machine code Description: The package contains the following components:@@ -36,7 +36,7 @@ Harpy's homepage: <http://uebb.cs.tu-berlin.de/harpy/> Stability: Experimental -Extra-source-files: +Extra-source-files: NEWS README Makefile doc/Makefile doc/tutorial.lhs doc/larger-tutorial.lhs examples/evaluator/ArithTypes.hs examples/evaluator/ArithParser.hs@@ -45,13 +45,13 @@ Library Build-depends: base >= 4 && < 5,- parsec >= 1 && < 3,- mtl >= 1 && < 2,+ parsec >= 1 && < 4,+ mtl >= 1 && < 3, template-haskell >= 2 && < 3, pretty >= 1 && < 2, containers >= 0.3 && < 1, array >= 0.3 && < 1,- disassembler >= 0.1.0.1+ disassembler >= 0.2.0.0 Exposed-Modules: Harpy, Harpy.X86CodeGen,@@ -60,8 +60,8 @@ Harpy.Call, Harpy.X86Disassembler, Harpy.X86CGCombinators- Extensions: - ForeignFunctionInterface, MultiParamTypeClasses, + Extensions:+ ForeignFunctionInterface, MultiParamTypeClasses, TemplateHaskell, CPP, FlexibleContexts, FlexibleInstances, RankNTypes