harpy-0.2: Harpy/X86Assembler.lhs
> --------------------------------------------------------------------------
> -- |
> -- Module : X86Assembler
> -- Copyright : (c) 2006-2007 Martin Grabmueller and Dirk Kleeblatt
> -- License : GPL
> --
> -- Maintainer : {magr,klee}@cs.tu-berlin.de
> -- Stability : provisional
> -- Portability : non-portable
> --
> -- A type class based layer on top of X86CodeGen
> -- which determines the addressing modes from the types of the
> -- operands.
> --------------------------------------------------------------------------
This module provides simple assembler facilities.
> module Harpy.X86Assembler where
> import Harpy.X86CodeGen
> import Harpy.CodeGenMonad
> import Data.Word
> import Foreign.Ptr
> import qualified Text.PrettyPrint.HughesPJ as PP
address modes used in this module:
Word8/16/32 immediate values
Reg8/16/32 register
Addr Word32 absolut
Ind Reg32 register indirect
(Disp, Reg32) register indirect with displacement
(Reg32, Reg32, Scale) (base, index, scale), effective address is (base + index * scale)
(Disp, Reg32, Scale) (disp, index, scale), effective address is (disp + index * scale)
(Disp, Reg32, Reg32, Scale) (base, index, scale) + displacement (only ebp is allowed as base register)
Label not-yet-specified label
> onlyEbp = failCodeGen (PP.text "only epb is allowed as base register for disp/base/index/scale addressing")
> onlyCl = failCodeGen (PP.text "only cl is allowed as shift count")
x86 Registers
> newtype Reg8 = Reg8 Word8
> al, cl, dl, bl, ah, ch, dh, bh :: Reg8
> al = Reg8 0
> cl = Reg8 1
> dl = Reg8 2
> bl = Reg8 3
> ah = Reg8 4
> ch = Reg8 5
> dh = Reg8 6
> bh = Reg8 7
> newtype Reg16 = Reg16 Word8
> ax, cx, dx, bx, sp, bp, si, di :: Reg16
> ax = Reg16 0
> cx = Reg16 1
> dx = Reg16 2
> bx = Reg16 3
> sp = Reg16 4
> bp = Reg16 5
> si = Reg16 6
> di = Reg16 7
> newtype Reg32 = Reg32 Word8 deriving Eq
> eax, ecx, edx, ebx, esp, ebp, esi, edi :: Reg32
> eax = Reg32 0
> ecx = Reg32 1
> edx = Reg32 2
> ebx = Reg32 3
> esp = Reg32 4
> ebp = Reg32 5
> esi = Reg32 6
> edi = Reg32 7
-- TODO: instances for other registers
> instance Show Reg32 where
> show (Reg32 0) = "eax"
> show (Reg32 1) = "ecx"
> show (Reg32 2) = "edx"
> show (Reg32 3) = "ebx"
> show (Reg32 4) = "esp"
> show (Reg32 5) = "ebp"
> show (Reg32 6) = "esi"
> show (Reg32 7) = "edi"
memory addresses
> newtype Addr = Addr Word32
> newtype Ind = Ind Reg32
> newtype Disp = Disp Word32
> data Scale = S1 | S2 | S4 | S8
> scaleToShift :: Scale -> Word8
> scaleToShift S1 = 0
> scaleToShift S2 = 1
> scaleToShift S4 = 2
> scaleToShift S8 = 3
int 3
> breakpoint = x86_breakpoint
clear direction flag
> cld = x86_cld
store string
> stosb = x86_stosb
> stosl = x86_stosl
> stosd = x86_stosd
move string
> movsb = x86_movsb
> movsl = x86_movsl
> movsd = x86_movsd
read time stamp counter
> rdtsc = x86_rdtsc
compare and exchange
> class Cmpxchg a b where
> cmpxchg :: a -> b -> CodeGen e s ()
> instance Cmpxchg Reg32 Reg32 where
> cmpxchg (Reg32 dest) (Reg32 source) = x86_cmpxchg_reg_reg dest source
>
> instance Cmpxchg Addr Reg32 where
> cmpxchg (Addr dest) (Reg32 source) = x86_cmpxchg_mem_reg dest source
>
> instance Cmpxchg (Disp, Reg32) Reg32 where
> cmpxchg (Disp disp, Reg32 dest) (Reg32 source) = x86_cmpxchg_membase_reg dest disp source
>
> instance Cmpxchg Ind Reg32 where
> cmpxchg (Ind (Reg32 dest)) (Reg32 source) = x86_cmpxchg_membase_reg dest 0 source
exchange memory/register with register
> class Xchg a b where
> xchg :: a -> b -> CodeGen e s ()
> instance Xchg Reg8 Reg8 where
> xchg (Reg8 dest) (Reg8 source) = x86_xchg_reg_reg dest source 1
>
> instance Xchg Reg32 Reg32 where
> xchg (Reg32 dest) (Reg32 source) = x86_xchg_reg_reg dest source 4
>
> instance Xchg Addr Reg8 where
> xchg (Addr dest) (Reg8 source) = x86_xchg_mem_reg dest source 1
>
> instance Xchg Addr Reg32 where
> xchg (Addr dest) (Reg32 source) = x86_xchg_mem_reg dest source 4
>
> instance Xchg (Disp, Reg32) Reg8 where
> xchg (Disp disp, Reg32 dest) (Reg8 source) = x86_xchg_membase_reg dest disp source 1
>
> instance Xchg Ind Reg8 where
> xchg (Ind (Reg32 dest)) (Reg8 source) = x86_xchg_membase_reg dest 0 source 1
>
> instance Xchg (Disp, Reg32) Reg32 where
> xchg (Disp disp, Reg32 dest) (Reg32 source) = x86_xchg_membase_reg dest disp source 4
>
> instance Xchg Ind Reg32 where
> xchg (Ind (Reg32 dest)) (Reg32 source) = x86_xchg_membase_reg dest 0 source 4
exchange and add
> class Xadd a b where
> xadd :: a -> b -> CodeGen e s ()
> instance Xadd Reg8 Reg8 where
> xadd (Reg8 dest) (Reg8 source) = x86_xadd_reg_reg dest source 1
>
> instance Xadd Reg32 Reg32 where
> xadd (Reg32 dest) (Reg32 source) = x86_xadd_reg_reg dest source 4
>
> instance Xadd Addr Reg8 where
> xadd (Addr dest) (Reg8 source) = x86_xadd_mem_reg dest source 1
>
> instance Xadd Addr Reg32 where
> xadd (Addr dest) (Reg32 source) = x86_xadd_mem_reg dest source 4
>
> instance Xadd (Disp, Reg32) Reg8 where
> xadd (Disp disp, Reg32 dest) (Reg8 source) = x86_xadd_membase_reg dest disp source 1
>
> instance Xadd Ind Reg8 where
> xadd (Ind (Reg32 dest)) (Reg8 source) = x86_xadd_membase_reg dest 0 source 1
>
> instance Xadd (Disp, Reg32) Reg32 where
> xadd (Disp disp, Reg32 dest) (Reg32 source) = x86_xadd_membase_reg dest disp source 4
>
> instance Xadd Ind Reg32 where
> xadd (Ind (Reg32 dest)) (Reg32 source) = x86_xadd_membase_reg dest 0 source 4
Increment by 1
> class Inc a where
> inc :: a -> CodeGen e s ()
> instance Inc Addr where
> inc (Addr dest) = x86_inc_mem dest
>
> instance Inc (Disp, Reg32) where
> inc (Disp disp, Reg32 dest) = x86_inc_membase dest disp
>
> instance Inc Ind where
> inc (Ind (Reg32 dest)) = x86_inc_membase dest 0
>
> instance Inc Reg32 where
> inc (Reg32 dest) = x86_inc_reg dest
Decrement by 1
> class Dec a where
> dec :: a -> CodeGen e s ()
> instance Dec Addr where
> dec (Addr dest) = x86_dec_mem dest
>
> instance Dec (Disp, Reg32) where
> dec (Disp disp, Reg32 dest) = x86_dec_membase dest disp
>
> instance Dec Ind where
> dec (Ind (Reg32 dest)) = x86_dec_membase dest 0
>
> instance Dec Reg32 where
> dec (Reg32 dest) = x86_dec_reg dest
One's complement negation
> class Not a where
> not :: a -> CodeGen e s ()
> instance Not Addr where
> not (Addr dest) = x86_not_mem dest
>
> instance Not (Disp, Reg32) where
> not (Disp disp, Reg32 dest) = x86_not_membase dest disp
>
> instance Not Ind where
> not (Ind (Reg32 dest)) = x86_not_membase dest 0
>
> instance Not Reg32 where
> not (Reg32 dest) = x86_not_reg dest
Two's complement negation
> class Neg a where
> neg :: a -> CodeGen e s ()
> instance Neg Addr where
> neg (Addr dest) = x86_neg_mem dest
>
> instance Neg (Disp, Reg32) where
> neg (Disp disp, Reg32 dest) = x86_neg_membase dest disp
>
> instance Neg Ind where
> neg (Ind (Reg32 dest)) = x86_neg_membase dest 0
>
> instance Neg Reg32 where
> neg (Reg32 dest) = x86_neg_reg dest
No operation
> nop = x86_nop
ALU operations
Calling "x86_alu_reg8_reg8 _ _ _ *False* *False*" is a little bit hackish: the last two
arguments are set to True for the "high byte registers" ah, bh, ch and dh.
x86_reg8_emit then sets the 3rd bit in the register number. This bit is set in our
encoding anyway to the right value, so we simply skip this part.
> class Add a b where
> add :: a -> b -> CodeGen e s ()
> instance Add Reg32 Word32 where
> add (Reg32 dest) imm = x86_alu_reg_imm x86_add dest (fromIntegral imm)
>
> instance Add Addr Word32 where
> add (Addr dest) imm = x86_alu_mem_imm x86_add dest (fromIntegral imm)
>
> instance Add (Disp, Reg32) Word32 where
> add (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_add dest disp (fromIntegral imm)
>
> instance Add Ind Word32 where
> add (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_add dest 0 (fromIntegral imm)
>
> instance Add (Disp, Reg32) Word8 where
> add (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_add dest disp (fromIntegral imm)
>
> instance Add Ind Word8 where
> add (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_add dest 0 (fromIntegral imm)
>
> instance Add Addr Reg32 where
> add (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_add dest source
>
> instance Add (Disp, Reg32) Reg32 where
> add (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_add dest disp source
>
> instance Add Ind Reg32 where
> add (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_add dest 0 source
>
> instance Add Reg32 Reg32 where
> add (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_add dest source
>
> instance Add Reg8 Reg8 where
> add (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_add dest source False False
>
> instance Add Reg32 Addr where
> add (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_add dest source
>
> instance Add Reg32 (Disp, Reg32) where
> add (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_add dest source disp
>
> instance Add Reg32 Ind where
> add (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_add dest source 0
> class Or a b where
> or :: a -> b -> CodeGen e s ()
> instance Or Reg32 Word32 where
> or (Reg32 dest) imm = x86_alu_reg_imm x86_or dest (fromIntegral imm)
>
> instance Or Addr Word32 where
> or (Addr dest) imm = x86_alu_mem_imm x86_or dest (fromIntegral imm)
>
> instance Or (Disp, Reg32) Word32 where
> or (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_or dest disp (fromIntegral imm)
>
> instance Or Ind Word32 where
> or (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_or dest 0 (fromIntegral imm)
>
> instance Or (Disp, Reg32) Word8 where
> or (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_or dest disp (fromIntegral imm)
>
> instance Or Ind Word8 where
> or (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_or dest 0 (fromIntegral imm)
>
> instance Or Addr Reg32 where
> or (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_or dest source
>
> instance Or (Disp, Reg32) Reg32 where
> or (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_or dest disp source
>
> instance Or Ind Reg32 where
> or (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_or dest 0 source
>
> instance Or Reg32 Reg32 where
> or (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_or dest source
>
> instance Or Reg8 Reg8 where
> or (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_or dest source False False
>
> instance Or Reg32 Addr where
> or (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_or dest source
>
> instance Or Reg32 (Disp, Reg32) where
> or (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_or dest source disp
>
> instance Or Reg32 Ind where
> or (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_or dest source 0
> class Adc a b where
> adc :: a -> b -> CodeGen e s ()
> instance Adc Reg32 Word32 where
> adc (Reg32 dest) imm = x86_alu_reg_imm x86_adc dest (fromIntegral imm)
>
> instance Adc Addr Word32 where
> adc (Addr dest) imm = x86_alu_mem_imm x86_adc dest (fromIntegral imm)
>
> instance Adc (Disp, Reg32) Word32 where
> adc (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_adc dest disp (fromIntegral imm)
>
> instance Adc Ind Word32 where
> adc (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_adc dest 0 (fromIntegral imm)
>
> instance Adc (Disp, Reg32) Word8 where
> adc (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_adc dest disp (fromIntegral imm)
>
> instance Adc Ind Word8 where
> adc (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_adc dest 0 (fromIntegral imm)
>
> instance Adc Addr Reg32 where
> adc (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_adc dest source
>
> instance Adc (Disp, Reg32) Reg32 where
> adc (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_adc dest disp source
>
> instance Adc Ind Reg32 where
> adc (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_adc dest 0 source
>
> instance Adc Reg32 Reg32 where
> adc (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_adc dest source
>
> instance Adc Reg8 Reg8 where
> adc (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_adc dest source False False
>
> instance Adc Reg32 Addr where
> adc (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_adc dest source
>
> instance Adc Reg32 (Disp, Reg32) where
> adc (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_adc dest source disp
>
> instance Adc Reg32 Ind where
> adc (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_adc dest source 0
> class Sbb a b where
> sbb :: a -> b -> CodeGen e s ()
> instance Sbb Reg32 Word32 where
> sbb (Reg32 dest) imm = x86_alu_reg_imm x86_sbb dest (fromIntegral imm)
>
> instance Sbb Addr Word32 where
> sbb (Addr dest) imm = x86_alu_mem_imm x86_sbb dest (fromIntegral imm)
>
> instance Sbb (Disp, Reg32) Word32 where
> sbb (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_sbb dest disp (fromIntegral imm)
>
> instance Sbb Ind Word32 where
> sbb (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_sbb dest 0 (fromIntegral imm)
>
> instance Sbb (Disp, Reg32) Word8 where
> sbb (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_sbb dest disp (fromIntegral imm)
>
> instance Sbb Ind Word8 where
> sbb (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_sbb dest 0 (fromIntegral imm)
>
> instance Sbb Addr Reg32 where
> sbb (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_sbb dest source
>
> instance Sbb (Disp, Reg32) Reg32 where
> sbb (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_sbb dest disp source
>
> instance Sbb Ind Reg32 where
> sbb (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_sbb dest 0 source
>
> instance Sbb Reg32 Reg32 where
> sbb (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_sbb dest source
>
> instance Sbb Reg8 Reg8 where
> sbb (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_sbb dest source False False
>
> instance Sbb Reg32 Addr where
> sbb (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_sbb dest source
>
> instance Sbb Reg32 (Disp, Reg32) where
> sbb (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_sbb dest source disp
>
> instance Sbb Reg32 Ind where
> sbb (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_sbb dest source 0
> class And a b where
> and :: a -> b -> CodeGen e s ()
> instance And Reg32 Word32 where
> and (Reg32 dest) imm = x86_alu_reg_imm x86_and dest (fromIntegral imm)
>
> instance And Addr Word32 where
> and (Addr dest) imm = x86_alu_mem_imm x86_and dest (fromIntegral imm)
>
> instance And (Disp, Reg32) Word32 where
> and (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_and dest disp (fromIntegral imm)
>
> instance And Ind Word32 where
> and (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_and dest 0 (fromIntegral imm)
>
> instance And (Disp, Reg32) Word8 where
> and (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_and dest disp (fromIntegral imm)
>
> instance And Ind Word8 where
> and (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_and dest 0 (fromIntegral imm)
>
> instance And Addr Reg32 where
> and (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_and dest source
>
> instance And (Disp, Reg32) Reg32 where
> and (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_and dest disp source
>
> instance And Ind Reg32 where
> and (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_and dest 0 source
>
> instance And Reg32 Reg32 where
> and (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_and dest source
>
> instance And Reg8 Reg8 where
> and (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_and dest source False False
>
> instance And Reg32 Addr where
> and (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_and dest source
>
> instance And Reg32 (Disp, Reg32) where
> and (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_and dest source disp
>
> instance And Reg32 Ind where
> and (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_and dest source 0
>
> class Sub a b where
> sub :: a -> b -> CodeGen e s ()
> instance Sub Reg32 Word32 where
> sub (Reg32 dest) imm = x86_alu_reg_imm x86_sub dest (fromIntegral imm)
>
> instance Sub Addr Word32 where
> sub (Addr dest) imm = x86_alu_mem_reg x86_sub dest (fromIntegral imm)
>
> instance Sub (Disp, Reg32) Word32 where
> sub (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_sub dest disp (fromIntegral imm)
>
> instance Sub Ind Word32 where
> sub (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_sub dest 0 (fromIntegral imm)
>
> instance Sub (Disp, Reg32) Word8 where
> sub (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_sub dest disp (fromIntegral imm)
>
> instance Sub Ind Word8 where
> sub (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_sub dest 0 (fromIntegral imm)
>
> instance Sub Addr Reg32 where
> sub (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_sub dest source
>
> instance Sub (Disp, Reg32) Reg32 where
> sub (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_sub dest disp source
>
> instance Sub Ind Reg32 where
> sub (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_sub dest 0 source
>
> instance Sub Reg32 Reg32 where
> sub (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_sub dest source
>
> instance Sub Reg8 Reg8 where
> sub (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_sub dest source False False
>
> instance Sub Reg32 Addr where
> sub (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_sub dest source
>
> instance Sub Reg32 (Disp, Reg32) where
> sub (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_sub dest source disp
>
> instance Sub Reg32 Ind where
> sub (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_sub dest source 0
> class Xor a b where
> xor :: a -> b -> CodeGen e s ()
> instance Xor Reg32 Word32 where
> xor (Reg32 dest) imm = x86_alu_reg_imm x86_xor dest (fromIntegral imm)
>
> instance Xor Addr Word32 where
> xor (Addr dest) imm = x86_alu_mem_imm x86_xor dest (fromIntegral imm)
>
> instance Xor (Disp, Reg32) Word32 where
> xor (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_xor dest disp (fromIntegral imm)
>
> instance Xor Ind Word32 where
> xor (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_xor dest 0 (fromIntegral imm)
>
> instance Xor (Disp, Reg32) Word8 where
> xor (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_xor dest disp (fromIntegral imm)
>
> instance Xor Ind Word8 where
> xor (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_xor dest 0 (fromIntegral imm)
>
> instance Xor Addr Reg32 where
> xor (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_xor dest source
>
> instance Xor (Disp, Reg32) Reg32 where
> xor (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_xor dest disp source
>
> instance Xor Ind Reg32 where
> xor (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_xor dest 0 source
>
> instance Xor Reg32 Reg32 where
> xor (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_xor dest source
>
> instance Xor Reg8 Reg8 where
> xor (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_xor dest source False False
>
> instance Xor Reg32 Addr where
> xor (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_xor dest source
>
> instance Xor Reg32 (Disp, Reg32) where
> xor (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_xor dest source disp
>
> instance Xor Reg32 Ind where
> xor (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_xor dest source 0
> class Cmp a b where
> cmp :: a -> b -> CodeGen e s ()
> instance Cmp Reg32 Word32 where
> cmp (Reg32 dest) imm = x86_alu_reg_imm x86_cmp dest (fromIntegral imm)
>
> instance Cmp Reg32 Label where
> cmp (Reg32 dest) lab = do
> x86_alu_reg_imm x86_cmp dest 0xf0f0f0f0
> emitFixup lab (-4) Fixup32Absolute
>
> instance Cmp Addr Word32 where
> cmp (Addr dest) imm = x86_alu_mem_imm x86_cmp dest (fromIntegral imm)
>
> instance Cmp Addr Label where
> cmp (Addr dest) lab = do
> x86_alu_mem_imm x86_cmp dest 0xf0f0f0f0
> emitFixup lab (-4) Fixup32Absolute
>
> instance Cmp (Disp, Reg32) Word32 where
> cmp (Disp disp, Reg32 dest) imm = x86_alu_membase_imm x86_cmp dest disp (fromIntegral imm)
>
> instance Cmp (Disp, Reg32) Label where
> cmp (Disp disp, Reg32 dest) lab = do
> x86_alu_membase_imm x86_cmp dest disp 0xf0f0f0f0
> emitFixup lab (-4) Fixup32Absolute
>
> instance Cmp Ind Word32 where
> cmp (Ind (Reg32 dest)) imm = x86_alu_membase_imm x86_cmp dest 0 (fromIntegral imm)
>
> instance Cmp Ind Label where
> cmp (Ind (Reg32 dest)) lab = do
> x86_alu_membase_imm x86_cmp dest 0 0xf0f0f0f0
> emitFixup lab (-4) Fixup32Absolute
>
> instance Cmp (Disp, Reg32) Word8 where
> cmp (Disp disp, Reg32 dest) imm = x86_alu_membase8_imm x86_cmp dest disp imm
>
> instance Cmp Ind Word8 where
> cmp (Ind (Reg32 dest)) imm = x86_alu_membase8_imm x86_cmp dest 0 imm
>
> instance Cmp Addr Reg32 where
> cmp (Addr dest) (Reg32 source) = x86_alu_mem_reg x86_cmp dest source
>
> instance Cmp (Disp, Reg32) Reg32 where
> cmp (Disp disp, Reg32 dest) (Reg32 source) = x86_alu_membase_reg x86_cmp dest disp source
>
> instance Cmp Ind Reg32 where
> cmp (Ind (Reg32 dest)) (Reg32 source) = x86_alu_membase_reg x86_cmp dest 0 source
>
> instance Cmp Reg32 Reg32 where
> cmp (Reg32 dest) (Reg32 source) = x86_alu_reg_reg x86_cmp dest source
>
> instance Cmp Reg8 Reg8 where
> cmp (Reg8 dest) (Reg8 source) = x86_alu_reg8_reg8 x86_cmp dest source False False
>
> instance Cmp Reg32 Addr where
> cmp (Reg32 dest) (Addr source) = x86_alu_reg_mem x86_cmp dest source
>
> instance Cmp Reg32 (Disp, Reg32) where
> cmp (Reg32 dest) (Disp disp, Reg32 source) = x86_alu_reg_membase x86_cmp dest source disp
>
> instance Cmp Reg32 Ind where
> cmp (Reg32 dest) (Ind (Reg32 source)) = x86_alu_reg_membase x86_cmp dest source 0
logical compare
> class Test a b where
> test :: a -> b -> CodeGen e s ()
> instance Test Reg32 Word32 where
> test (Reg32 dest) imm = x86_test_reg_imm dest imm
>
> instance Test Addr Word32 where
> test (Addr dest) imm = x86_test_mem_imm dest imm
>
> instance Test (Disp, Reg32) Word32 where
> test (Disp disp, Reg32 dest) imm = x86_test_membase_imm dest disp imm
>
> instance Test Ind Word32 where
> test (Ind (Reg32 dest)) imm = x86_test_membase_imm dest 0 imm
>
> instance Test Reg32 Reg32 where
> test (Reg32 dest) (Reg32 source) = x86_test_reg_reg dest source
>
> instance Test Addr Reg32 where
> test (Addr dest) (Reg32 source) = x86_test_mem_reg dest source
>
> instance Test (Disp, Reg32) Reg32 where
> test (Disp disp, Reg32 dest) (Reg32 source) = x86_test_membase_reg dest disp source
>
> instance Test Ind Reg32 where
> test (Ind (Reg32 dest)) (Reg32 source) = x86_test_membase_reg dest 0 source
shift and rotate
> class Rol a b where
> rol :: a -> b -> CodeGen e s ()
>
> instance Rol Reg32 Word8 where
> rol (Reg32 dest) imm = x86_shift_reg_imm x86_rol dest imm
>
> instance Rol Addr Word8 where
> rol (Addr dest) imm = x86_shift_mem_imm x86_rol dest imm
>
> instance Rol (Disp, Reg32) Word8 where
> rol (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_rol dest disp imm
>
> instance Rol Ind Word8 where
> rol (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_rol dest 0 imm
>
> instance Rol Reg32 Reg8 where
> rol (Reg32 dest) (Reg8 1) = x86_shift_reg x86_rol dest
> rol _ _ = onlyCl
>
> instance Rol Addr Reg8 where
> rol (Addr dest) (Reg8 1) = x86_shift_mem x86_rol dest
> rol _ _ = onlyCl
>
> instance Rol (Disp, Reg32) Reg8 where
> rol (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_rol dest disp
>
> instance Rol Ind Reg8 where
> rol (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_rol dest 0
> rol _ _ = onlyCl
> class Ror a b where
> ror :: a -> b -> CodeGen e s ()
>
> instance Ror Reg32 Word8 where
> ror (Reg32 dest) imm = x86_shift_reg_imm x86_ror dest imm
>
> instance Ror Addr Word8 where
> ror (Addr dest) imm = x86_shift_mem_imm x86_ror dest imm
>
> instance Ror (Disp, Reg32) Word8 where
> ror (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_ror dest disp imm
>
> instance Ror Ind Word8 where
> ror (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_ror dest 0 imm
>
> instance Ror Reg32 Reg8 where
> ror (Reg32 dest) (Reg8 1) = x86_shift_reg x86_ror dest
> ror _ _ = onlyCl
>
> instance Ror Addr Reg8 where
> ror (Addr dest) (Reg8 1) = x86_shift_mem x86_ror dest
> ror _ _ = onlyCl
>
> instance Ror (Disp, Reg32) Reg8 where
> ror (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_ror dest disp
>
> instance Ror Ind Reg8 where
> ror (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_ror dest 0
> ror _ _ = onlyCl
> class Rcl a b where
> rcl :: a -> b -> CodeGen e s ()
>
> instance Rcl Reg32 Word8 where
> rcl (Reg32 dest) imm = x86_shift_reg_imm x86_rcl dest imm
>
> instance Rcl Addr Word8 where
> rcl (Addr dest) imm = x86_shift_mem_imm x86_rcl dest imm
>
> instance Rcl (Disp, Reg32) Word8 where
> rcl (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_rcl dest disp imm
>
> instance Rcl Ind Word8 where
> rcl (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_rcl dest 0 imm
>
> instance Rcl Reg32 Reg8 where
> rcl (Reg32 dest) (Reg8 1) = x86_shift_reg x86_rcl dest
> rcl _ _ = onlyCl
>
> instance Rcl Addr Reg8 where
> rcl (Addr dest) (Reg8 1) = x86_shift_mem x86_rcl dest
> rcl _ _ = onlyCl
>
> instance Rcl (Disp, Reg32) Reg8 where
> rcl (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_rcl dest disp
>
> instance Rcl Ind Reg8 where
> rcl (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_rcl dest 0
> rcl _ _ = onlyCl
> class Rcr a b where
> rcr :: a -> b -> CodeGen e s ()
>
> instance Rcr Reg32 Word8 where
> rcr (Reg32 dest) imm = x86_shift_reg_imm x86_rcr dest imm
>
> instance Rcr Addr Word8 where
> rcr (Addr dest) imm = x86_shift_mem_imm x86_rcr dest imm
>
> instance Rcr (Disp, Reg32) Word8 where
> rcr (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_rcr dest disp imm
>
> instance Rcr Ind Word8 where
> rcr (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_rcr dest 0 imm
>
> instance Rcr Reg32 Reg8 where
> rcr (Reg32 dest) (Reg8 1) = x86_shift_reg x86_rcr dest
> rcr _ _ = onlyCl
>
> instance Rcr Addr Reg8 where
> rcr (Addr dest) (Reg8 1) = x86_shift_mem x86_rcr dest
> rcr _ _ = onlyCl
>
> instance Rcr (Disp, Reg32) Reg8 where
> rcr (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_rcr dest disp
>
> instance Rcr Ind Reg8 where
> rcr (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_rcr dest 0
> rcr _ _ = onlyCl
> class Shl a b where
> shl :: a -> b -> CodeGen e s ()
>
> instance Shl Reg32 Word8 where
> shl (Reg32 dest) imm = x86_shift_reg_imm x86_shl dest imm
>
> instance Shl Addr Word8 where
> shl (Addr dest) imm = x86_shift_mem_imm x86_shl dest imm
>
> instance Shl (Disp, Reg32) Word8 where
> shl (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_shl dest disp imm
>
> instance Shl Ind Word8 where
> shl (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_shl dest 0 imm
>
> instance Shl Reg32 Reg8 where
> shl (Reg32 dest) (Reg8 1) = x86_shift_reg x86_shl dest
> shl _ _ = onlyCl
>
> instance Shl Addr Reg8 where
> shl (Addr dest) (Reg8 1) = x86_shift_mem x86_shl dest
> shl _ _ = onlyCl
>
> instance Shl (Disp, Reg32) Reg8 where
> shl (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_shl dest disp
>
> instance Shl Ind Reg8 where
> shl (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_shl dest 0
> shl _ _ = onlyCl
> class Shr a b where
> shr :: a -> b -> CodeGen e s ()
>
> instance Shr Reg32 Word8 where
> shr (Reg32 dest) imm = x86_shift_reg_imm x86_shr dest imm
>
> instance Shr Addr Word8 where
> shr (Addr dest) imm = x86_shift_mem_imm x86_shr dest imm
>
> instance Shr (Disp, Reg32) Word8 where
> shr (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_shr dest disp imm
>
> instance Shr Ind Word8 where
> shr (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_shr dest 0 imm
>
> instance Shr Reg32 Reg8 where
> shr (Reg32 dest) (Reg8 1) = x86_shift_reg x86_shr dest
> shr _ _ = onlyCl
>
> instance Shr Addr Reg8 where
> shr (Addr dest) (Reg8 1) = x86_shift_mem x86_shr dest
> shr _ _ = onlyCl
>
> instance Shr (Disp, Reg32) Reg8 where
> shr (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_shr dest disp
>
> instance Shr Ind Reg8 where
> shr (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_shr dest 0
> shr _ _ = onlyCl
> class Sar a b where
> sar :: a -> b -> CodeGen e s ()
>
> instance Sar Reg32 Word8 where
> sar (Reg32 dest) imm = x86_shift_reg_imm x86_sar dest imm
>
> instance Sar Addr Word8 where
> sar (Addr dest) imm = x86_shift_mem_imm x86_sar dest imm
>
> instance Sar (Disp, Reg32) Word8 where
> sar (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_sar dest disp imm
>
> instance Sar Ind Word8 where
> sar (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_sar dest 0 imm
>
> instance Sar Reg32 Reg8 where
> sar (Reg32 dest) (Reg8 1) = x86_shift_reg x86_sar dest
> sar _ _ = onlyCl
>
> instance Sar Addr Reg8 where
> sar (Addr dest) (Reg8 1) = x86_shift_mem x86_sar dest
> sar _ _ = onlyCl
>
> instance Sar (Disp, Reg32) Reg8 where
> sar (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_sar dest disp
>
> instance Sar Ind Reg8 where
> sar (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_sar dest 0
> sar _ _ = onlyCl
> class Sal a b where
> sal :: a -> b -> CodeGen e s ()
>
> instance Sal Reg32 Word8 where
> sal (Reg32 dest) imm = x86_shift_reg_imm x86_shl dest imm
>
> instance Sal Addr Word8 where
> sal (Addr dest) imm = x86_shift_mem_imm x86_shl dest imm
>
> instance Sal (Disp, Reg32) Word8 where
> sal (Disp disp, Reg32 dest) imm = x86_shift_membase_imm x86_shl dest disp imm
>
> instance Sal Ind Word8 where
> sal (Ind (Reg32 dest)) imm = x86_shift_membase_imm x86_shl dest 0 imm
>
> instance Sal Reg32 Reg8 where
> sal (Reg32 dest) (Reg8 1) = x86_shift_reg x86_shl dest
> sal _ _ = onlyCl
>
> instance Sal Addr Reg8 where
> sal (Addr dest) (Reg8 1) = x86_shift_mem x86_shl dest
> sal _ _ = onlyCl
>
> instance Sal (Disp, Reg32) Reg8 where
> sal (Disp disp, Reg32 dest) (Reg8 1) = x86_shift_membase x86_shl dest disp
>
> instance Sal Ind Reg8 where
> sal (Ind (Reg32 dest)) (Reg8 1) = x86_shift_membase x86_shl dest 0
> sal _ _ = onlyCl
double precision shift right
> class Shrd a b c where
> shrd :: a -> b -> c -> CodeGen e s ()
> instance Shrd Reg32 Reg32 Reg8 where
> shrd (Reg32 dest) (Reg32 source) (Reg8 1) = x86_shrd_reg dest source
> shrd _ _ _ = onlyCl
>
> instance Shrd Reg32 Reg32 Word8 where
> shrd (Reg32 dest) (Reg32 source) imm = x86_shrd_reg_imm dest source imm
double precision shift left
> class Shld a b c where
> shld :: a -> b -> c -> CodeGen e s ()
> instance Shld Reg32 Reg32 Reg8 where
> shld (Reg32 dest) (Reg32 source) (Reg8 1) = x86_shld_reg dest source
> shld _ _ _ = onlyCl
>
> instance Shld Reg32 Reg32 Word8 where
> shld (Reg32 dest) (Reg32 source) imm = x86_shld_reg_imm dest source imm
unsigned multiply
> class Mul a where
> mul :: a -> CodeGen e s ()
> instance Mul Reg32 where
> mul (Reg32 arg) = x86_mul_reg arg False
>
> instance Mul Addr where
> mul (Addr arg) = x86_mul_mem arg False
>
> instance Mul (Disp, Reg32) where
> mul (Disp disp, Reg32 arg) = x86_mul_membase arg disp False
>
> instance Mul Ind where
> mul (Ind (Reg32 arg)) = x86_mul_membase arg 0 False
signed multiply
> data InPlace = InPlace
if a == InPlace then
b = b * c
else
a = b * c
> class Imul a b c where
> imul :: a -> b -> c -> CodeGen e s ()
> instance Imul InPlace Reg32 Reg32 where
> imul _ (Reg32 dest) (Reg32 source) = x86_imul_reg_reg dest source
>
> instance Imul InPlace Reg32 Addr where
> imul _ (Reg32 dest) (Addr source) = x86_imul_reg_mem dest source
>
> instance Imul InPlace Reg32 (Disp, Reg32) where
> imul _ (Reg32 dest) (Disp disp, Reg32 source) = x86_imul_reg_membase dest source disp
>
> instance Imul InPlace Reg32 Ind where
> imul _ (Reg32 dest) (Ind (Reg32 source)) = x86_imul_reg_membase dest source 0
>
> instance Imul Reg32 Reg32 Word32 where
> imul (Reg32 dest) (Reg32 source) imm = x86_imul_reg_reg_imm dest source imm
>
> instance Imul Reg32 Addr Word32 where
> imul (Reg32 dest) (Addr source) imm = x86_imul_reg_mem_imm dest source imm
>
> instance Imul Reg32 (Disp, Reg32) Word32 where
> imul (Reg32 dest) (Disp disp, Reg32 source) imm = x86_imul_reg_membase_imm dest source disp imm
>
> instance Imul Reg32 Ind Word32 where
> imul (Reg32 dest) (Ind (Reg32 source)) imm = x86_imul_reg_membase_imm dest source 0 imm
divide EDX:EAX by rm;
eax = quotient, edx = remainder
unsigned divide
> class Div a where
> div :: a -> CodeGen e s ()
> instance Div Reg32 where
> div (Reg32 arg) = x86_div_reg arg False
>
> instance Div Addr where
> div (Addr arg) = x86_div_mem arg False
>
> instance Div (Disp, Reg32) where
> div (Disp disp, Reg32 arg) = x86_div_membase arg disp False
>
> instance Div Ind where
> div (Ind (Reg32 arg)) = x86_div_membase arg 0 False
signed divide
> class Idiv a where
> idiv :: a -> CodeGen e s ()
> instance Idiv Reg32 where
> idiv (Reg32 arg) = x86_div_reg arg True
>
> instance Idiv Addr where
> idiv (Addr arg) = x86_div_mem arg True
>
> instance Idiv (Disp, Reg32) where
> idiv (Disp disp, Reg32 arg) = x86_div_membase arg disp True
>
> instance Idiv Ind where
> idiv (Ind (Reg32 arg)) = x86_div_membase arg 0 True
"mov" instruction for different sources and destinations
> class Mov a b where
> mov :: a -> b -> CodeGen e s ()
> instance Mov Reg8 Reg8 where
> mov (Reg8 dest) (Reg8 source) = x86_mov_reg_reg dest source 1
>
> instance Mov Reg16 Reg16 where
> mov (Reg16 dest) (Reg16 source) = x86_mov_reg_reg dest source 2
>
> instance Mov Reg32 Reg32 where
> mov (Reg32 dest) (Reg32 source) = x86_mov_reg_reg dest source 4
> instance Mov Reg32 Word32 where
> mov (Reg32 dest) imm = x86_mov_reg_imm dest (fromIntegral imm)
> instance Mov Reg32 Label where
> mov (Reg32 dest) lab = do x86_mov_reg_imm dest 0
> emitFixup lab (-4) Fixup32Absolute
> instance Mov Addr Word8 where
> mov (Addr dest) imm = x86_mov_mem_imm dest (fromIntegral imm) 1
>
> instance Mov Addr Word16 where
> mov (Addr dest) imm = x86_mov_mem_imm dest (fromIntegral imm) 2
>
> instance Mov Addr Word32 where
> mov (Addr dest) imm = x86_mov_mem_imm dest imm 4
> instance Mov Addr Label where
> mov (Addr dest) lab = do x86_mov_mem_imm dest 0 4
> emitFixup lab (-4) Fixup32Absolute
> instance Mov (Disp, Reg32) Word8 where
> mov (Disp disp, Reg32 dest) imm = x86_mov_membase_imm dest disp (fromIntegral imm) 1
>
> instance Mov Ind Word8 where
> mov (Ind (Reg32 dest)) imm = x86_mov_membase_imm dest 0 (fromIntegral imm) 1
>
> instance Mov (Disp, Reg32) Word16 where
> mov (Disp disp, Reg32 dest) imm = x86_mov_membase_imm dest disp (fromIntegral imm) 2
>
> instance Mov Ind Word16 where
> mov (Ind (Reg32 dest)) imm = x86_mov_membase_imm dest 0 (fromIntegral imm) 2
>
> instance Mov (Disp, Reg32) Word32 where
> mov (Disp disp, Reg32 dest) imm = x86_mov_membase_imm dest disp imm 4
>
> instance Mov (Disp, Reg32) Label where
> mov (Disp disp, Reg32 dest) lab = do x86_mov_membase_imm dest disp 0 4
> emitFixup lab (-4) Fixup32Absolute
> instance Mov Ind Word32 where
> mov (Ind (Reg32 dest)) imm = x86_mov_membase_imm dest 0 imm 4
> instance Mov Ind Label where
> mov (Ind (Reg32 dest)) lab = do x86_mov_membase_imm dest 0 0 4
> emitFixup lab (-4) Fixup32Absolute
> instance Mov (Reg32, Reg32, Scale) Word8 where
> mov (Reg32 base, Reg32 index, scale) imm = x86_mov_memindex_imm base 0 index (scaleToShift scale) (fromIntegral imm) 1
>
> instance Mov (Reg32, Reg32, Scale) Word16 where
> mov (Reg32 base, Reg32 index, scale) imm = x86_mov_memindex_imm base 0 index (scaleToShift scale) (fromIntegral imm) 2
>
> instance Mov (Reg32, Reg32, Scale) Word32 where
> mov (Reg32 base, Reg32 index, scale) imm = x86_mov_memindex_imm base 0 index (scaleToShift scale) imm 4
> instance Mov (Reg32, Reg32, Scale) Label where
> mov (Reg32 base, Reg32 index, scale) lab = do x86_mov_memindex_imm base 0 index (scaleToShift scale) 0 4
> emitFixup lab (-4) Fixup32Absolute
> instance Mov (Disp, Reg32, Scale) Word8 where
> mov (Disp disp, Reg32 index, scale) imm = x86_mov_memindex_imm x86_nobasereg disp index (scaleToShift scale) (fromIntegral imm) 1
>
> instance Mov (Disp, Reg32, Scale) Word16 where
> mov (Disp disp, Reg32 index, scale) imm = x86_mov_memindex_imm x86_nobasereg disp index (scaleToShift scale) (fromIntegral imm) 2
>
> instance Mov (Disp, Reg32, Scale) Word32 where
> mov (Disp disp, Reg32 index, scale) imm = x86_mov_memindex_imm x86_nobasereg disp index (scaleToShift scale) imm 4
> instance Mov (Disp, Reg32, Scale) Label where
> mov (Disp disp, Reg32 index, scale) lab = do x86_mov_memindex_imm x86_nobasereg disp index (scaleToShift scale) 0 4
> emitFixup lab (-4) Fixup32Absolute
> instance Mov (Disp, Reg32, Reg32, Scale) Word8 where
> mov (Disp disp, Reg32 5, Reg32 index, scale) imm = x86_mov_memindex_imm 5 disp index (scaleToShift scale) (fromIntegral imm) 1
> mov _ _ = onlyEbp
>
> instance Mov (Disp, Reg32, Reg32, Scale) Word16 where
> mov (Disp disp, Reg32 5, Reg32 index, scale) imm = x86_mov_memindex_imm 5 disp index (scaleToShift scale) (fromIntegral imm) 2
> mov _ _ = onlyEbp
>
> instance Mov (Disp, Reg32, Reg32, Scale) Word32 where
> mov (Disp disp, Reg32 5, Reg32 index, scale) imm = x86_mov_memindex_imm 5 disp index (scaleToShift scale) imm 4
> mov _ _ = onlyEbp
> instance Mov (Disp, Reg32, Reg32, Scale) Label where
> mov (Disp disp, Reg32 5, Reg32 index, scale) lab = do x86_mov_memindex_imm 5 disp index (scaleToShift scale) 0 4
> emitFixup lab (-4) Fixup32Absolute
> mov _ _ = onlyEbp
> instance Mov Addr Reg8 where
> mov (Addr a) (Reg8 source) = x86_mov_mem_reg a source 1
>
> instance Mov Addr Reg16 where
> mov (Addr a) (Reg16 source) = x86_mov_mem_reg a source 2
>
> instance Mov Addr Reg32 where
> mov (Addr a) (Reg32 source) = x86_mov_mem_reg a source 4
>
> instance Mov Reg8 Addr where
> mov (Reg8 dest) (Addr a) = x86_mov_reg_mem dest a 1
>
> instance Mov Reg16 Addr where
> mov (Reg16 dest) (Addr a) = x86_mov_reg_mem dest a 2
>
> instance Mov Reg32 Addr where
> mov (Reg32 dest) (Addr a) = x86_mov_reg_mem dest a 4
> instance Mov Ind Reg8 where
> mov (Ind (Reg32 dest)) (Reg8 source) = x86_mov_regp_reg dest source 1
>
> instance Mov Ind Reg16 where
> mov (Ind (Reg32 dest)) (Reg16 source) = x86_mov_regp_reg dest source 2
>
> instance Mov Ind Reg32 where
> mov (Ind (Reg32 dest)) (Reg32 source) = x86_mov_regp_reg dest source 4
> instance Mov Reg8 Ind where
> mov (Reg8 dest) (Ind (Reg32 source)) = x86_mov_reg_regp dest source 1
>
> instance Mov Reg16 Ind where
> mov (Reg16 dest) (Ind (Reg32 source)) = x86_mov_reg_regp dest source 2
>
> instance Mov Reg32 Ind where
> mov (Reg32 dest) (Ind (Reg32 source)) = x86_mov_reg_regp dest source 4
> instance Mov (Disp, Reg32) Reg8 where
> mov (Disp disp, Reg32 dest) (Reg8 source) = x86_mov_membase_reg dest disp source 1
>
> instance Mov (Disp, Reg32) Reg16 where
> mov (Disp disp, Reg32 dest) (Reg16 source) = x86_mov_membase_reg dest disp source 2
>
> instance Mov (Disp, Reg32) Reg32 where
> mov (Disp disp, Reg32 dest) (Reg32 source) = x86_mov_membase_reg dest disp source 4
>
> instance Mov Reg8 (Disp, Reg32) where
> mov (Reg8 dest) (Disp disp, Reg32 source) = x86_mov_reg_membase dest source disp 1
>
> instance Mov Reg16 (Disp, Reg32) where
> mov (Reg16 dest) (Disp disp, Reg32 source) = x86_mov_reg_membase dest source disp 2
>
> instance Mov Reg32 (Disp, Reg32) where
> mov (Reg32 dest) (Disp disp, Reg32 source) = x86_mov_reg_membase dest source disp 4
> instance Mov (Reg32, Reg32, Scale) Reg8 where
> mov (Reg32 base, Reg32 index, s) (Reg8 source) = x86_mov_memindex_reg base 0 index (scaleToShift s) source 1
>
> instance Mov (Reg32, Reg32, Scale) Reg16 where
> mov (Reg32 base, Reg32 index, s) (Reg16 source) = x86_mov_memindex_reg base 0 index (scaleToShift s) source 2
>
> instance Mov (Reg32, Reg32, Scale) Reg32 where
> mov (Reg32 base, Reg32 index, s) (Reg32 source) = x86_mov_memindex_reg base 0 index (scaleToShift s) source 4
>
> instance Mov Reg8 (Reg32, Reg32, Scale) where
> mov (Reg8 dest) (Reg32 base, Reg32 index, s) = x86_mov_reg_memindex dest base 0 index (scaleToShift s) 1
>
> instance Mov Reg16 (Reg32, Reg32, Scale) where
> mov (Reg16 dest) (Reg32 base, Reg32 index, s) = x86_mov_reg_memindex dest base 0 index (scaleToShift s) 2
>
> instance Mov Reg32 (Reg32, Reg32, Scale) where
> mov (Reg32 dest) (Reg32 base, Reg32 index, s) = x86_mov_reg_memindex dest base 0 index (scaleToShift s) 4
> instance Mov (Disp, Reg32, Scale) Reg8 where
> mov (Disp disp, Reg32 index, s) (Reg8 source) = x86_mov_memindex_reg x86_nobasereg disp index (scaleToShift s) source 1
>
> instance Mov (Disp, Reg32, Scale) Reg16 where
> mov (Disp disp, Reg32 index, s) (Reg16 source) = x86_mov_memindex_reg x86_nobasereg disp index (scaleToShift s) source 2
>
> instance Mov (Disp, Reg32, Scale) Reg32 where
> mov (Disp disp, Reg32 index, s) (Reg32 source) = x86_mov_memindex_reg x86_nobasereg disp index (scaleToShift s) source 4
>
> instance Mov Reg8 (Disp, Reg32, Scale) where
> mov (Reg8 dest) (Disp disp, Reg32 index, s) = x86_mov_reg_memindex dest x86_nobasereg disp index (scaleToShift s) 1
>
> instance Mov Reg16 (Disp, Reg32, Scale) where
> mov (Reg16 dest) (Disp disp, Reg32 index, s) = x86_mov_reg_memindex dest x86_nobasereg disp index (scaleToShift s) 2
>
> instance Mov Reg32 (Disp, Reg32, Scale) where
> mov (Reg32 dest) (Disp disp, Reg32 index, s) = x86_mov_reg_memindex dest x86_nobasereg disp index (scaleToShift s) 4
> instance Mov (Disp, Reg32, Reg32, Scale) Reg8 where
> mov (Disp disp, Reg32 5, Reg32 index, s) (Reg8 source) = x86_mov_memindex_reg 5 disp index (scaleToShift s) source 1
> mov _ _ = onlyEbp
>
> instance Mov (Disp, Reg32, Reg32, Scale) Reg16 where
> mov (Disp disp, Reg32 5, Reg32 index, s) (Reg16 source) = x86_mov_memindex_reg 5 disp index (scaleToShift s) source 2
> mov _ _ = onlyEbp
>
> instance Mov (Disp, Reg32, Reg32, Scale) Reg32 where
> mov (Disp disp, Reg32 5, Reg32 index, s) (Reg32 source) = x86_mov_memindex_reg 5 disp index (scaleToShift s) source 4
> mov _ _ = onlyEbp
>
> instance Mov Reg8 (Disp, Reg32, Reg32, Scale) where
> mov (Reg8 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_mov_reg_memindex dest 5 disp index (scaleToShift s) 1
> mov _ _ = onlyEbp
>
> instance Mov Reg16 (Disp, Reg32, Reg32, Scale) where
> mov (Reg16 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_mov_reg_memindex dest 5 disp index (scaleToShift s) 2
> mov _ _ = onlyEbp
>
> instance Mov Reg32 (Disp, Reg32, Reg32, Scale) where
> mov (Reg32 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_mov_reg_memindex dest 5 disp index (scaleToShift s) 4
> mov _ _ = onlyEbp
move with sign-extension
> class Movsxb a b where
> movsxb :: a -> b -> CodeGen e s ()
> instance Movsxb Reg32 Reg8 where
> movsxb (Reg32 dest) (Reg8 source) = x86_widen_reg dest source True False
>
> instance Movsxb Reg32 Addr where
> movsxb (Reg32 dest) (Addr source) = x86_widen_mem dest source True False
>
> instance Movsxb Reg32 (Disp, Reg32) where
> movsxb (Reg32 dest) (Disp disp, Reg32 source) = x86_widen_membase dest source disp True False
>
> instance Movsxb Reg32 Ind where
> movsxb (Reg32 dest) (Ind (Reg32 source)) = x86_widen_membase dest source 0 True False
>
> instance Movsxb Reg32 (Disp, Reg32, Reg32, Scale) where
> movsxb (Reg32 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_widen_memindex dest 5 disp index (scaleToShift s) True False
> movsxb _ _ = onlyEbp
>
> instance Movsxb Reg32 (Disp, Reg32, Scale) where
> movsxb (Reg32 dest) (Disp disp, Reg32 index, s) = x86_widen_memindex dest x86_nobasereg disp index (scaleToShift s) True False
>
> instance Movsxb Reg32 (Reg32, Reg32, Scale) where
> movsxb (Reg32 dest) (Reg32 base, Reg32 index, s) = x86_widen_memindex dest base 0 index (scaleToShift s) True False
> class Movsxw a b where
> movsxw :: a -> b -> CodeGen e s ()
> instance Movsxw Reg32 Reg16 where
> movsxw (Reg32 dest) (Reg16 source) = x86_widen_reg dest source True True
>
> instance Movsxw Reg32 Addr where
> movsxw (Reg32 dest) (Addr source) = x86_widen_mem dest source True True
>
> instance Movsxw Reg32 (Disp, Reg32) where
> movsxw (Reg32 dest) (Disp disp, Reg32 source) = x86_widen_membase dest source disp True True
>
> instance Movsxw Reg32 Ind where
> movsxw (Reg32 dest) (Ind (Reg32 source)) = x86_widen_membase dest source 0 True True
>
> instance Movsxw Reg32 (Disp, Reg32, Reg32, Scale) where
> movsxw (Reg32 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_widen_memindex dest 5 disp index (scaleToShift s) True True
> movsxw _ _ = onlyEbp
>
> instance Movsxw Reg32 (Disp, Reg32, Scale) where
> movsxw (Reg32 dest) (Disp disp, Reg32 index, s) = x86_widen_memindex dest x86_nobasereg disp index (scaleToShift s) True True
>
> instance Movsxw Reg32 (Reg32, Reg32, Scale) where
> movsxw (Reg32 dest) (Reg32 base, Reg32 index, s) = x86_widen_memindex dest base 0 index (scaleToShift s) True True
move with zero-extension
> class Movzxb a b where
> movzxb :: a -> b -> CodeGen e s ()
> instance Movzxb Reg32 Reg8 where
> movzxb (Reg32 dest) (Reg8 source) = x86_widen_reg dest source False False
>
> instance Movzxb Reg32 Addr where
> movzxb (Reg32 dest) (Addr source) = x86_widen_mem dest source False False
>
> instance Movzxb Reg32 (Disp, Reg32) where
> movzxb (Reg32 dest) (Disp disp, Reg32 source) = x86_widen_membase dest source disp False False
>
> instance Movzxb Reg32 Ind where
> movzxb (Reg32 dest) (Ind (Reg32 source)) = x86_widen_membase dest source 0 False False
>
> instance Movzxb Reg32 (Disp, Reg32, Reg32, Scale) where
> movzxb (Reg32 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_widen_memindex dest 5 disp index (scaleToShift s) False False
> movzxb _ _ = onlyEbp
>
> instance Movzxb Reg32 (Disp, Reg32, Scale) where
> movzxb (Reg32 dest) (Disp disp, Reg32 index, s) = x86_widen_memindex dest x86_nobasereg disp index (scaleToShift s) False False
>
> instance Movzxb Reg32 (Reg32, Reg32, Scale) where
> movzxb (Reg32 dest) (Reg32 base, Reg32 index, s) = x86_widen_memindex dest base 0 index (scaleToShift s) False False
> class Movzxw a b where
> movzxw :: a -> b -> CodeGen e s ()
> instance Movzxw Reg32 Reg16 where
> movzxw (Reg32 dest) (Reg16 source) = x86_widen_reg dest source False True
>
> instance Movzxw Reg32 Addr where
> movzxw (Reg32 dest) (Addr source) = x86_widen_mem dest source False True
>
> instance Movzxw Reg32 (Disp, Reg32) where
> movzxw (Reg32 dest) (Disp disp, Reg32 source) = x86_widen_membase dest source disp False True
>
> instance Movzxw Reg32 Ind where
> movzxw (Reg32 dest) (Ind (Reg32 source)) = x86_widen_membase dest source 0 False True
>
> instance Movzxw Reg32 (Disp, Reg32, Reg32, Scale) where
> movzxw (Reg32 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_widen_memindex dest 5 disp index (scaleToShift s) False True
> movzxw _ _ = onlyEbp
>
> instance Movzxw Reg32 (Disp, Reg32, Scale) where
> movzxw (Reg32 dest) (Disp disp, Reg32 index, s) = x86_widen_memindex dest x86_nobasereg disp index (scaleToShift s) False True
>
> instance Movzxw Reg32 (Reg32, Reg32, Scale) where
> movzxw (Reg32 dest) (Reg32 base, Reg32 index, s) = x86_widen_memindex dest base 0 index (scaleToShift s) False True
load effective address
> class Lea a b where
> lea :: a -> b -> CodeGen e s ()
> instance Lea Reg32 Addr where
> lea (Reg32 dest) (Addr source) = x86_lea_mem dest source
>
> instance Lea Reg32 (Disp, Reg32) where
> lea (Reg32 dest) (Disp disp, Reg32 source) = x86_lea_membase dest source disp
>
> instance Lea Reg32 Ind where
> lea (Reg32 dest) (Ind (Reg32 source)) = x86_lea_membase dest source 0
>
> instance Lea Reg32 (Disp, Reg32, Reg32, Scale) where
> lea (Reg32 dest) (Disp disp, Reg32 5, Reg32 index, s) = x86_lea_memindex dest 5 disp index (scaleToShift s)
> lea _ _ = onlyEbp
>
> instance Lea Reg32 (Disp, Reg32, Scale) where
> lea (Reg32 dest) (Disp disp, Reg32 index, s) = x86_lea_memindex dest x86_nobasereg disp index (scaleToShift s)
>
> instance Lea Reg32 (Reg32, Reg32, Scale) where
> lea (Reg32 dest) (Reg32 base, Reg32 index, s) = x86_lea_memindex dest base 0 index (scaleToShift s)
convert word to doubleword
> cdq = x86_cdq
wait for FPU
> wait = x86_wait
push to stack
> class Push a where
> push :: a -> CodeGen e s ()
> instance Push Reg32 where
> push (Reg32 source) = x86_push_reg source
>
> instance Push Ind where
> push (Ind (Reg32 source)) = x86_push_regp source
>
> instance Push Addr where
> push (Addr source) = x86_push_mem source
>
> instance Push (Disp, Reg32) where
> push (Disp disp, Reg32 source) = x86_push_membase source disp
>
> instance Push Word32 where
> push imm = x86_push_imm imm
>
> instance Push Label where
> push l = do x86_push_imm_template
> emitFixup l (-4) Fixup32Absolute
>
> instance Push (Disp, Reg32, Reg32, Scale) where
> push (Disp disp, Reg32 5, Reg32 index, s) = x86_push_memindex 5 disp index (scaleToShift s)
> push _ = onlyEbp
>
> instance Push (Disp, Reg32, Scale) where
> push (Disp disp, Reg32 index, s) = x86_push_memindex x86_nobasereg disp index (scaleToShift s)
>
> instance Push (Reg32, Reg32, Scale) where
> push (Reg32 base, Reg32 index, s) = x86_push_memindex base 0 index (scaleToShift s)
pop from stack
> class Pop a where
> pop :: a -> CodeGen e s ()
> instance Pop Reg32 where
> pop (Reg32 dest) = x86_pop_reg dest
>
> instance Pop Addr where
> pop (Addr dest) = x86_pop_mem dest
>
> instance Pop (Disp, Reg32) where
> pop (Disp disp, Reg32 dest) = x86_pop_membase dest disp
>
> instance Pop Ind where
> pop (Ind (Reg32 dest)) = x86_pop_membase dest 0
push/pop general purpose registers
> pushad = x86_pushad
> popad = x86_popad
push/pop EFLAGS
> pushfd = x86_pushfd
> popfd = x86_popfd
loop according to ECX couter
> loop :: Word8 -> CodeGen e s ()
> loop = x86_loop
> loope :: Word8 -> CodeGen e s ()
> loope = x86_loope
> loopne :: Word8 -> CodeGen e s ()
> loopne = x86_loopne
jump
> class Jmp a where
> jmp :: a -> CodeGen e s ()
> instance Jmp Word8 where
> jmp imm = x86_jump8 imm
>
> instance Jmp Word32 where
> jmp imm = x86_jump32 imm
>
> instance Jmp Reg32 where
> jmp (Reg32 dest) = x86_jump_reg dest
>
> instance Jmp Addr where
> jmp (Addr dest) = x86_jump_mem dest
>
> instance Jmp (Disp, Reg32) where
> jmp (Disp disp, Reg32 dest) = x86_jump_membase dest disp
>
> instance Jmp Ind where
> jmp (Ind (Reg32 dest)) = x86_jump_membase dest 0
>
> instance Jmp Label where
> jmp l = do x86_jump32 0
> emitFixup l (-4) Fixup32
jump on condition code (branch)
> class Ja a where
> ja :: a -> CodeGen e s ()
> instance Ja Word8 where
> ja imm = x86_branch8 x86_cc_a imm False
>
> instance Ja Word32 where
> ja imm = x86_branch32 x86_cc_a imm False
> class Jae a where
> jae :: a -> CodeGen e s ()
> instance Jae Word8 where
> jae imm = x86_branch8 x86_cc_ae imm False
>
> instance Jae Word32 where
> jae imm = x86_branch32 x86_cc_ae imm False
>
> instance Jae Label where
> jae l = do x86_branch32 x86_cc_ae 0 False
> emitFixup l (-4) Fixup32
> class Jb a where
> jb :: a -> CodeGen e s ()
> instance Jb Word8 where
> jb imm = x86_branch8 x86_cc_b imm False
>
> instance Jb Word32 where
> jb imm = x86_branch32 x86_cc_b imm False
>
> instance Jb Label where
> jb l = do x86_branch32 x86_cc_b 0 False
> emitFixup l (-4) Fixup32
> class Jbe a where
> jbe :: a -> CodeGen e s ()
> instance Jbe Word8 where
> jbe imm = x86_branch8 x86_cc_be imm False
>
> instance Jbe Word32 where
> jbe imm = x86_branch32 x86_cc_be imm False
>
> instance Jbe Label where
> jbe l = do x86_branch32 x86_cc_be 0 False
> emitFixup l (-4) Fixup32
> class Jc a where
> jc :: a -> CodeGen e s ()
> instance Jc Word8 where
> jc imm = x86_branch8 x86_cc_c imm False
>
> instance Jc Word32 where
> jc imm = x86_branch32 x86_cc_c imm False
>
> instance Jc Label where
> jc l = do x86_branch32 x86_cc_c 0 False
> emitFixup l (-4) Fixup32
> class Je a where
> je :: a -> CodeGen e s ()
> instance Je Word8 where
> je imm = x86_branch8 x86_cc_e imm False
>
> instance Je Word32 where
> je imm = x86_branch32 x86_cc_e imm False
>
> instance Je Label where
> je l = do x86_branch32 x86_cc_e 0 False
> emitFixup l (-4) Fixup32
> class Jna a where
> jna :: a -> CodeGen e s ()
> instance Jna Word8 where
> jna imm = x86_branch8 x86_cc_na imm False
>
> instance Jna Word32 where
> jna imm = x86_branch32 x86_cc_na imm False
>
> instance Jna Label where
> jna l = do x86_branch32 x86_cc_na 0 False
> emitFixup l (-4) Fixup32
> class Jnae a where
> jnae :: a -> CodeGen e s ()
> instance Jnae Word8 where
> jnae imm = x86_branch8 x86_cc_nae imm False
>
> instance Jnae Word32 where
> jnae imm = x86_branch32 x86_cc_nae imm False
>
> instance Jnae Label where
> jnae l = do x86_branch32 x86_cc_nae 0 False
> emitFixup l (-4) Fixup32
> class Jnb a where
> jnb :: a -> CodeGen e s ()
> instance Jnb Word8 where
> jnb imm = x86_branch8 x86_cc_nb imm False
>
> instance Jnb Word32 where
> jnb imm = x86_branch32 x86_cc_nb imm False
>
> instance Jnb Label where
> jnb l = do x86_branch32 x86_cc_nb 0 False
> emitFixup l (-4) Fixup32
> class Jnbe a where
> jnbe :: a -> CodeGen e s ()
> instance Jnbe Word8 where
> jnbe imm = x86_branch8 x86_cc_nbe imm False
>
> instance Jnbe Word32 where
> jnbe imm = x86_branch32 x86_cc_nbe imm False
>
> instance Jnbe Label where
> jnbe l = do x86_branch32 x86_cc_nbe 0 False
> emitFixup l (-4) Fixup32
> class Jnc a where
> jnc :: a -> CodeGen e s ()
> instance Jnc Word8 where
> jnc imm = x86_branch8 x86_cc_nc imm False
>
> instance Jnc Word32 where
> jnc imm = x86_branch32 x86_cc_nc imm False
>
> instance Jnc Label where
> jnc l = do x86_branch32 x86_cc_nc 0 False
> emitFixup l (-4) Fixup32
> class Jne a where
> jne :: a -> CodeGen e s ()
> instance Jne Word8 where
> jne imm = x86_branch8 x86_cc_ne imm False
>
> instance Jne Word32 where
> jne imm = x86_branch32 x86_cc_ne imm False
>
> instance Jne Label where
> jne l = do x86_branch32 x86_cc_ne 0 False
> emitFixup l (-4) Fixup32
> class Jnp a where
> jnp :: a -> CodeGen e s ()
> instance Jnp Word8 where
> jnp imm = x86_branch8 x86_cc_np imm False
>
> instance Jnp Word32 where
> jnp imm = x86_branch32 x86_cc_np imm False
>
> instance Jnp Label where
> jnp l = do x86_branch32 x86_cc_np 0 False
> emitFixup l (-4) Fixup32
> class Jnz a where
> jnz :: a -> CodeGen e s ()
> instance Jnz Word8 where
> jnz imm = x86_branch8 x86_cc_nz imm False
>
> instance Jnz Word32 where
> jnz imm = x86_branch32 x86_cc_nz imm False
>
> instance Jnz Label where
> jnz l = do x86_branch32 x86_cc_nz 0 False
> emitFixup l (-4) Fixup32
> class Jp a where
> jp :: a -> CodeGen e s ()
> instance Jp Word8 where
> jp imm = x86_branch8 x86_cc_p imm False
>
> instance Jp Word32 where
> jp imm = x86_branch32 x86_cc_p imm False
>
> instance Jp Label where
> jp l = do x86_branch32 x86_cc_p 0 False
> emitFixup l (-4) Fixup32
> class Jpe a where
> jpe :: a -> CodeGen e s ()
> instance Jpe Word8 where
> jpe imm = x86_branch8 x86_cc_pe imm False
>
> instance Jpe Word32 where
> jpe imm = x86_branch32 x86_cc_pe imm False
>
> instance Jpe Label where
> jpe l = do x86_branch32 x86_cc_pe 0 False
> emitFixup l (-4) Fixup32
> class Jpo a where
> jpo :: a -> CodeGen e s ()
> instance Jpo Word8 where
> jpo imm = x86_branch8 x86_cc_po imm False
>
> instance Jpo Word32 where
> jpo imm = x86_branch32 x86_cc_po imm False
>
> instance Jpo Label where
> jpo l = do x86_branch32 x86_cc_po 0 False
> emitFixup l (-4) Fixup32
> class Jz a where
> jz :: a -> CodeGen e s ()
> instance Jz Word8 where
> jz imm = x86_branch8 x86_cc_z imm False
>
> instance Jz Word32 where
> jz imm = x86_branch32 x86_cc_z imm False
>
> instance Jz Label where
> jz l = do x86_branch32 x86_cc_z 0 False
> emitFixup l (-4) Fixup32
> class Jg a where
> jg :: a -> CodeGen e s ()
> instance Jg Word8 where
> jg imm = x86_branch8 x86_cc_gt imm True
>
> instance Jg Word32 where
> jg imm = x86_branch32 x86_cc_gt imm True
>
> instance Jg Label where
> jg l = do x86_branch32 x86_cc_gt 0 True
> emitFixup l (-4) Fixup32
> class Jge a where
> jge :: a -> CodeGen e s ()
> instance Jge Word8 where
> jge imm = x86_branch8 x86_cc_ge imm True
>
> instance Jge Word32 where
> jge imm = x86_branch32 x86_cc_ge imm True
>
> instance Jge Label where
> jge l = do x86_branch32 x86_cc_ge 0 True
> emitFixup l (-4) Fixup32
> class Jl a where
> jl :: a -> CodeGen e s ()
> instance Jl Word8 where
> jl imm = x86_branch8 x86_cc_lt imm True
>
> instance Jl Word32 where
> jl imm = x86_branch32 x86_cc_lt imm True
>
> instance Jl Label where
> jl l = do x86_branch32 x86_cc_lt 0 True
> emitFixup l (-4) Fixup32
> class Jle a where
> jle :: a -> CodeGen e s ()
> instance Jle Word8 where
> jle imm = x86_branch8 x86_cc_le imm True
>
> instance Jle Word32 where
> jle imm = x86_branch32 x86_cc_le imm True
>
> instance Jle Label where
> jle l = do x86_branch32 x86_cc_le 0 True
> emitFixup l (-4) Fixup32
> class Jng a where
> jng :: a -> CodeGen e s ()
> instance Jng Word8 where
> jng imm = x86_branch8 x86_cc_le imm True
>
> instance Jng Word32 where
> jng imm = x86_branch32 x86_cc_le imm True
>
> instance Jng Label where
> jng l = do x86_branch32 x86_cc_le 0 True
> emitFixup l (-4) Fixup32
> class Jnge a where
> jnge :: a -> CodeGen e s ()
> instance Jnge Word8 where
> jnge imm = x86_branch8 x86_cc_lt imm True
>
> instance Jnge Word32 where
> jnge imm = x86_branch32 x86_cc_lt imm True
>
> instance Jnge Label where
> jnge l = do x86_branch32 x86_cc_lt 0 True
> emitFixup l (-4) Fixup32
> class Jnl a where
> jnl :: a -> CodeGen e s ()
> instance Jnl Word8 where
> jnl imm = x86_branch8 x86_cc_ge imm True
>
> instance Jnl Word32 where
> jnl imm = x86_branch32 x86_cc_ge imm True
>
> instance Jnl Label where
> jnl l = do x86_branch32 x86_cc_ge 0 True
> emitFixup l (-4) Fixup32
> class Jnle a where
> jnle :: a -> CodeGen e s ()
> instance Jnle Word8 where
> jnle imm = x86_branch8 x86_cc_gt imm True
>
> instance Jnle Word32 where
> jnle imm = x86_branch32 x86_cc_gt imm True
>
> instance Jnle Label where
> jnle l = do x86_branch32 x86_cc_gt 0 True
> emitFixup l (-4) Fixup32
> class Jno a where
> jno :: a -> CodeGen e s ()
> instance Jno Word8 where
> jno imm = x86_branch8 x86_cc_no imm True
>
> instance Jno Word32 where
> jno imm = x86_branch32 x86_cc_no imm True
>
> instance Jno Label where
> jno l = do x86_branch32 x86_cc_no 0 True
> emitFixup l (-4) Fixup32
> class Jns a where
> jns :: a -> CodeGen e s ()
> instance Jns Word8 where
> jns imm = x86_branch8 x86_cc_ns imm True
>
> instance Jns Word32 where
> jns imm = x86_branch32 x86_cc_ns imm True
>
> instance Jns Label where
> jns l = do x86_branch32 x86_cc_ns 0 True
> emitFixup l (-4) Fixup32
> class Jo a where
> jo :: a -> CodeGen e s ()
> instance Jo Word8 where
> jo imm = x86_branch8 x86_cc_o imm True
>
> instance Jo Word32 where
> jo imm = x86_branch32 x86_cc_o imm True
>
> instance Jo Label where
> jo l = do x86_branch32 x86_cc_o 0 True
> emitFixup l (-4) Fixup32
> class Js a where
> js :: a -> CodeGen e s ()
> instance Js Word8 where
> js imm = x86_branch8 x86_cc_s imm True
>
> instance Js Word32 where
> js imm = x86_branch32 x86_cc_s imm True
>
> instance Js Label where
> js l = do x86_branch32 x86_cc_s 0 True
> emitFixup l (-4) Fixup32
jump if ecx register is 0
> jecxz :: Word8 -> CodeGen e s ()
> jecxz = x86_jecxz
set byte on condition code
> class Seta a where
> seta :: a -> CodeGen e s ()
> instance Seta Reg8 where
> seta (Reg8 dest) = x86_set_reg x86_cc_a dest False
>
> instance Seta Addr where
> seta (Addr dest) = x86_set_mem x86_cc_a dest False
>
> instance Seta (Disp, Reg32) where
> seta (Disp disp, Reg32 dest) = x86_set_membase x86_cc_a dest disp False
>
> instance Seta Ind where
> seta (Ind (Reg32 dest)) = x86_set_membase x86_cc_a dest 0 False
> class Setae a where
> setae :: a -> CodeGen e s ()
> instance Setae Reg8 where
> setae (Reg8 dest) = x86_set_reg x86_cc_ae dest False
>
> instance Setae Addr where
> setae (Addr dest) = x86_set_mem x86_cc_ae dest False
>
> instance Setae (Disp, Reg32) where
> setae (Disp disp, Reg32 dest) = x86_set_membase x86_cc_ae dest disp False
>
> instance Setae Ind where
> setae (Ind (Reg32 dest)) = x86_set_membase x86_cc_ae dest 0 False
> class Setb a where
> setb :: a -> CodeGen e s ()
> instance Setb Reg8 where
> setb (Reg8 dest) = x86_set_reg x86_cc_b dest False
>
> instance Setb Addr where
> setb (Addr dest) = x86_set_mem x86_cc_b dest False
>
> instance Setb (Disp, Reg32) where
> setb (Disp disp, Reg32 dest) = x86_set_membase x86_cc_b dest disp False
>
> instance Setb Ind where
> setb (Ind (Reg32 dest)) = x86_set_membase x86_cc_b dest 0 False
> class Setbe a where
> setbe :: a -> CodeGen e s ()
> instance Setbe Reg8 where
> setbe (Reg8 dest) = x86_set_reg x86_cc_be dest False
>
> instance Setbe Addr where
> setbe (Addr dest) = x86_set_mem x86_cc_be dest False
>
> instance Setbe (Disp, Reg32) where
> setbe (Disp disp, Reg32 dest) = x86_set_membase x86_cc_be dest disp False
>
> instance Setbe Ind where
> setbe (Ind (Reg32 dest)) = x86_set_membase x86_cc_be dest 0 False
> class Setc a where
> setc :: a -> CodeGen e s ()
> instance Setc Reg8 where
> setc (Reg8 dest) = x86_set_reg x86_cc_c dest False
>
> instance Setc Addr where
> setc (Addr dest) = x86_set_mem x86_cc_c dest False
>
> instance Setc (Disp, Reg32) where
> setc (Disp disp, Reg32 dest) = x86_set_membase x86_cc_c dest disp False
>
> instance Setc Ind where
> setc (Ind (Reg32 dest)) = x86_set_membase x86_cc_c dest 0 False
> class Sete a where
> sete :: a -> CodeGen e s ()
> instance Sete Reg8 where
> sete (Reg8 dest) = x86_set_reg x86_cc_e dest False
>
> instance Sete Addr where
> sete (Addr dest) = x86_set_mem x86_cc_e dest False
>
> instance Sete (Disp, Reg32) where
> sete (Disp disp, Reg32 dest) = x86_set_membase x86_cc_e dest disp False
>
> instance Sete Ind where
> sete (Ind (Reg32 dest)) = x86_set_membase x86_cc_e dest 0 False
> class Setna a where
> setna :: a -> CodeGen e s ()
> instance Setna Reg8 where
> setna (Reg8 dest) = x86_set_reg x86_cc_na dest False
>
> instance Setna Addr where
> setna (Addr dest) = x86_set_mem x86_cc_na dest False
>
> instance Setna (Disp, Reg32) where
> setna (Disp disp, Reg32 dest) = x86_set_membase x86_cc_na dest disp False
>
> instance Setna Ind where
> setna (Ind (Reg32 dest)) = x86_set_membase x86_cc_na dest 0 False
> class Setnae a where
> setnae :: a -> CodeGen e s ()
> instance Setnae Reg8 where
> setnae (Reg8 dest) = x86_set_reg x86_cc_nae dest False
>
> instance Setnae Addr where
> setnae (Addr dest) = x86_set_mem x86_cc_nae dest False
>
> instance Setnae (Disp, Reg32) where
> setnae (Disp disp, Reg32 dest) = x86_set_membase x86_cc_nae dest disp False
>
> instance Setnae Ind where
> setnae (Ind (Reg32 dest)) = x86_set_membase x86_cc_nae dest 0 False
> class Setnb a where
> setnb :: a -> CodeGen e s ()
> instance Setnb Reg8 where
> setnb (Reg8 dest) = x86_set_reg x86_cc_nb dest False
>
> instance Setnb Addr where
> setnb (Addr dest) = x86_set_mem x86_cc_nb dest False
>
> instance Setnb (Disp, Reg32) where
> setnb (Disp disp, Reg32 dest) = x86_set_membase x86_cc_nb dest disp False
>
> instance Setnb Ind where
> setnb (Ind (Reg32 dest)) = x86_set_membase x86_cc_nb dest 0 False
> class Setnbe a where
> setnbe :: a -> CodeGen e s ()
> instance Setnbe Reg8 where
> setnbe (Reg8 dest) = x86_set_reg x86_cc_nbe dest False
>
> instance Setnbe Addr where
> setnbe (Addr dest) = x86_set_mem x86_cc_nbe dest False
>
> instance Setnbe (Disp, Reg32) where
> setnbe (Disp disp, Reg32 dest) = x86_set_membase x86_cc_nbe dest disp False
>
> instance Setnbe Ind where
> setnbe (Ind (Reg32 dest)) = x86_set_membase x86_cc_nbe dest 0 False
> class Setnc a where
> setnc :: a -> CodeGen e s ()
> instance Setnc Reg8 where
> setnc (Reg8 dest) = x86_set_reg x86_cc_nc dest False
>
> instance Setnc Addr where
> setnc (Addr dest) = x86_set_mem x86_cc_nc dest False
>
> instance Setnc (Disp, Reg32) where
> setnc (Disp disp, Reg32 dest) = x86_set_membase x86_cc_nc dest disp False
>
> instance Setnc Ind where
> setnc (Ind (Reg32 dest)) = x86_set_membase x86_cc_nc dest 0 False
> class Setne a where
> setne :: a -> CodeGen e s ()
> instance Setne Reg8 where
> setne (Reg8 dest) = x86_set_reg x86_cc_ne dest False
>
> instance Setne Addr where
> setne (Addr dest) = x86_set_mem x86_cc_ne dest False
>
> instance Setne (Disp, Reg32) where
> setne (Disp disp, Reg32 dest) = x86_set_membase x86_cc_ne dest disp False
>
> instance Setne Ind where
> setne (Ind (Reg32 dest)) = x86_set_membase x86_cc_ne dest 0 False
> class Setnp a where
> setnp :: a -> CodeGen e s ()
> instance Setnp Reg8 where
> setnp (Reg8 dest) = x86_set_reg x86_cc_np dest False
>
> instance Setnp Addr where
> setnp (Addr dest) = x86_set_mem x86_cc_np dest False
>
> instance Setnp (Disp, Reg32) where
> setnp (Disp disp, Reg32 dest) = x86_set_membase x86_cc_np dest disp False
>
> instance Setnp Ind where
> setnp (Ind (Reg32 dest)) = x86_set_membase x86_cc_np dest 0 False
> class Setnz a where
> setnz :: a -> CodeGen e s ()
> instance Setnz Reg8 where
> setnz (Reg8 dest) = x86_set_reg x86_cc_nz dest False
>
> instance Setnz Addr where
> setnz (Addr dest) = x86_set_mem x86_cc_nz dest False
>
> instance Setnz (Disp, Reg32) where
> setnz (Disp disp, Reg32 dest) = x86_set_membase x86_cc_nz dest disp False
>
> instance Setnz Ind where
> setnz (Ind (Reg32 dest)) = x86_set_membase x86_cc_nz dest 0 False
> class Setp a where
> setp :: a -> CodeGen e s ()
> instance Setp Reg8 where
> setp (Reg8 dest) = x86_set_reg x86_cc_p dest False
>
> instance Setp Addr where
> setp (Addr dest) = x86_set_mem x86_cc_p dest False
>
> instance Setp (Disp, Reg32) where
> setp (Disp disp, Reg32 dest) = x86_set_membase x86_cc_p dest disp False
>
> instance Setp Ind where
> setp (Ind (Reg32 dest)) = x86_set_membase x86_cc_p dest 0 False
> class Setpe a where
> setpe :: a -> CodeGen e s ()
> instance Setpe Reg8 where
> setpe (Reg8 dest) = x86_set_reg x86_cc_pe dest False
>
> instance Setpe Addr where
> setpe (Addr dest) = x86_set_mem x86_cc_pe dest False
>
> instance Setpe (Disp, Reg32) where
> setpe (Disp disp, Reg32 dest) = x86_set_membase x86_cc_pe dest disp False
>
> instance Setpe Ind where
> setpe (Ind (Reg32 dest)) = x86_set_membase x86_cc_pe dest 0 False
> class Setpo a where
> setpo :: a -> CodeGen e s ()
> instance Setpo Reg8 where
> setpo (Reg8 dest) = x86_set_reg x86_cc_po dest False
>
> instance Setpo Addr where
> setpo (Addr dest) = x86_set_mem x86_cc_po dest False
>
> instance Setpo (Disp, Reg32) where
> setpo (Disp disp, Reg32 dest) = x86_set_membase x86_cc_po dest disp False
>
> instance Setpo Ind where
> setpo (Ind (Reg32 dest)) = x86_set_membase x86_cc_po dest 0 False
> class Setg a where
> setg :: a -> CodeGen e s ()
> instance Setg Reg8 where
> setg (Reg8 dest) = x86_set_reg x86_cc_gt dest True
>
> instance Setg Addr where
> setg (Addr dest) = x86_set_mem x86_cc_gt dest True
>
> instance Setg (Disp, Reg32) where
> setg (Disp disp, Reg32 dest) = x86_set_membase x86_cc_gt dest disp True
>
> instance Setg Ind where
> setg (Ind (Reg32 dest)) = x86_set_membase x86_cc_gt dest 0 True
> class Setge a where
> setge :: a -> CodeGen e s ()
> instance Setge Reg8 where
> setge (Reg8 dest) = x86_set_reg x86_cc_ge dest True
>
> instance Setge Addr where
> setge (Addr dest) = x86_set_mem x86_cc_ge dest True
>
> instance Setge (Disp, Reg32) where
> setge (Disp disp, Reg32 dest) = x86_set_membase x86_cc_ge dest disp True
>
> instance Setge Ind where
> setge (Ind (Reg32 dest)) = x86_set_membase x86_cc_ge dest 0 True
> class Setl a where
> setl :: a -> CodeGen e s ()
> instance Setl Reg8 where
> setl (Reg8 dest) = x86_set_reg x86_cc_lt dest True
>
> instance Setl Addr where
> setl (Addr dest) = x86_set_mem x86_cc_lt dest True
>
> instance Setl (Disp, Reg32) where
> setl (Disp disp, Reg32 dest) = x86_set_membase x86_cc_lt dest disp True
>
> instance Setl Ind where
> setl (Ind (Reg32 dest)) = x86_set_membase x86_cc_lt dest 0 True
> class Setle a where
> setle :: a -> CodeGen e s ()
> instance Setle Reg8 where
> setle (Reg8 dest) = x86_set_reg x86_cc_le dest True
>
> instance Setle Addr where
> setle (Addr dest) = x86_set_mem x86_cc_le dest True
>
> instance Setle (Disp, Reg32) where
> setle (Disp disp, Reg32 dest) = x86_set_membase x86_cc_le dest disp True
>
> instance Setle Ind where
> setle (Ind (Reg32 dest)) = x86_set_membase x86_cc_le dest 0 True
> class Setng a where
> setng :: a -> CodeGen e s ()
> instance Setng Reg8 where
> setng (Reg8 dest) = x86_set_reg x86_cc_le dest True
>
> instance Setng Addr where
> setng (Addr dest) = x86_set_mem x86_cc_le dest True
>
> instance Setng (Disp, Reg32) where
> setng (Disp disp, Reg32 dest) = x86_set_membase x86_cc_le dest disp True
>
> instance Setng Ind where
> setng (Ind (Reg32 dest)) = x86_set_membase x86_cc_le dest 0 True
> class Setnge a where
> setnge :: a -> CodeGen e s ()
> instance Setnge Reg8 where
> setnge (Reg8 dest) = x86_set_reg x86_cc_lt dest True
>
> instance Setnge Addr where
> setnge (Addr dest) = x86_set_mem x86_cc_lt dest True
>
> instance Setnge (Disp, Reg32) where
> setnge (Disp disp, Reg32 dest) = x86_set_membase x86_cc_lt dest disp True
>
> instance Setnge Ind where
> setnge (Ind (Reg32 dest)) = x86_set_membase x86_cc_lt dest 0 True
> class Setnl a where
> setnl :: a -> CodeGen e s ()
> instance Setnl Reg8 where
> setnl (Reg8 dest) = x86_set_reg x86_cc_ge dest True
>
> instance Setnl Addr where
> setnl (Addr dest) = x86_set_mem x86_cc_ge dest True
>
> instance Setnl (Disp, Reg32) where
> setnl (Disp disp, Reg32 dest) = x86_set_membase x86_cc_ge dest disp True
>
> instance Setnl Ind where
> setnl (Ind (Reg32 dest)) = x86_set_membase x86_cc_ge dest 0 True
> class Setnle a where
> setnle :: a -> CodeGen e s ()
> instance Setnle Reg8 where
> setnle (Reg8 dest) = x86_set_reg x86_cc_gt dest True
>
> instance Setnle Addr where
> setnle (Addr dest) = x86_set_mem x86_cc_gt dest True
>
> instance Setnle (Disp, Reg32) where
> setnle (Disp disp, Reg32 dest) = x86_set_membase x86_cc_gt dest disp True
>
> instance Setnle Ind where
> setnle (Ind (Reg32 dest)) = x86_set_membase x86_cc_gt dest 0 True
> class Setno a where
> setno :: a -> CodeGen e s ()
> instance Setno Reg8 where
> setno (Reg8 dest) = x86_set_reg x86_cc_no dest True
>
> instance Setno Addr where
> setno (Addr dest) = x86_set_mem x86_cc_no dest True
>
> instance Setno (Disp, Reg32) where
> setno (Disp disp, Reg32 dest) = x86_set_membase x86_cc_no dest disp True
>
> instance Setno Ind where
> setno (Ind (Reg32 dest)) = x86_set_membase x86_cc_no dest 0 True
> class Setns a where
> setns :: a -> CodeGen e s ()
> instance Setns Reg8 where
> setns (Reg8 dest) = x86_set_reg x86_cc_ns dest True
>
> instance Setns Addr where
> setns (Addr dest) = x86_set_mem x86_cc_ns dest True
>
> instance Setns (Disp, Reg32) where
> setns (Disp disp, Reg32 dest) = x86_set_membase x86_cc_ns dest disp True
>
> instance Setns Ind where
> setns (Ind (Reg32 dest)) = x86_set_membase x86_cc_ns dest 0 True
> class Seto a where
> seto :: a -> CodeGen e s ()
> instance Seto Reg8 where
> seto (Reg8 dest) = x86_set_reg x86_cc_o dest True
>
> instance Seto Addr where
> seto (Addr dest) = x86_set_mem x86_cc_o dest True
>
> instance Seto (Disp, Reg32) where
> seto (Disp disp, Reg32 dest) = x86_set_membase x86_cc_o dest disp True
>
> instance Seto Ind where
> seto (Ind (Reg32 dest)) = x86_set_membase x86_cc_o dest 0 True
> class Sets a where
> sets :: a -> CodeGen e s ()
> instance Sets Reg8 where
> sets (Reg8 dest) = x86_set_reg x86_cc_s dest True
>
> instance Sets Addr where
> sets (Addr dest) = x86_set_mem x86_cc_s dest True
>
> instance Sets (Disp, Reg32) where
> sets (Disp disp, Reg32 dest) = x86_set_membase x86_cc_s dest disp True
>
> instance Sets Ind where
> sets (Ind (Reg32 dest)) = x86_set_membase x86_cc_s dest 0 True
> class Setz a where
> setz :: a -> CodeGen e s ()
> instance Setz Reg8 where
> setz (Reg8 dest) = x86_set_reg x86_cc_z dest False
>
> instance Setz Addr where
> setz (Addr dest) = x86_set_mem x86_cc_z dest False
>
> instance Setz (Disp, Reg32) where
> setz (Disp disp, Reg32 dest) = x86_set_membase x86_cc_z dest disp False
>
> instance Setz Ind where
> setz (Ind (Reg32 dest)) = x86_set_membase x86_cc_z dest 0 False
call procedure
> class Call a where
> call :: a -> CodeGen e s ()
> instance Call Word32 where
> call imm = x86_call_imm imm
>
> instance Call Label where
> call l = do x86_call_imm 0
> emitFixup l (-4) Fixup32
>
> instance Call Reg32 where
> call (Reg32 dest) = x86_call_reg dest
>
> instance Call Addr where
> call (Addr dest) = x86_call_mem dest
>
> instance Call (Disp, Reg32) where
> call (Disp disp, Reg32 dest) = x86_call_membase dest disp
>
> instance Call Ind where
> call (Ind (Reg32 dest)) = x86_call_membase dest 0
>
> instance Call (FunPtr a) where
> call = x86_call_hs
return from procedure
> ret :: CodeGen e s ()
> ret = x86_ret
>
> retN :: Word16 -> CodeGen e s ()
> retN n = x86_ret_imm n
make stack frame
> enter :: Word16 -> CodeGen e s ()
> enter = x86_enter
conditional move
> class Cmova a b where
> cmova :: a -> b -> CodeGen e s ()
> instance Cmova Reg32 Reg32 where
> cmova (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_a False dest source
>
> instance Cmova Reg32 Addr where
> cmova (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_a False dest source
>
> instance Cmova Reg32 (Disp, Reg32) where
> cmova (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_a False dest source disp
>
> instance Cmova Reg32 Ind where
> cmova (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_a False dest source 0
> class Cmovae a b where
> cmovae :: a -> b -> CodeGen e s ()
> instance Cmovae Reg32 Reg32 where
> cmovae (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_ae False dest source
>
> instance Cmovae Reg32 Addr where
> cmovae (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_ae False dest source
>
> instance Cmovae Reg32 (Disp, Reg32) where
> cmovae (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_ae False dest source disp
>
> instance Cmovae Reg32 Ind where
> cmovae (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_ae False dest source 0
> class Cmovb a b where
> cmovb :: a -> b -> CodeGen e s ()
> instance Cmovb Reg32 Reg32 where
> cmovb (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_b False dest source
>
> instance Cmovb Reg32 Addr where
> cmovb (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_b False dest source
>
> instance Cmovb Reg32 (Disp, Reg32) where
> cmovb (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_b False dest source disp
>
> instance Cmovb Reg32 Ind where
> cmovb (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_b False dest source 0
> class Cmovbe a b where
> cmovbe :: a -> b -> CodeGen e s ()
> instance Cmovbe Reg32 Reg32 where
> cmovbe (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_be False dest source
>
> instance Cmovbe Reg32 Addr where
> cmovbe (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_be False dest source
>
> instance Cmovbe Reg32 (Disp, Reg32) where
> cmovbe (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_be False dest source disp
>
> instance Cmovbe Reg32 Ind where
> cmovbe (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_be False dest source 0
> class Cmovc a b where
> cmovc :: a -> b -> CodeGen e s ()
> instance Cmovc Reg32 Reg32 where
> cmovc (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_c False dest source
>
> instance Cmovc Reg32 Addr where
> cmovc (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_c False dest source
>
> instance Cmovc Reg32 (Disp, Reg32) where
> cmovc (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_c False dest source disp
>
> instance Cmovc Reg32 Ind where
> cmovc (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_c False dest source 0
> class Cmove a b where
> cmove :: a -> b -> CodeGen e s ()
> instance Cmove Reg32 Reg32 where
> cmove (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_e False dest source
>
> instance Cmove Reg32 Addr where
> cmove (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_e False dest source
>
> instance Cmove Reg32 (Disp, Reg32) where
> cmove (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_e False dest source disp
>
> instance Cmove Reg32 Ind where
> cmove (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_e False dest source 0
> class Cmovna a b where
> cmovna :: a -> b -> CodeGen e s ()
> instance Cmovna Reg32 Reg32 where
> cmovna (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_na False dest source
>
> instance Cmovna Reg32 Addr where
> cmovna (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_na False dest source
>
> instance Cmovna Reg32 (Disp, Reg32) where
> cmovna (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_na False dest source disp
>
> instance Cmovna Reg32 Ind where
> cmovna (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_na False dest source 0
> class Cmovnae a b where
> cmovnae :: a -> b -> CodeGen e s ()
> instance Cmovnae Reg32 Reg32 where
> cmovnae (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_nae False dest source
>
> instance Cmovnae Reg32 Addr where
> cmovnae (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_nae False dest source
>
> instance Cmovnae Reg32 (Disp, Reg32) where
> cmovnae (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_nae False dest source disp
>
> instance Cmovnae Reg32 Ind where
> cmovnae (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_nae False dest source 0
> class Cmovnb a b where
> cmovnb :: a -> b -> CodeGen e s ()
> instance Cmovnb Reg32 Reg32 where
> cmovnb (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_nb False dest source
>
> instance Cmovnb Reg32 Addr where
> cmovnb (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_nb False dest source
>
> instance Cmovnb Reg32 (Disp, Reg32) where
> cmovnb (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_nb False dest source disp
>
> instance Cmovnb Reg32 Ind where
> cmovnb (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_nb False dest source 0
> class Cmovnbe a b where
> cmovnbe :: a -> b -> CodeGen e s ()
> instance Cmovnbe Reg32 Reg32 where
> cmovnbe (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_nbe False dest source
>
> instance Cmovnbe Reg32 Addr where
> cmovnbe (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_nbe False dest source
>
> instance Cmovnbe Reg32 (Disp, Reg32) where
> cmovnbe (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_nbe False dest source disp
>
> instance Cmovnbe Reg32 Ind where
> cmovnbe (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_nbe False dest source 0
> class Cmovnc a b where
> cmovnc :: a -> b -> CodeGen e s ()
> instance Cmovnc Reg32 Reg32 where
> cmovnc (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_nc False dest source
>
> instance Cmovnc Reg32 Addr where
> cmovnc (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_nc False dest source
>
> instance Cmovnc Reg32 (Disp, Reg32) where
> cmovnc (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_nc False dest source disp
>
> instance Cmovnc Reg32 Ind where
> cmovnc (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_nc False dest source 0
> class Cmovne a b where
> cmovne :: a -> b -> CodeGen e s ()
> instance Cmovne Reg32 Reg32 where
> cmovne (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_ne False dest source
>
> instance Cmovne Reg32 Addr where
> cmovne (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_ne False dest source
>
> instance Cmovne Reg32 (Disp, Reg32) where
> cmovne (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_ne False dest source disp
>
> instance Cmovne Reg32 Ind where
> cmovne (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_ne False dest source 0
> class Cmovnp a b where
> cmovnp :: a -> b -> CodeGen e s ()
> instance Cmovnp Reg32 Reg32 where
> cmovnp (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_np False dest source
>
> instance Cmovnp Reg32 Addr where
> cmovnp (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_np False dest source
>
> instance Cmovnp Reg32 (Disp, Reg32) where
> cmovnp (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_np False dest source disp
>
> instance Cmovnp Reg32 Ind where
> cmovnp (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_np False dest source 0
> class Cmovnz a b where
> cmovnz :: a -> b -> CodeGen e s ()
> instance Cmovnz Reg32 Reg32 where
> cmovnz (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_nz False dest source
>
> instance Cmovnz Reg32 Addr where
> cmovnz (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_nz False dest source
>
> instance Cmovnz Reg32 (Disp, Reg32) where
> cmovnz (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_nz False dest source disp
>
> instance Cmovnz Reg32 Ind where
> cmovnz (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_nz False dest source 0
> class Cmovp a b where
> cmovp :: a -> b -> CodeGen e s ()
> instance Cmovp Reg32 Reg32 where
> cmovp (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_p False dest source
>
> instance Cmovp Reg32 Addr where
> cmovp (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_p False dest source
>
> instance Cmovp Reg32 (Disp, Reg32) where
> cmovp (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_p False dest source disp
>
> instance Cmovp Reg32 Ind where
> cmovp (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_p False dest source 0
> class Cmovpe a b where
> cmovpe :: a -> b -> CodeGen e s ()
> instance Cmovpe Reg32 Reg32 where
> cmovpe (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_pe False dest source
>
> instance Cmovpe Reg32 Addr where
> cmovpe (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_pe False dest source
>
> instance Cmovpe Reg32 (Disp, Reg32) where
> cmovpe (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_pe False dest source disp
>
> instance Cmovpe Reg32 Ind where
> cmovpe (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_pe False dest source 0
> class Cmovpo a b where
> cmovpo :: a -> b -> CodeGen e s ()
> instance Cmovpo Reg32 Reg32 where
> cmovpo (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_po False dest source
>
> instance Cmovpo Reg32 Addr where
> cmovpo (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_po False dest source
>
> instance Cmovpo Reg32 (Disp, Reg32) where
> cmovpo (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_po False dest source disp
>
> instance Cmovpo Reg32 Ind where
> cmovpo (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_po False dest source 0
> class Cmovz a b where
> cmovz :: a -> b -> CodeGen e s ()
> instance Cmovz Reg32 Reg32 where
> cmovz (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_z False dest source
>
> instance Cmovz Reg32 Addr where
> cmovz (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_z False dest source
>
> instance Cmovz Reg32 (Disp, Reg32) where
> cmovz (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_z False dest source disp
>
> instance Cmovz Reg32 Ind where
> cmovz (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_z False dest source 0
> class Cmovg a b where
> cmovg :: a -> b -> CodeGen e s ()
> instance Cmovg Reg32 Reg32 where
> cmovg (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_gt True dest source
>
> instance Cmovg Reg32 Addr where
> cmovg (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_gt True dest source
>
> instance Cmovg Reg32 (Disp, Reg32) where
> cmovg (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_gt True dest source disp
>
> instance Cmovg Reg32 Ind where
> cmovg (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_gt True dest source 0
> class Cmovge a b where
> cmovge :: a -> b -> CodeGen e s ()
> instance Cmovge Reg32 Reg32 where
> cmovge (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_ge True dest source
>
> instance Cmovge Reg32 Addr where
> cmovge (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_ge True dest source
>
> instance Cmovge Reg32 (Disp, Reg32) where
> cmovge (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_ge True dest source disp
>
> instance Cmovge Reg32 Ind where
> cmovge (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_ge True dest source 0
> class Cmovl a b where
> cmovl :: a -> b -> CodeGen e s ()
> instance Cmovl Reg32 Reg32 where
> cmovl (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_lt True dest source
>
> instance Cmovl Reg32 Addr where
> cmovl (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_lt True dest source
>
> instance Cmovl Reg32 (Disp, Reg32) where
> cmovl (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_lt True dest source disp
>
> instance Cmovl Reg32 Ind where
> cmovl (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_lt True dest source 0
> class Cmovle a b where
> cmovle :: a -> b -> CodeGen e s ()
> instance Cmovle Reg32 Reg32 where
> cmovle (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_le True dest source
>
> instance Cmovle Reg32 Addr where
> cmovle (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_le True dest source
>
> instance Cmovle Reg32 (Disp, Reg32) where
> cmovle (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_le True dest source disp
>
> instance Cmovle Reg32 Ind where
> cmovle (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_le True dest source 0
> class Cmovng a b where
> cmovng :: a -> b -> CodeGen e s ()
> instance Cmovng Reg32 Reg32 where
> cmovng (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_le True dest source
>
> instance Cmovng Reg32 Addr where
> cmovng (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_le True dest source
>
> instance Cmovng Reg32 (Disp, Reg32) where
> cmovng (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_le True dest source disp
>
> instance Cmovng Reg32 Ind where
> cmovng (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_le True dest source 0
> class Cmovnge a b where
> cmovnge :: a -> b -> CodeGen e s ()
> instance Cmovnge Reg32 Reg32 where
> cmovnge (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_lt True dest source
>
> instance Cmovnge Reg32 Addr where
> cmovnge (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_lt True dest source
>
> instance Cmovnge Reg32 (Disp, Reg32) where
> cmovnge (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_lt True dest source disp
>
> instance Cmovnge Reg32 Ind where
> cmovnge (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_lt True dest source 0
> class Cmovnl a b where
> cmovnl :: a -> b -> CodeGen e s ()
> instance Cmovnl Reg32 Reg32 where
> cmovnl (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_ge True dest source
>
> instance Cmovnl Reg32 Addr where
> cmovnl (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_ge True dest source
>
> instance Cmovnl Reg32 (Disp, Reg32) where
> cmovnl (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_ge True dest source disp
>
> instance Cmovnl Reg32 Ind where
> cmovnl (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_ge True dest source 0
> class Cmovnle a b where
> cmovnle :: a -> b -> CodeGen e s ()
> instance Cmovnle Reg32 Reg32 where
> cmovnle (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_gt True dest source
>
> instance Cmovnle Reg32 Addr where
> cmovnle (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_gt True dest source
>
> instance Cmovnle Reg32 (Disp, Reg32) where
> cmovnle (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_gt True dest source disp
>
> instance Cmovnle Reg32 Ind where
> cmovnle (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_gt True dest source 0
> class Cmovno a b where
> cmovno :: a -> b -> CodeGen e s ()
> instance Cmovno Reg32 Reg32 where
> cmovno (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_no True dest source
>
> instance Cmovno Reg32 Addr where
> cmovno (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_no True dest source
>
> instance Cmovno Reg32 (Disp, Reg32) where
> cmovno (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_no True dest source disp
>
> instance Cmovno Reg32 Ind where
> cmovno (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_no True dest source 0
> class Cmovns a b where
> cmovns :: a -> b -> CodeGen e s ()
> instance Cmovns Reg32 Reg32 where
> cmovns (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_ns True dest source
>
> instance Cmovns Reg32 Addr where
> cmovns (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_ns True dest source
>
> instance Cmovns Reg32 (Disp, Reg32) where
> cmovns (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_ns True dest source disp
>
> instance Cmovns Reg32 Ind where
> cmovns (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_ns True dest source 0
> class Cmovo a b where
> cmovo :: a -> b -> CodeGen e s ()
> instance Cmovo Reg32 Reg32 where
> cmovo (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_o True dest source
>
> instance Cmovo Reg32 Addr where
> cmovo (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_o True dest source
>
> instance Cmovo Reg32 (Disp, Reg32) where
> cmovo (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_o True dest source disp
>
> instance Cmovo Reg32 Ind where
> cmovo (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_o True dest source 0
> class Cmovs a b where
> cmovs :: a -> b -> CodeGen e s ()
> instance Cmovs Reg32 Reg32 where
> cmovs (Reg32 dest) (Reg32 source) = x86_cmov_reg x86_cc_s True dest source
>
> instance Cmovs Reg32 Addr where
> cmovs (Reg32 dest) (Addr source) = x86_cmov_mem x86_cc_s True dest source
>
> instance Cmovs Reg32 (Disp, Reg32) where
> cmovs (Reg32 dest) (Disp disp, Reg32 source) = x86_cmov_membase x86_cc_s True dest source disp
>
> instance Cmovs Reg32 Ind where
> cmovs (Reg32 dest) (Ind (Reg32 source)) = x86_cmov_membase x86_cc_s True dest source 0
release stack frame
> leave :: CodeGen e s ()
> leave = x86_leave
store ah into flags
> sahf :: CodeGen e s ()
> sahf = x86_sahf