+{-# LANGUAGE MultiParamTypeClasses,FlexibleInstances,FunctionalDependencies #-}
+--------------------------------------------------------------------------
+-- |
+-- Module : Harpy.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.
+--------------------------------------------------------------------------
+module Harpy.X86Assembler (
+ module Harpy.X86Assembler,
+ XMMReg(..),
+ ) 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, Ord)
+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
+
+{-
+newtype XMMReg = XMMReg Word8
+ deriving (Eq, Ord)
+-}
+
+xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7 :: XMMReg
+xmm0 = XMMReg 0
+xmm1 = XMMReg 1
+xmm2 = XMMReg 2
+xmm3 = XMMReg 3
+xmm4 = XMMReg 4
+xmm5 = XMMReg 5
+xmm6 = XMMReg 6
+xmm7 = XMMReg 7
+
+instance Show XMMReg where
+ show (XMMReg i) = "xmm" ++ show i
+
+-- 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
+
+newtype FPReg = FPReg Word8
+
+data FPTopReg = FPTopReg
+
+fpTop = FPTopReg
+
+fp0 = FPReg 0
+fp1 = FPReg 1
+fp2 = FPReg 2
+fp3 = FPReg 3
+fp4 = FPReg 4
+fp5 = FPReg 5
+fp6 = FPReg 6
+fp7 = FPReg 7
+
+-- int 3
+
+breakpoint = ensureBufferSize x86_max_instruction_bytes >> x86_breakpoint
+
+
+-- clear direction flag
+
+cld = ensureBufferSize x86_max_instruction_bytes >> x86_cld
+
+
+-- store string
+
+stosb = ensureBufferSize x86_max_instruction_bytes >> x86_stosb
+stosl = ensureBufferSize x86_max_instruction_bytes >> x86_stosl
+stosd = ensureBufferSize x86_max_instruction_bytes >> x86_stosd
+
+
+-- move string
+
+movsb = ensureBufferSize x86_max_instruction_bytes >> x86_movsb
+movsl = ensureBufferSize x86_max_instruction_bytes >> x86_movsl
+--movsd = ensureBufferSize x86_max_instruction_bytes >> x86_movsd
+
+
+-- read time stamp counter
+
+rdtsc = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmpxchg_reg_reg dest source
+
+instance Cmpxchg Addr Reg32 where
+ cmpxchg (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmpxchg_mem_reg dest source
+
+instance Cmpxchg (Disp, Reg32) Reg32 where
+ cmpxchg (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmpxchg_membase_reg dest disp source
+
+instance Cmpxchg Ind Reg32 where
+ cmpxchg (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_xchg_reg_reg dest source 1
+
+instance Xchg Reg32 Reg32 where
+ xchg (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xchg_reg_reg dest source 4
+
+instance Xchg Addr Reg8 where
+ xchg (Addr dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xchg_mem_reg dest source 1
+
+instance Xchg Addr Reg32 where
+ xchg (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xchg_mem_reg dest source 4
+
+instance Xchg (Disp, Reg32) Reg8 where
+ xchg (Disp disp, Reg32 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xchg_membase_reg dest disp source 1
+
+instance Xchg Ind Reg8 where
+ xchg (Ind (Reg32 dest)) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xchg_membase_reg dest 0 source 1
+
+instance Xchg (Disp, Reg32) Reg32 where
+ xchg (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xchg_membase_reg dest disp source 4
+
+instance Xchg Ind Reg32 where
+ xchg (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_xadd_reg_reg dest source 1
+
+instance Xadd Reg32 Reg32 where
+ xadd (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xadd_reg_reg dest source 4
+
+instance Xadd Addr Reg8 where
+ xadd (Addr dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xadd_mem_reg dest source 1
+
+instance Xadd Addr Reg32 where
+ xadd (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xadd_mem_reg dest source 4
+
+instance Xadd (Disp, Reg32) Reg8 where
+ xadd (Disp disp, Reg32 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xadd_membase_reg dest disp source 1
+
+instance Xadd Ind Reg8 where
+ xadd (Ind (Reg32 dest)) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xadd_membase_reg dest 0 source 1
+
+instance Xadd (Disp, Reg32) Reg32 where
+ xadd (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_xadd_membase_reg dest disp source 4
+
+instance Xadd Ind Reg32 where
+ xadd (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_inc_mem dest
+
+instance Inc (Disp, Reg32) where
+ inc (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_inc_membase dest disp
+
+instance Inc Ind where
+ inc (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> x86_inc_membase dest 0
+
+instance Inc Reg32 where
+ inc (Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_inc_reg dest
+
+
+-- Decrement by 1
+
+class Dec a where
+ dec :: a -> CodeGen e s ()
+
+instance Dec Addr where
+ dec (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_dec_mem dest
+
+instance Dec (Disp, Reg32) where
+ dec (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_dec_membase dest disp
+
+instance Dec Ind where
+ dec (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> x86_dec_membase dest 0
+
+instance Dec Reg32 where
+ dec (Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_dec_reg dest
+
+
+-- One's complement negation
+
+class Not a where
+ not :: a -> CodeGen e s ()
+
+instance Not Addr where
+ not (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_not_mem dest
+
+instance Not (Disp, Reg32) where
+ not (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_not_membase dest disp
+
+instance Not Ind where
+ not (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> x86_not_membase dest 0
+
+instance Not Reg32 where
+ not (Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_not_reg dest
+
+
+-- Two's complement negation
+
+class Neg a where
+ neg :: a -> CodeGen e s ()
+
+instance Neg Addr where
+ neg (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_neg_mem dest
+
+instance Neg (Disp, Reg32) where
+ neg (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_neg_membase dest disp
+
+instance Neg Ind where
+ neg (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> x86_neg_membase dest 0
+
+instance Neg Reg32 where
+ neg (Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_neg_reg dest
+
+
+-- No operation
+
+nop = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_add dest (fromIntegral imm)
+
+instance Add Addr Word32 where
+ add (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_add dest (fromIntegral imm)
+
+instance Add (Disp, Reg32) Word32 where
+ add (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_add dest disp (fromIntegral imm)
+
+instance Add Ind Word32 where
+ add (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_add dest 0 (fromIntegral imm)
+
+instance Add (Disp, Reg32) Word8 where
+ add (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_add dest disp (fromIntegral imm)
+
+instance Add Ind Word8 where
+ add (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_add dest 0 (fromIntegral imm)
+
+instance Add Addr Reg32 where
+ add (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_add dest source
+
+instance Add (Disp, Reg32) Reg32 where
+ add (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_add dest disp source
+
+instance Add Ind Reg32 where
+ add (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_add dest 0 source
+
+instance Add Reg32 Reg32 where
+ add (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_add dest source
+
+instance Add Reg8 Reg8 where
+ add (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_add dest source False False
+
+instance Add Reg32 Addr where
+ add (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_add dest source
+
+instance Add Reg32 (Disp, Reg32) where
+ add (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_add dest source disp
+
+instance Add Reg32 Ind where
+ add (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_or dest (fromIntegral imm)
+
+instance Or Addr Word32 where
+ or (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_or dest (fromIntegral imm)
+
+instance Or (Disp, Reg32) Word32 where
+ or (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_or dest disp (fromIntegral imm)
+
+instance Or Ind Word32 where
+ or (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_or dest 0 (fromIntegral imm)
+
+instance Or (Disp, Reg32) Word8 where
+ or (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_or dest disp (fromIntegral imm)
+
+instance Or Ind Word8 where
+ or (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_or dest 0 (fromIntegral imm)
+
+instance Or Addr Reg32 where
+ or (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_or dest source
+
+instance Or (Disp, Reg32) Reg32 where
+ or (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_or dest disp source
+
+instance Or Ind Reg32 where
+ or (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_or dest 0 source
+
+instance Or Reg32 Reg32 where
+ or (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_or dest source
+
+instance Or Reg8 Reg8 where
+ or (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_or dest source False False
+
+instance Or Reg32 Addr where
+ or (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_or dest source
+
+instance Or Reg32 (Disp, Reg32) where
+ or (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_or dest source disp
+
+instance Or Reg32 Ind where
+ or (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_adc dest (fromIntegral imm)
+
+instance Adc Addr Word32 where
+ adc (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_adc dest (fromIntegral imm)
+
+instance Adc (Disp, Reg32) Word32 where
+ adc (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_adc dest disp (fromIntegral imm)
+
+instance Adc Ind Word32 where
+ adc (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_adc dest 0 (fromIntegral imm)
+
+instance Adc (Disp, Reg32) Word8 where
+ adc (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_adc dest disp (fromIntegral imm)
+
+instance Adc Ind Word8 where
+ adc (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_adc dest 0 (fromIntegral imm)
+
+instance Adc Addr Reg32 where
+ adc (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_adc dest source
+
+instance Adc (Disp, Reg32) Reg32 where
+ adc (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_adc dest disp source
+
+instance Adc Ind Reg32 where
+ adc (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_adc dest 0 source
+
+instance Adc Reg32 Reg32 where
+ adc (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_adc dest source
+
+instance Adc Reg8 Reg8 where
+ adc (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_adc dest source False False
+
+instance Adc Reg32 Addr where
+ adc (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_adc dest source
+
+instance Adc Reg32 (Disp, Reg32) where
+ adc (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_adc dest source disp
+
+instance Adc Reg32 Ind where
+ adc (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_sbb dest (fromIntegral imm)
+
+instance Sbb Addr Word32 where
+ sbb (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_sbb dest (fromIntegral imm)
+
+instance Sbb (Disp, Reg32) Word32 where
+ sbb (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_sbb dest disp (fromIntegral imm)
+
+instance Sbb Ind Word32 where
+ sbb (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_sbb dest 0 (fromIntegral imm)
+
+instance Sbb (Disp, Reg32) Word8 where
+ sbb (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_sbb dest disp (fromIntegral imm)
+
+instance Sbb Ind Word8 where
+ sbb (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_sbb dest 0 (fromIntegral imm)
+
+instance Sbb Addr Reg32 where
+ sbb (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_sbb dest source
+
+instance Sbb (Disp, Reg32) Reg32 where
+ sbb (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_sbb dest disp source
+
+instance Sbb Ind Reg32 where
+ sbb (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_sbb dest 0 source
+
+instance Sbb Reg32 Reg32 where
+ sbb (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_sbb dest source
+
+instance Sbb Reg8 Reg8 where
+ sbb (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_sbb dest source False False
+
+instance Sbb Reg32 Addr where
+ sbb (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_sbb dest source
+
+instance Sbb Reg32 (Disp, Reg32) where
+ sbb (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_sbb dest source disp
+
+instance Sbb Reg32 Ind where
+ sbb (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_and dest (fromIntegral imm)
+
+instance And Addr Word32 where
+ and (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_and dest (fromIntegral imm)
+
+instance And (Disp, Reg32) Word32 where
+ and (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_and dest disp (fromIntegral imm)
+
+instance And Ind Word32 where
+ and (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_and dest 0 (fromIntegral imm)
+
+instance And (Disp, Reg32) Word8 where
+ and (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_and dest disp (fromIntegral imm)
+
+instance And Ind Word8 where
+ and (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_and dest 0 (fromIntegral imm)
+
+instance And Addr Reg32 where
+ and (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_and dest source
+
+instance And (Disp, Reg32) Reg32 where
+ and (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_and dest disp source
+
+instance And Ind Reg32 where
+ and (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_and dest 0 source
+
+instance And Reg32 Reg32 where
+ and (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_and dest source
+
+instance And Reg8 Reg8 where
+ and (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_and dest source False False
+
+instance And Reg32 Addr where
+ and (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_and dest source
+
+instance And Reg32 (Disp, Reg32) where
+ and (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_and dest source disp
+
+instance And Reg32 Ind where
+ and (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_sub dest (fromIntegral imm)
+
+instance Sub Addr Word32 where
+ sub (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_sub dest (fromIntegral imm)
+
+instance Sub (Disp, Reg32) Word32 where
+ sub (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_sub dest disp (fromIntegral imm)
+
+instance Sub Ind Word32 where
+ sub (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_sub dest 0 (fromIntegral imm)
+
+instance Sub (Disp, Reg32) Word8 where
+ sub (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_sub dest disp (fromIntegral imm)
+
+instance Sub Ind Word8 where
+ sub (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_sub dest 0 (fromIntegral imm)
+
+instance Sub Addr Reg32 where
+ sub (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_sub dest source
+
+instance Sub (Disp, Reg32) Reg32 where
+ sub (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_sub dest disp source
+
+instance Sub Ind Reg32 where
+ sub (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_sub dest 0 source
+
+instance Sub Reg32 Reg32 where
+ sub (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_sub dest source
+
+instance Sub Reg8 Reg8 where
+ sub (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_sub dest source False False
+
+instance Sub Reg32 Addr where
+ sub (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_sub dest source
+
+instance Sub Reg32 (Disp, Reg32) where
+ sub (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_sub dest source disp
+
+instance Sub Reg32 Ind where
+ sub (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_xor dest (fromIntegral imm)
+
+instance Xor Addr Word32 where
+ xor (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_xor dest (fromIntegral imm)
+
+instance Xor (Disp, Reg32) Word32 where
+ xor (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_xor dest disp (fromIntegral imm)
+
+instance Xor Ind Word32 where
+ xor (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_xor dest 0 (fromIntegral imm)
+
+instance Xor (Disp, Reg32) Word8 where
+ xor (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_xor dest disp (fromIntegral imm)
+
+instance Xor Ind Word8 where
+ xor (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_xor dest 0 (fromIntegral imm)
+
+instance Xor Addr Reg32 where
+ xor (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_xor dest source
+
+instance Xor (Disp, Reg32) Reg32 where
+ xor (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_xor dest disp source
+
+instance Xor Ind Reg32 where
+ xor (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_xor dest 0 source
+
+instance Xor Reg32 Reg32 where
+ xor (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_xor dest source
+
+instance Xor Reg8 Reg8 where
+ xor (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_xor dest source False False
+
+instance Xor Reg32 Addr where
+ xor (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_xor dest source
+
+instance Xor Reg32 (Disp, Reg32) where
+ xor (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_xor dest source disp
+
+instance Xor Reg32 Ind where
+ xor (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_cmp dest (fromIntegral imm)
+
+instance Cmp Reg32 (Ptr a) where
+ cmp (Reg32 dest) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_imm x86_cmp dest (ptrToInt ptr)
+
+instance Cmp Reg32 Label where
+ cmp (Reg32 dest) lab = do
+ ensureBufferSize x86_max_instruction_bytes
+ x86_alu_reg_imm x86_cmp dest 0xf0f0f0f0
+ emitFixup lab (-4) Fixup32Absolute
+
+instance Cmp Addr Word32 where
+ cmp (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_cmp dest (fromIntegral imm)
+
+instance Cmp Addr (Ptr a) where
+ cmp (Addr dest) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_cmp dest (ptrToWord32 ptr)
+
+instance Cmp Addr Label where
+ cmp (Addr dest) lab = do
+ ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_imm x86_cmp dest 0xf0f0f0f0
+ emitFixup lab (-4) Fixup32Absolute
+
+instance Cmp (Disp, Reg32) Word32 where
+ cmp (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_cmp dest disp (fromIntegral imm)
+
+instance Cmp (Disp, Reg32) (Ptr a) where
+ cmp (Disp disp, Reg32 dest) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_cmp dest disp (ptrToWord32 ptr)
+
+instance Cmp (Disp, Reg32) Label where
+ cmp (Disp disp, Reg32 dest) lab = do
+ ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_cmp dest disp 0xf0f0f0f0
+ emitFixup lab (-4) Fixup32Absolute
+
+instance Cmp Ind Word32 where
+ cmp (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_cmp dest 0 (fromIntegral imm)
+
+instance Cmp Ind (Ptr a) where
+ cmp (Ind (Reg32 dest)) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_imm x86_cmp dest 0 (ptrToWord32 ptr)
+
+instance Cmp Ind Label where
+ cmp (Ind (Reg32 dest)) lab = do
+ ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_cmp dest disp imm
+
+instance Cmp Ind Word8 where
+ cmp (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase8_imm x86_cmp dest 0 imm
+
+instance Cmp Addr Reg32 where
+ cmp (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_mem_reg x86_cmp dest source
+
+instance Cmp (Disp, Reg32) Reg32 where
+ cmp (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_cmp dest disp source
+
+instance Cmp Ind Reg32 where
+ cmp (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_membase_reg x86_cmp dest 0 source
+
+instance Cmp Reg32 Reg32 where
+ cmp (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_reg x86_cmp dest source
+
+instance Cmp Reg8 Reg8 where
+ cmp (Reg8 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg8_reg8 x86_cmp dest source False False
+
+instance Cmp Reg32 Addr where
+ cmp (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_mem x86_cmp dest source
+
+instance Cmp Reg32 (Disp, Reg32) where
+ cmp (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_alu_reg_membase x86_cmp dest source disp
+
+instance Cmp Reg32 Ind where
+ cmp (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_test_reg_imm dest imm
+
+instance Test Addr Word32 where
+ test (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_test_mem_imm dest imm
+
+instance Test (Disp, Reg32) Word32 where
+ test (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_test_membase_imm dest disp imm
+
+instance Test Ind Word32 where
+ test (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_test_membase_imm dest 0 imm
+
+instance Test Reg32 Reg32 where
+ test (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_test_reg_reg dest source
+
+instance Test Addr Reg32 where
+ test (Addr dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_test_mem_reg dest source
+
+instance Test (Disp, Reg32) Reg32 where
+ test (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_test_membase_reg dest disp source
+
+instance Test Ind Reg32 where
+ test (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_rol dest imm
+
+instance Rol Addr Word8 where
+ rol (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_rol dest imm
+
+instance Rol (Disp, Reg32) Word8 where
+ rol (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_rol dest disp imm
+
+instance Rol Ind Word8 where
+ rol (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_rol dest 0 imm
+
+instance Rol Reg32 Reg8 where
+ rol (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_rol dest
+ rol _ _ = onlyCl
+
+instance Rol Addr Reg8 where
+ rol (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_rol dest
+ rol _ _ = onlyCl
+
+instance Rol (Disp, Reg32) Reg8 where
+ rol (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_rol dest disp
+
+instance Rol Ind Reg8 where
+ rol (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_ror dest imm
+
+instance Ror Addr Word8 where
+ ror (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_ror dest imm
+
+instance Ror (Disp, Reg32) Word8 where
+ ror (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_ror dest disp imm
+
+instance Ror Ind Word8 where
+ ror (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_ror dest 0 imm
+
+instance Ror Reg32 Reg8 where
+ ror (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_ror dest
+ ror _ _ = onlyCl
+
+instance Ror Addr Reg8 where
+ ror (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_ror dest
+ ror _ _ = onlyCl
+
+instance Ror (Disp, Reg32) Reg8 where
+ ror (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_ror dest disp
+
+instance Ror Ind Reg8 where
+ ror (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_rcl dest imm
+
+instance Rcl Addr Word8 where
+ rcl (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_rcl dest imm
+
+instance Rcl (Disp, Reg32) Word8 where
+ rcl (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_rcl dest disp imm
+
+instance Rcl Ind Word8 where
+ rcl (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_rcl dest 0 imm
+
+instance Rcl Reg32 Reg8 where
+ rcl (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_rcl dest
+ rcl _ _ = onlyCl
+
+instance Rcl Addr Reg8 where
+ rcl (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_rcl dest
+ rcl _ _ = onlyCl
+
+instance Rcl (Disp, Reg32) Reg8 where
+ rcl (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_rcl dest disp
+
+instance Rcl Ind Reg8 where
+ rcl (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_rcr dest imm
+
+instance Rcr Addr Word8 where
+ rcr (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_rcr dest imm
+
+instance Rcr (Disp, Reg32) Word8 where
+ rcr (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_rcr dest disp imm
+
+instance Rcr Ind Word8 where
+ rcr (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_rcr dest 0 imm
+
+instance Rcr Reg32 Reg8 where
+ rcr (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_rcr dest
+ rcr _ _ = onlyCl
+
+instance Rcr Addr Reg8 where
+ rcr (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_rcr dest
+ rcr _ _ = onlyCl
+
+instance Rcr (Disp, Reg32) Reg8 where
+ rcr (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_rcr dest disp
+
+instance Rcr Ind Reg8 where
+ rcr (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_shl dest imm
+
+instance Shl Addr Word8 where
+ shl (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_shl dest imm
+
+instance Shl (Disp, Reg32) Word8 where
+ shl (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_shl dest disp imm
+
+instance Shl Ind Word8 where
+ shl (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_shl dest 0 imm
+
+instance Shl Reg32 Reg8 where
+ shl (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_shl dest
+ shl _ _ = onlyCl
+
+instance Shl Addr Reg8 where
+ shl (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_shl dest
+ shl _ _ = onlyCl
+
+instance Shl (Disp, Reg32) Reg8 where
+ shl (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_shl dest disp
+
+instance Shl Ind Reg8 where
+ shl (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_shr dest imm
+
+instance Shr Addr Word8 where
+ shr (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_shr dest imm
+
+instance Shr (Disp, Reg32) Word8 where
+ shr (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_shr dest disp imm
+
+instance Shr Ind Word8 where
+ shr (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_shr dest 0 imm
+
+instance Shr Reg32 Reg8 where
+ shr (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_shr dest
+ shr _ _ = onlyCl
+
+instance Shr Addr Reg8 where
+ shr (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_shr dest
+ shr _ _ = onlyCl
+
+instance Shr (Disp, Reg32) Reg8 where
+ shr (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_shr dest disp
+
+instance Shr Ind Reg8 where
+ shr (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_sar dest imm
+
+instance Sar Addr Word8 where
+ sar (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_sar dest imm
+
+instance Sar (Disp, Reg32) Word8 where
+ sar (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_sar dest disp imm
+
+instance Sar Ind Word8 where
+ sar (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_sar dest 0 imm
+
+instance Sar Reg32 Reg8 where
+ sar (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_sar dest
+ sar _ _ = onlyCl
+
+instance Sar Addr Reg8 where
+ sar (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_sar dest
+ sar _ _ = onlyCl
+
+instance Sar (Disp, Reg32) Reg8 where
+ sar (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_sar dest disp
+
+instance Sar Ind Reg8 where
+ sar (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg_imm x86_shl dest imm
+
+instance Sal Addr Word8 where
+ sal (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem_imm x86_shl dest imm
+
+instance Sal (Disp, Reg32) Word8 where
+ sal (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_shl dest disp imm
+
+instance Sal Ind Word8 where
+ sal (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase_imm x86_shl dest 0 imm
+
+instance Sal Reg32 Reg8 where
+ sal (Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_reg x86_shl dest
+ sal _ _ = onlyCl
+
+instance Sal Addr Reg8 where
+ sal (Addr dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_mem x86_shl dest
+ sal _ _ = onlyCl
+
+instance Sal (Disp, Reg32) Reg8 where
+ sal (Disp disp, Reg32 dest) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> x86_shift_membase x86_shl dest disp
+
+instance Sal Ind Reg8 where
+ sal (Ind (Reg32 dest)) (Reg8 1) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_shrd_reg dest source
+ shrd _ _ _ = onlyCl
+
+instance Shrd Reg32 Reg32 Word8 where
+ shrd (Reg32 dest) (Reg32 source) imm = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_shld_reg dest source
+ shld _ _ _ = onlyCl
+
+instance Shld Reg32 Reg32 Word8 where
+ shld (Reg32 dest) (Reg32 source) imm = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_reg arg False
+
+instance Mul Addr where
+ mul (Addr arg) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_mem arg False
+
+instance Mul (Disp, Reg32) where
+ mul (Disp disp, Reg32 arg) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_membase arg disp False
+
+instance Mul Ind where
+ mul (Ind (Reg32 arg)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_imul_reg_reg dest source
+
+instance Imul InPlace Reg32 Addr where
+ imul _ (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_imul_reg_mem dest source
+
+instance Imul InPlace Reg32 (Disp, Reg32) where
+ imul _ (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_imul_reg_membase dest source disp
+
+instance Imul InPlace Reg32 Ind where
+ imul _ (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> x86_imul_reg_membase dest source 0
+
+instance Imul Reg32 Reg32 Word32 where
+ imul (Reg32 dest) (Reg32 source) imm = ensureBufferSize x86_max_instruction_bytes >> x86_imul_reg_reg_imm dest source imm
+
+instance Imul Reg32 Addr Word32 where
+ imul (Reg32 dest) (Addr source) imm = ensureBufferSize x86_max_instruction_bytes >> x86_imul_reg_mem_imm dest source imm
+
+instance Imul Reg32 (Disp, Reg32) Word32 where
+ imul (Reg32 dest) (Disp disp, Reg32 source) imm = ensureBufferSize x86_max_instruction_bytes >> x86_imul_reg_membase_imm dest source disp imm
+
+instance Imul Reg32 Ind Word32 where
+ imul (Reg32 dest) (Ind (Reg32 source)) imm = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_div_reg arg False
+
+instance Div Addr where
+ div (Addr arg) = ensureBufferSize x86_max_instruction_bytes >> x86_div_mem arg False
+
+instance Div (Disp, Reg32) where
+ div (Disp disp, Reg32 arg) = ensureBufferSize x86_max_instruction_bytes >> x86_div_membase arg disp False
+
+instance Div Ind where
+ div (Ind (Reg32 arg)) = ensureBufferSize x86_max_instruction_bytes >> x86_div_membase arg 0 False
+
+
+-- signed divide
+
+class Idiv a where
+ idiv :: a -> CodeGen e s ()
+
+instance Idiv Reg32 where
+ idiv (Reg32 arg) = ensureBufferSize x86_max_instruction_bytes >> x86_div_reg arg True
+
+instance Idiv Addr where
+ idiv (Addr arg) = ensureBufferSize x86_max_instruction_bytes >> x86_div_mem arg True
+
+instance Idiv (Disp, Reg32) where
+ idiv (Disp disp, Reg32 arg) = ensureBufferSize x86_max_instruction_bytes >> x86_div_membase arg disp True
+
+instance Idiv Ind where
+ idiv (Ind (Reg32 arg)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_reg dest source 1
+
+instance Mov Reg16 Reg16 where
+ mov (Reg16 dest) (Reg16 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_reg dest source 2
+
+instance Mov Reg32 Reg32 where
+ mov (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_reg dest source 4
+
+
+instance Mov Reg32 Word32 where
+ mov (Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_imm dest (fromIntegral imm)
+
+instance Mov Reg32 (Ptr a) where
+ mov (Reg32 dest) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_imm dest (ptrToWord32 ptr)
+
+instance Mov Reg32 Label where
+ mov (Reg32 dest) lab = do ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_imm dest 0
+ emitFixup lab (-4) Fixup32Absolute
+
+instance Mov Addr Word8 where
+ mov (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_imm dest (fromIntegral imm) 1
+
+instance Mov Addr Word16 where
+ mov (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_imm dest (fromIntegral imm) 2
+
+instance Mov Addr Word32 where
+ mov (Addr dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_imm dest imm 4
+
+instance Mov Addr (Ptr a) where
+ mov (Addr dest) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_imm dest (ptrToWord32 ptr) 4
+
+instance Mov Addr Label where
+ mov (Addr dest) lab = do ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_imm dest 0 4
+ emitFixup lab (-4) Fixup32Absolute
+
+instance Mov (Disp, Reg32) Word8 where
+ mov (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest disp (fromIntegral imm) 1
+
+instance Mov Ind Word8 where
+ mov (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest 0 (fromIntegral imm) 1
+
+instance Mov (Disp, Reg32) Word16 where
+ mov (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest disp (fromIntegral imm) 2
+
+instance Mov Ind Word16 where
+ mov (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest 0 (fromIntegral imm) 2
+
+instance Mov (Disp, Reg32) Word32 where
+ mov (Disp disp, Reg32 dest) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest disp imm 4
+
+instance Mov (Disp, Reg32) (Ptr a) where
+ mov (Disp disp, Reg32 dest) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest disp (ptrToWord32 ptr) 4
+
+instance Mov (Disp, Reg32) Label where
+ mov (Disp disp, Reg32 dest) lab = do ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest disp 0 4
+ emitFixup lab (-4) Fixup32Absolute
+
+instance Mov Ind Word32 where
+ mov (Ind (Reg32 dest)) imm = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest 0 imm 4
+
+instance Mov Ind (Ptr a) where
+ mov (Ind (Reg32 dest)) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_imm dest 0 (ptrToWord32 ptr) 4
+
+instance Mov Ind Label where
+ mov (Ind (Reg32 dest)) lab = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_mov_memindex_imm base 0 index (scaleToShift scale) imm 4
+
+instance Mov (Reg32, Reg32, Scale) (Ptr a) where
+ mov (Reg32 base, Reg32 index, scale) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_mov_memindex_imm base 0 index (scaleToShift scale) (ptrToWord32 ptr) 4
+
+instance Mov (Reg32, Reg32, Scale) Label where
+ mov (Reg32 base, Reg32 index, scale) lab = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_mov_memindex_imm x86_nobasereg disp index (scaleToShift scale) imm 4
+
+instance Mov (Disp, Reg32, Scale) (Ptr a) where
+ mov (Disp disp, Reg32 index, scale) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_mov_memindex_imm x86_nobasereg disp index (scaleToShift scale) (ptrToWord32 ptr) 4
+
+instance Mov (Disp, Reg32, Scale) Label where
+ mov (Disp disp, Reg32 index, scale) lab = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_mov_memindex_imm 5 disp index (scaleToShift scale) imm 4
+ mov _ _ = onlyEbp
+
+instance Mov (Disp, Reg32, Reg32, Scale) (Ptr a) where
+ mov (Disp disp, Reg32 5, Reg32 index, scale) ptr = ensureBufferSize x86_max_instruction_bytes >> x86_mov_memindex_imm 5 disp index (scaleToShift scale) (ptrToWord32 ptr) 4
+ mov _ _ = onlyEbp
+
+instance Mov (Disp, Reg32, Reg32, Scale) Label where
+ mov (Disp disp, Reg32 5, Reg32 index, scale) lab = do ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_reg a source 1
+
+instance Mov Addr Reg16 where
+ mov (Addr a) (Reg16 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_reg a source 2
+
+instance Mov Addr Reg32 where
+ mov (Addr a) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_mem_reg a source 4
+
+instance Mov Reg8 Addr where
+ mov (Reg8 dest) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_mem dest a 1
+
+instance Mov Reg16 Addr where
+ mov (Reg16 dest) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_mem dest a 2
+
+instance Mov Reg32 Addr where
+ mov (Reg32 dest) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_mem dest a 4
+
+
+instance Mov Ind Reg8 where
+ mov (Ind (Reg32 dest)) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_regp_reg dest source 1
+
+instance Mov Ind Reg16 where
+ mov (Ind (Reg32 dest)) (Reg16 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_regp_reg dest source 2
+
+instance Mov Ind Reg32 where
+ mov (Ind (Reg32 dest)) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_regp_reg dest source 4
+
+instance Mov Reg8 Ind where
+ mov (Reg8 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_regp dest source 1
+
+instance Mov Reg16 Ind where
+ mov (Reg16 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_regp dest source 2
+
+instance Mov Reg32 Ind where
+ mov (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_regp dest source 4
+
+
+instance Mov (Disp, Reg32) Reg8 where
+ mov (Disp disp, Reg32 dest) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_reg dest disp source 1
+
+instance Mov (Disp, Reg32) Reg16 where
+ mov (Disp disp, Reg32 dest) (Reg16 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_reg dest disp source 2
+
+instance Mov (Disp, Reg32) Reg32 where
+ mov (Disp disp, Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_membase_reg dest disp source 4
+
+instance Mov Reg8 (Disp, Reg32) where
+ mov (Reg8 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_membase dest source disp 1
+
+instance Mov Reg16 (Disp, Reg32) where
+ mov (Reg16 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_membase dest source disp 2
+
+instance Mov Reg32 (Disp, Reg32) where
+ mov (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_reg_membase dest source disp 4
+
+
+instance Mov (Reg32, Reg32, Scale) Reg8 where
+ mov (Reg32 base, Reg32 index, s) (Reg8 source) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_reg dest source True False
+
+instance Movsxb Reg32 Addr where
+ movsxb (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_mem dest source True False
+
+instance Movsxb Reg32 (Disp, Reg32) where
+ movsxb (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_membase dest source disp True False
+
+instance Movsxb Reg32 Ind where
+ movsxb (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_reg dest source True True
+
+instance Movsxw Reg32 Addr where
+ movsxw (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_mem dest source True True
+
+instance Movsxw Reg32 (Disp, Reg32) where
+ movsxw (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_membase dest source disp True True
+
+instance Movsxw Reg32 Ind where
+ movsxw (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_reg dest source False False
+
+instance Movzxb Reg32 Addr where
+ movzxb (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_mem dest source False False
+
+instance Movzxb Reg32 (Disp, Reg32) where
+ movzxb (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_membase dest source disp False False
+
+instance Movzxb Reg32 Ind where
+ movzxb (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_reg dest source False True
+
+instance Movzxw Reg32 Addr where
+ movzxw (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_mem dest source False True
+
+instance Movzxw Reg32 (Disp, Reg32) where
+ movzxw (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_widen_membase dest source disp False True
+
+instance Movzxw Reg32 Ind where
+ movzxw (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_lea_mem dest source
+
+instance Lea Reg32 (Disp, Reg32) where
+ lea (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_lea_membase dest source disp
+
+instance Lea Reg32 Ind where
+ lea (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> x86_lea_membase dest source 0
+
+instance Lea Reg32 (Disp, Reg32, Reg32, Scale) where
+ lea (Reg32 dest) (Disp disp, Reg32 5, Reg32 index, s) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_lea_memindex dest base 0 index (scaleToShift s)
+
+
+-- convert word to doubleword
+
+cdq = ensureBufferSize x86_max_instruction_bytes >> x86_cdq
+
+
+-- wait for FPU
+
+wait = ensureBufferSize x86_max_instruction_bytes >> x86_wait
+
+
+-- push to stack
+
+class Push a where
+ push :: a -> CodeGen e s ()
+
+instance Push Reg32 where
+ push (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_push_reg source
+
+instance Push Ind where
+ push (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> x86_push_regp source
+
+instance Push Addr where
+ push (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_push_mem source
+
+instance Push (Disp, Reg32) where
+ push (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_push_membase source disp
+
+instance Push Word32 where
+ push imm = ensureBufferSize x86_max_instruction_bytes >> x86_push_imm imm
+
+instance Push Label where
+ push l = do ensureBufferSize x86_max_instruction_bytes >> x86_push_imm_template
+ emitFixup l (-4) Fixup32Absolute
+
+instance Push (Disp, Reg32, Reg32, Scale) where
+ push (Disp disp, Reg32 5, Reg32 index, s) = ensureBufferSize x86_max_instruction_bytes >> x86_push_memindex 5 disp index (scaleToShift s)
+ push _ = onlyEbp
+
+instance Push (Disp, Reg32, Scale) where
+ push (Disp disp, Reg32 index, s) = ensureBufferSize x86_max_instruction_bytes >> x86_push_memindex x86_nobasereg disp index (scaleToShift s)
+
+instance Push (Reg32, Reg32, Scale) where
+ push (Reg32 base, Reg32 index, s) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_pop_reg dest
+
+instance Pop Addr where
+ pop (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_pop_mem dest
+
+instance Pop (Disp, Reg32) where
+ pop (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_pop_membase dest disp
+
+instance Pop Ind where
+ pop (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> x86_pop_membase dest 0
+
+
+-- push/pop general purpose registers
+
+pushad = ensureBufferSize x86_max_instruction_bytes >> x86_pushad
+popad = ensureBufferSize x86_max_instruction_bytes >> x86_popad
+
+
+-- push/pop EFLAGS
+
+pushfd = ensureBufferSize x86_max_instruction_bytes >> x86_pushfd
+popfd = ensureBufferSize x86_max_instruction_bytes >> x86_popfd
+
+
+-- loop according to ECX counter
+
+class Loop a where
+ loop :: a -> CodeGen e s ()
+ loope :: a -> CodeGen e s ()
+ loopne :: a -> CodeGen e s ()
+
+instance Loop Word8 where
+ loop w = ensureBufferSize x86_max_instruction_bytes >> x86_loop w
+ loope w = ensureBufferSize x86_max_instruction_bytes >> x86_loope w
+ loopne w = ensureBufferSize x86_max_instruction_bytes >> x86_loopne w
+
+instance Loop Label where
+ loop l = do ensureBufferSize x86_max_instruction_bytes >> x86_loop 0
+ emitFixup l (-1) Fixup8
+ loope l = do ensureBufferSize x86_max_instruction_bytes >> x86_loope 0
+ emitFixup l (-1) Fixup8
+ loopne l = do ensureBufferSize x86_max_instruction_bytes >> x86_loopne 0
+ emitFixup l (-1) Fixup8
+
+-- jump
+
+class Jmp a where
+ jmp :: a -> CodeGen e s ()
+
+instance Jmp Word8 where
+ jmp imm = ensureBufferSize x86_max_instruction_bytes >> x86_jump8 imm
+
+instance Jmp Word32 where
+ jmp imm = ensureBufferSize x86_max_instruction_bytes >> x86_jump32 imm
+
+instance Jmp Reg32 where
+ jmp (Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_jump_reg dest
+
+instance Jmp Addr where
+ jmp (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_jump_mem dest
+
+instance Jmp (Disp, Reg32) where
+ jmp (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_jump_membase dest disp
+
+instance Jmp Ind where
+ jmp (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> x86_jump_membase dest 0
+
+instance Jmp Label where
+ jmp l = do ensureBufferSize x86_max_instruction_bytes >> x86_jump32 0
+ emitFixup l (-4) Fixup32
+
+instance Jmp (Ptr a) where
+ jmp ptr = ensureBufferSize x86_max_instruction_bytes >> x86_jump_pointer ptr
+
+-- jump on condition code (branch)
+
+class Ja a where
+ ja :: a -> CodeGen e s ()
+
+instance Ja Word8 where
+ ja imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_a imm False
+
+instance Ja Word32 where
+ ja imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_a imm False
+
+instance Ja (Ptr a) where
+ ja ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_a ptr False
+
+instance Ja Label where
+ ja l = do ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_a 0 False
+ emitFixup l (-4) Fixup32
+
+class Jae a where
+ jae :: a -> CodeGen e s ()
+
+instance Jae Word8 where
+ jae imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_ae imm False
+
+instance Jae Word32 where
+ jae imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_ae imm False
+
+instance Jae (Ptr a) where
+ jae ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_ae ptr False
+
+instance Jae Label where
+ jae l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_b imm False
+
+instance Jb Word32 where
+ jb imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_b imm False
+
+instance Jb (Ptr a) where
+ jb ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_b ptr False
+
+instance Jb Label where
+ jb l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_be imm False
+
+instance Jbe Word32 where
+ jbe imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_be imm False
+
+instance Jbe (Ptr a) where
+ jbe ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_be ptr False
+
+instance Jbe Label where
+ jbe l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_c imm False
+
+instance Jc Word32 where
+ jc imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_c imm False
+
+instance Jc (Ptr a) where
+ jc ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_c ptr False
+
+instance Jc Label where
+ jc l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_e imm False
+
+instance Je Word32 where
+ je imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_e imm False
+
+instance Je (Ptr a) where
+ je ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_e ptr False
+
+instance Je Label where
+ je l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_na imm False
+
+instance Jna Word32 where
+ jna imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_na imm False
+
+instance Jna (Ptr a) where
+ jna ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_na ptr False
+
+instance Jna Label where
+ jna l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_nae imm False
+
+instance Jnae Word32 where
+ jnae imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_nae imm False
+
+instance Jnae (Ptr a) where
+ jnae ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_nae ptr False
+
+instance Jnae Label where
+ jnae l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_nb imm False
+
+instance Jnb Word32 where
+ jnb imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_nb imm False
+
+instance Jnb (Ptr a) where
+ jnb ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_nb ptr False
+
+instance Jnb Label where
+ jnb l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_nbe imm False
+
+instance Jnbe Word32 where
+ jnbe imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_nbe imm False
+
+instance Jnbe (Ptr a) where
+ jnbe ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_nbe ptr False
+
+instance Jnbe Label where
+ jnbe l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_nc imm False
+
+instance Jnc Word32 where
+ jnc imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_nc imm False
+
+instance Jnc (Ptr a) where
+ jnc ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_nc ptr False
+
+instance Jnc Label where
+ jnc l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_ne imm False
+
+instance Jne Word32 where
+ jne imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_ne imm False
+
+instance Jne (Ptr a) where
+ jne ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_ne ptr False
+
+instance Jne Label where
+ jne l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_np imm False
+
+instance Jnp Word32 where
+ jnp imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_np imm False
+
+instance Jnp (Ptr a) where
+ jnp ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_np ptr False
+
+instance Jnp Label where
+ jnp l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_nz imm False
+
+instance Jnz Word32 where
+ jnz imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_nz imm False
+
+instance Jnz (Ptr a) where
+ jnz ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_nz ptr False
+
+instance Jnz Label where
+ jnz l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_p imm False
+
+instance Jp Word32 where
+ jp imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_p imm False
+
+instance Jp (Ptr a) where
+ jp ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_p ptr False
+
+instance Jp Label where
+ jp l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_pe imm False
+
+instance Jpe Word32 where
+ jpe imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_pe imm False
+
+instance Jpe (Ptr a) where
+ jpe ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_pe ptr False
+
+instance Jpe Label where
+ jpe l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_po imm False
+
+instance Jpo Word32 where
+ jpo imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_po imm False
+
+instance Jpo (Ptr a) where
+ jpo ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_po ptr False
+
+instance Jpo Label where
+ jpo l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_z imm False
+
+instance Jz Word32 where
+ jz imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_z imm False
+
+instance Jz (Ptr a) where
+ jz ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_z ptr False
+
+instance Jz Label where
+ jz l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_gt imm True
+
+instance Jg Word32 where
+ jg imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_gt imm True
+
+instance Jg (Ptr a) where
+ jg ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_gt ptr True
+
+instance Jg Label where
+ jg l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_ge imm True
+
+instance Jge Word32 where
+ jge imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_ge imm True
+
+instance Jge (Ptr a) where
+ jge ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_ge ptr True
+
+instance Jge Label where
+ jge l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_lt imm True
+
+instance Jl Word32 where
+ jl imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_lt imm True
+
+instance Jl (Ptr a) where
+ jl ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_lt ptr True
+
+instance Jl Label where
+ jl l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_le imm True
+
+instance Jle Word32 where
+ jle imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_le imm True
+
+instance Jle (Ptr a) where
+ jle ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_le ptr True
+
+instance Jle Label where
+ jle l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_le imm True
+
+instance Jng Word32 where
+ jng imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_le imm True
+
+instance Jng (Ptr a) where
+ jng ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_le ptr True
+
+instance Jng Label where
+ jng l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_lt imm True
+
+instance Jnge Word32 where
+ jnge imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_lt imm True
+
+instance Jnge (Ptr a) where
+ jnge ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_lt ptr True
+
+instance Jnge Label where
+ jnge l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_ge imm True
+
+instance Jnl Word32 where
+ jnl imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_ge imm True
+
+instance Jnl (Ptr a) where
+ jnl ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_ge ptr True
+
+instance Jnl Label where
+ jnl l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_gt imm True
+
+instance Jnle Word32 where
+ jnle imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_gt imm True
+
+instance Jnle (Ptr a) where
+ jnle ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_gt ptr True
+
+instance Jnle Label where
+ jnle l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_no imm True
+
+instance Jno Word32 where
+ jno imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_no imm True
+
+instance Jno (Ptr a) where
+ jno ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_no ptr True
+
+instance Jno Label where
+ jno l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_ns imm True
+
+instance Jns Word32 where
+ jns imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_ns imm True
+
+instance Jns (Ptr a) where
+ jns ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_ns ptr True
+
+instance Jns Label where
+ jns l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_o imm True
+
+instance Jo Word32 where
+ jo imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_o imm True
+
+instance Jo (Ptr a) where
+ jo ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_o ptr True
+
+instance Jo Label where
+ jo l = do ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_branch8 x86_cc_s imm True
+
+instance Js Word32 where
+ js imm = ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_s imm True
+
+instance Js (Ptr a) where
+ js ptr = ensureBufferSize x86_max_instruction_bytes >> x86_branch_pointer x86_cc_s ptr True
+
+instance Js Label where
+ js l = do ensureBufferSize x86_max_instruction_bytes >> x86_branch32 x86_cc_s 0 True
+ emitFixup l (-4) Fixup32
+
+-- jump if ecx register is 0
+
+jecxz :: Word8 -> CodeGen e s ()
+jecxz w = ensureBufferSize x86_max_instruction_bytes >> x86_jecxz w
+
+
+-- set byte on condition code
+
+class Seta a where
+ seta :: a -> CodeGen e s ()
+
+instance Seta Reg8 where
+ seta (Reg8 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_a dest False
+
+instance Seta Addr where
+ seta (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_a dest False
+
+instance Seta (Disp, Reg32) where
+ seta (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_a dest disp False
+
+instance Seta Ind where
+ seta (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_ae dest False
+
+instance Setae Addr where
+ setae (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_ae dest False
+
+instance Setae (Disp, Reg32) where
+ setae (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_ae dest disp False
+
+instance Setae Ind where
+ setae (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_b dest False
+
+instance Setb Addr where
+ setb (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_b dest False
+
+instance Setb (Disp, Reg32) where
+ setb (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_b dest disp False
+
+instance Setb Ind where
+ setb (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_be dest False
+
+instance Setbe Addr where
+ setbe (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_be dest False
+
+instance Setbe (Disp, Reg32) where
+ setbe (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_be dest disp False
+
+instance Setbe Ind where
+ setbe (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_c dest False
+
+instance Setc Addr where
+ setc (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_c dest False
+
+instance Setc (Disp, Reg32) where
+ setc (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_c dest disp False
+
+instance Setc Ind where
+ setc (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_e dest False
+
+instance Sete Addr where
+ sete (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_e dest False
+
+instance Sete (Disp, Reg32) where
+ sete (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_e dest disp False
+
+instance Sete Ind where
+ sete (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_na dest False
+
+instance Setna Addr where
+ setna (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_na dest False
+
+instance Setna (Disp, Reg32) where
+ setna (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_na dest disp False
+
+instance Setna Ind where
+ setna (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_nae dest False
+
+instance Setnae Addr where
+ setnae (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_nae dest False
+
+instance Setnae (Disp, Reg32) where
+ setnae (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_nae dest disp False
+
+instance Setnae Ind where
+ setnae (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_nb dest False
+
+instance Setnb Addr where
+ setnb (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_nb dest False
+
+instance Setnb (Disp, Reg32) where
+ setnb (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_nb dest disp False
+
+instance Setnb Ind where
+ setnb (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_nbe dest False
+
+instance Setnbe Addr where
+ setnbe (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_nbe dest False
+
+instance Setnbe (Disp, Reg32) where
+ setnbe (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_nbe dest disp False
+
+instance Setnbe Ind where
+ setnbe (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_nc dest False
+
+instance Setnc Addr where
+ setnc (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_nc dest False
+
+instance Setnc (Disp, Reg32) where
+ setnc (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_nc dest disp False
+
+instance Setnc Ind where
+ setnc (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_ne dest False
+
+instance Setne Addr where
+ setne (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_ne dest False
+
+instance Setne (Disp, Reg32) where
+ setne (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_ne dest disp False
+
+instance Setne Ind where
+ setne (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_np dest False
+
+instance Setnp Addr where
+ setnp (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_np dest False
+
+instance Setnp (Disp, Reg32) where
+ setnp (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_np dest disp False
+
+instance Setnp Ind where
+ setnp (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_nz dest False
+
+instance Setnz Addr where
+ setnz (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_nz dest False
+
+instance Setnz (Disp, Reg32) where
+ setnz (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_nz dest disp False
+
+instance Setnz Ind where
+ setnz (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_p dest False
+
+instance Setp Addr where
+ setp (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_p dest False
+
+instance Setp (Disp, Reg32) where
+ setp (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_p dest disp False
+
+instance Setp Ind where
+ setp (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_pe dest False
+
+instance Setpe Addr where
+ setpe (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_pe dest False
+
+instance Setpe (Disp, Reg32) where
+ setpe (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_pe dest disp False
+
+instance Setpe Ind where
+ setpe (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_po dest False
+
+instance Setpo Addr where
+ setpo (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_po dest False
+
+instance Setpo (Disp, Reg32) where
+ setpo (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_po dest disp False
+
+instance Setpo Ind where
+ setpo (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_gt dest True
+
+instance Setg Addr where
+ setg (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_gt dest True
+
+instance Setg (Disp, Reg32) where
+ setg (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_gt dest disp True
+
+instance Setg Ind where
+ setg (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_ge dest True
+
+instance Setge Addr where
+ setge (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_ge dest True
+
+instance Setge (Disp, Reg32) where
+ setge (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_ge dest disp True
+
+instance Setge Ind where
+ setge (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_lt dest True
+
+instance Setl Addr where
+ setl (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_lt dest True
+
+instance Setl (Disp, Reg32) where
+ setl (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_lt dest disp True
+
+instance Setl Ind where
+ setl (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_le dest True
+
+instance Setle Addr where
+ setle (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_le dest True
+
+instance Setle (Disp, Reg32) where
+ setle (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_le dest disp True
+
+instance Setle Ind where
+ setle (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_le dest True
+
+instance Setng Addr where
+ setng (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_le dest True
+
+instance Setng (Disp, Reg32) where
+ setng (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_le dest disp True
+
+instance Setng Ind where
+ setng (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_lt dest True
+
+instance Setnge Addr where
+ setnge (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_lt dest True
+
+instance Setnge (Disp, Reg32) where
+ setnge (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_lt dest disp True
+
+instance Setnge Ind where
+ setnge (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_ge dest True
+
+instance Setnl Addr where
+ setnl (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_ge dest True
+
+instance Setnl (Disp, Reg32) where
+ setnl (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_ge dest disp True
+
+instance Setnl Ind where
+ setnl (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_gt dest True
+
+instance Setnle Addr where
+ setnle (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_gt dest True
+
+instance Setnle (Disp, Reg32) where
+ setnle (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_gt dest disp True
+
+instance Setnle Ind where
+ setnle (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_no dest True
+
+instance Setno Addr where
+ setno (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_no dest True
+
+instance Setno (Disp, Reg32) where
+ setno (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_no dest disp True
+
+instance Setno Ind where
+ setno (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_ns dest True
+
+instance Setns Addr where
+ setns (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_ns dest True
+
+instance Setns (Disp, Reg32) where
+ setns (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_ns dest disp True
+
+instance Setns Ind where
+ setns (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_o dest True
+
+instance Seto Addr where
+ seto (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_o dest True
+
+instance Seto (Disp, Reg32) where
+ seto (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_o dest disp True
+
+instance Seto Ind where
+ seto (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_s dest True
+
+instance Sets Addr where
+ sets (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_s dest True
+
+instance Sets (Disp, Reg32) where
+ sets (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_s dest disp True
+
+instance Sets Ind where
+ sets (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_set_reg x86_cc_z dest False
+
+instance Setz Addr where
+ setz (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_mem x86_cc_z dest False
+
+instance Setz (Disp, Reg32) where
+ setz (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_set_membase x86_cc_z dest disp False
+
+instance Setz Ind where
+ setz (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> 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 = ensureBufferSize x86_max_instruction_bytes >> x86_call_imm imm
+
+instance Call Label where
+ call l = do ensureBufferSize x86_max_instruction_bytes >> x86_call_imm 0
+ emitFixup l (-4) Fixup32
+
+instance Call Reg32 where
+ call (Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_call_reg dest
+
+instance Call Addr where
+ call (Addr dest) = ensureBufferSize x86_max_instruction_bytes >> x86_call_mem dest
+
+instance Call (Disp, Reg32) where
+ call (Disp disp, Reg32 dest) = ensureBufferSize x86_max_instruction_bytes >> x86_call_membase dest disp
+
+instance Call Ind where
+ call (Ind (Reg32 dest)) = ensureBufferSize x86_max_instruction_bytes >> x86_call_membase dest 0
+
+instance Call (FunPtr a) where
+ call f = ensureBufferSize x86_max_instruction_bytes >> x86_call_hs f
+
+
+-- return from procedure
+
+ret :: CodeGen e s ()
+ret = ensureBufferSize x86_max_instruction_bytes >> x86_ret
+
+retN :: Word16 -> CodeGen e s ()
+retN n = ensureBufferSize x86_max_instruction_bytes >> x86_ret_imm n
+
+
+-- make stack frame
+
+enter :: Word16 -> CodeGen e s ()
+enter w = ensureBufferSize x86_max_instruction_bytes >> x86_enter w
+
+
+-- conditional move
+
+class Cmova a b where
+ cmova :: a -> b -> CodeGen e s ()
+
+instance Cmova Reg32 Reg32 where
+ cmova (Reg32 dest) (Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_a False dest source
+
+instance Cmova Reg32 Addr where
+ cmova (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_a False dest source
+
+instance Cmova Reg32 (Disp, Reg32) where
+ cmova (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_a False dest source disp
+
+instance Cmova Reg32 Ind where
+ cmova (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_ae False dest source
+
+instance Cmovae Reg32 Addr where
+ cmovae (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_ae False dest source
+
+instance Cmovae Reg32 (Disp, Reg32) where
+ cmovae (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_ae False dest source disp
+
+instance Cmovae Reg32 Ind where
+ cmovae (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_b False dest source
+
+instance Cmovb Reg32 Addr where
+ cmovb (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_b False dest source
+
+instance Cmovb Reg32 (Disp, Reg32) where
+ cmovb (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_b False dest source disp
+
+instance Cmovb Reg32 Ind where
+ cmovb (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_be False dest source
+
+instance Cmovbe Reg32 Addr where
+ cmovbe (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_be False dest source
+
+instance Cmovbe Reg32 (Disp, Reg32) where
+ cmovbe (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_be False dest source disp
+
+instance Cmovbe Reg32 Ind where
+ cmovbe (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_c False dest source
+
+instance Cmovc Reg32 Addr where
+ cmovc (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_c False dest source
+
+instance Cmovc Reg32 (Disp, Reg32) where
+ cmovc (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_c False dest source disp
+
+instance Cmovc Reg32 Ind where
+ cmovc (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_e False dest source
+
+instance Cmove Reg32 Addr where
+ cmove (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_e False dest source
+
+instance Cmove Reg32 (Disp, Reg32) where
+ cmove (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_e False dest source disp
+
+instance Cmove Reg32 Ind where
+ cmove (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_na False dest source
+
+instance Cmovna Reg32 Addr where
+ cmovna (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_na False dest source
+
+instance Cmovna Reg32 (Disp, Reg32) where
+ cmovna (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_na False dest source disp
+
+instance Cmovna Reg32 Ind where
+ cmovna (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_nae False dest source
+
+instance Cmovnae Reg32 Addr where
+ cmovnae (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_nae False dest source
+
+instance Cmovnae Reg32 (Disp, Reg32) where
+ cmovnae (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_nae False dest source disp
+
+instance Cmovnae Reg32 Ind where
+ cmovnae (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_nb False dest source
+
+instance Cmovnb Reg32 Addr where
+ cmovnb (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_nb False dest source
+
+instance Cmovnb Reg32 (Disp, Reg32) where
+ cmovnb (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_nb False dest source disp
+
+instance Cmovnb Reg32 Ind where
+ cmovnb (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_nbe False dest source
+
+instance Cmovnbe Reg32 Addr where
+ cmovnbe (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_nbe False dest source
+
+instance Cmovnbe Reg32 (Disp, Reg32) where
+ cmovnbe (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_nbe False dest source disp
+
+instance Cmovnbe Reg32 Ind where
+ cmovnbe (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_nc False dest source
+
+instance Cmovnc Reg32 Addr where
+ cmovnc (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_nc False dest source
+
+instance Cmovnc Reg32 (Disp, Reg32) where
+ cmovnc (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_nc False dest source disp
+
+instance Cmovnc Reg32 Ind where
+ cmovnc (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_ne False dest source
+
+instance Cmovne Reg32 Addr where
+ cmovne (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_ne False dest source
+
+instance Cmovne Reg32 (Disp, Reg32) where
+ cmovne (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_ne False dest source disp
+
+instance Cmovne Reg32 Ind where
+ cmovne (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_np False dest source
+
+instance Cmovnp Reg32 Addr where
+ cmovnp (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_np False dest source
+
+instance Cmovnp Reg32 (Disp, Reg32) where
+ cmovnp (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_np False dest source disp
+
+instance Cmovnp Reg32 Ind where
+ cmovnp (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_nz False dest source
+
+instance Cmovnz Reg32 Addr where
+ cmovnz (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_nz False dest source
+
+instance Cmovnz Reg32 (Disp, Reg32) where
+ cmovnz (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_nz False dest source disp
+
+instance Cmovnz Reg32 Ind where
+ cmovnz (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_p False dest source
+
+instance Cmovp Reg32 Addr where
+ cmovp (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_p False dest source
+
+instance Cmovp Reg32 (Disp, Reg32) where
+ cmovp (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_p False dest source disp
+
+instance Cmovp Reg32 Ind where
+ cmovp (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_pe False dest source
+
+instance Cmovpe Reg32 Addr where
+ cmovpe (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_pe False dest source
+
+instance Cmovpe Reg32 (Disp, Reg32) where
+ cmovpe (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_pe False dest source disp
+
+instance Cmovpe Reg32 Ind where
+ cmovpe (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_po False dest source
+
+instance Cmovpo Reg32 Addr where
+ cmovpo (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_po False dest source
+
+instance Cmovpo Reg32 (Disp, Reg32) where
+ cmovpo (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_po False dest source disp
+
+instance Cmovpo Reg32 Ind where
+ cmovpo (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_z False dest source
+
+instance Cmovz Reg32 Addr where
+ cmovz (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_z False dest source
+
+instance Cmovz Reg32 (Disp, Reg32) where
+ cmovz (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_z False dest source disp
+
+instance Cmovz Reg32 Ind where
+ cmovz (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_gt True dest source
+
+instance Cmovg Reg32 Addr where
+ cmovg (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_gt True dest source
+
+instance Cmovg Reg32 (Disp, Reg32) where
+ cmovg (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_gt True dest source disp
+
+instance Cmovg Reg32 Ind where
+ cmovg (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_ge True dest source
+
+instance Cmovge Reg32 Addr where
+ cmovge (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_ge True dest source
+
+instance Cmovge Reg32 (Disp, Reg32) where
+ cmovge (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_ge True dest source disp
+
+instance Cmovge Reg32 Ind where
+ cmovge (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_lt True dest source
+
+instance Cmovl Reg32 Addr where
+ cmovl (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_lt True dest source
+
+instance Cmovl Reg32 (Disp, Reg32) where
+ cmovl (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_lt True dest source disp
+
+instance Cmovl Reg32 Ind where
+ cmovl (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_le True dest source
+
+instance Cmovle Reg32 Addr where
+ cmovle (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_le True dest source
+
+instance Cmovle Reg32 (Disp, Reg32) where
+ cmovle (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_le True dest source disp
+
+instance Cmovle Reg32 Ind where
+ cmovle (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_le True dest source
+
+instance Cmovng Reg32 Addr where
+ cmovng (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_le True dest source
+
+instance Cmovng Reg32 (Disp, Reg32) where
+ cmovng (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_le True dest source disp
+
+instance Cmovng Reg32 Ind where
+ cmovng (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_lt True dest source
+
+instance Cmovnge Reg32 Addr where
+ cmovnge (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_lt True dest source
+
+instance Cmovnge Reg32 (Disp, Reg32) where
+ cmovnge (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_lt True dest source disp
+
+instance Cmovnge Reg32 Ind where
+ cmovnge (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_ge True dest source
+
+instance Cmovnl Reg32 Addr where
+ cmovnl (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_ge True dest source
+
+instance Cmovnl Reg32 (Disp, Reg32) where
+ cmovnl (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_ge True dest source disp
+
+instance Cmovnl Reg32 Ind where
+ cmovnl (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_gt True dest source
+
+instance Cmovnle Reg32 Addr where
+ cmovnle (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_gt True dest source
+
+instance Cmovnle Reg32 (Disp, Reg32) where
+ cmovnle (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_gt True dest source disp
+
+instance Cmovnle Reg32 Ind where
+ cmovnle (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_no True dest source
+
+instance Cmovno Reg32 Addr where
+ cmovno (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_no True dest source
+
+instance Cmovno Reg32 (Disp, Reg32) where
+ cmovno (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_no True dest source disp
+
+instance Cmovno Reg32 Ind where
+ cmovno (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_ns True dest source
+
+instance Cmovns Reg32 Addr where
+ cmovns (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_ns True dest source
+
+instance Cmovns Reg32 (Disp, Reg32) where
+ cmovns (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_ns True dest source disp
+
+instance Cmovns Reg32 Ind where
+ cmovns (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_o True dest source
+
+instance Cmovo Reg32 Addr where
+ cmovo (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_o True dest source
+
+instance Cmovo Reg32 (Disp, Reg32) where
+ cmovo (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_o True dest source disp
+
+instance Cmovo Reg32 Ind where
+ cmovo (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> 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) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_reg x86_cc_s True dest source
+
+instance Cmovs Reg32 Addr where
+ cmovs (Reg32 dest) (Addr source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_mem x86_cc_s True dest source
+
+instance Cmovs Reg32 (Disp, Reg32) where
+ cmovs (Reg32 dest) (Disp disp, Reg32 source) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_s True dest source disp
+
+instance Cmovs Reg32 Ind where
+ cmovs (Reg32 dest) (Ind (Reg32 source)) = ensureBufferSize x86_max_instruction_bytes >> x86_cmov_membase x86_cc_s True dest source 0
+
+
+-- release stack frame
+
+leave :: CodeGen e s ()
+leave = ensureBufferSize x86_max_instruction_bytes >> x86_leave
+
+
+-- store ah into flags
+
+sahf :: CodeGen e s ()
+sahf = ensureBufferSize x86_max_instruction_bytes >> x86_sahf
+
+-- Floating point instructions
+
+fldz = ensureBufferSize x86_max_instruction_bytes >> x86_fldz
+fld1 = ensureBufferSize x86_max_instruction_bytes >> x86_fld1
+fldpi = ensureBufferSize x86_max_instruction_bytes >> x86_fldpi
+
+fstsw = ensureBufferSize x86_max_instruction_bytes >> x86_fstsw
+fnstsw = ensureBufferSize x86_max_instruction_bytes >> x86_fstsw
+
+fcompp = ensureBufferSize x86_max_instruction_bytes >> x86_fcompp
+fucompp = ensureBufferSize x86_max_instruction_bytes >> x86_fucompp
+
+fchs = ensureBufferSize x86_max_instruction_bytes >> x86_fchs
+frem = ensureBufferSize x86_max_instruction_bytes >> x86_frem
+
+fxch (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fxch idx
+
+fcomi (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fcomi idx
+fcomip (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fcomip idx
+fucomi (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fucomi idx
+fucomip (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fucomip idx
+
+fsin = ensureBufferSize x86_max_instruction_bytes >> x86_fsin
+fcos = ensureBufferSize x86_max_instruction_bytes >> x86_fcos
+fptan = ensureBufferSize x86_max_instruction_bytes >> x86_fptan
+fpatan = ensureBufferSize x86_max_instruction_bytes >> x86_fpatan
+fabs = ensureBufferSize x86_max_instruction_bytes >> x86_fabs
+ftst = ensureBufferSize x86_max_instruction_bytes >> x86_ftst
+fxam = ensureBufferSize x86_max_instruction_bytes >> x86_fxam
+fprem = ensureBufferSize x86_max_instruction_bytes >> x86_fprem
+fprem1 = ensureBufferSize x86_max_instruction_bytes >> x86_fprem1
+frndint = ensureBufferSize x86_max_instruction_bytes >> x86_frndint
+fsqrt = ensureBufferSize x86_max_instruction_bytes >> x86_fsqrt
+
+class Fadd a b where
+ fadd :: a -> b -> CodeGen e s ()
+
+instance Fadd FPTopReg FPReg where
+ fadd FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fadd idx
+
+instance Fadd FPTopReg Addr where
+ fadd FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fadd a True
+
+instance Fadd FPTopReg (Disp, Reg32) where
+ fadd FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fadd r d True
+
+instance Fadd FPTopReg Ind where
+ fadd FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fadd r 0 True
+
+instance Fadd FPReg FPTopReg where
+ fadd (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fadd idx False
+
+
+class Faddp a b where
+ faddp :: a -> b -> CodeGen e s ()
+
+instance Faddp FPReg FPTopReg where
+ faddp (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fadd idx True
+
+
+class Fiadd a b where
+ fiadd32 :: a -> b -> CodeGen e s ()
+ fiadd16 :: a -> b -> CodeGen e s ()
+
+instance Fiadd FPTopReg (Disp, Reg32) where
+ fiadd32 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fadd r d True
+ fiadd16 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fadd r d False
+
+instance Fiadd FPTopReg Ind where
+ fiadd32 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fadd r 0 True
+ fiadd16 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fadd r 0 False
+
+
+class Fsub a b where
+ fsub :: a -> b -> CodeGen e s ()
+
+instance Fsub FPTopReg FPReg where
+ fsub FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fsub idx
+
+instance Fsub FPTopReg Addr where
+ fsub FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fsub a True
+
+instance Fsub FPTopReg (Disp, Reg32) where
+ fsub FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fsub r d True
+
+instance Fsub FPTopReg Ind where
+ fsub FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fsub r 0 True
+
+instance Fsub FPReg FPTopReg where
+ fsub (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fsub idx False
+
+
+class Fsubp a b where
+ fsubp :: a -> b -> CodeGen e s ()
+
+instance Fsubp FPReg FPTopReg where
+ fsubp (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fsub idx True
+
+
+class Fisub a b where
+ fisub32 :: a -> b -> CodeGen e s ()
+ fisub16 :: a -> b -> CodeGen e s ()
+
+instance Fisub FPTopReg (Disp, Reg32) where
+ fisub32 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fsub r d True
+ fisub16 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fsub r d False
+
+instance Fisub FPTopReg Ind where
+ fisub32 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fsub r 0 True
+ fisub16 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fsub r 0 False
+
+
+class Fsubr a b where
+ fsubr :: a -> b -> CodeGen e s ()
+
+instance Fsubr FPTopReg FPReg where
+ fsubr FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fsubr idx
+
+instance Fsubr FPTopReg Addr where
+ fsubr FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fsubr a True
+
+instance Fsubr FPTopReg (Disp, Reg32) where
+ fsubr FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fsubr r d True
+
+instance Fsubr FPTopReg Ind where
+ fsubr FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fsubr r 0 True
+
+
+class Fmul a b where
+ fmul :: a -> b -> CodeGen e s ()
+
+instance Fmul FPTopReg FPReg where
+ fmul FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fmul idx
+
+instance Fmul FPTopReg Addr where
+ fmul FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fmul a True
+
+instance Fmul FPTopReg (Disp, Reg32) where
+ fmul FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fmul r d True
+
+instance Fmul FPTopReg Ind where
+ fmul FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fmul r 0 True
+
+instance Fmul FPReg FPTopReg where
+ fmul (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fmul idx False
+
+
+class Fmulp a b where
+ fmulp :: a -> b -> CodeGen e s ()
+
+instance Fmulp FPReg FPTopReg where
+ fmulp (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fmul idx True
+
+
+class Fimul a b where
+ fimul32 :: a -> b -> CodeGen e s ()
+ fimul16 :: a -> b -> CodeGen e s ()
+
+instance Fimul FPTopReg (Disp, Reg32) where
+ fimul32 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fmul r d True
+ fimul16 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fmul r d False
+
+instance Fimul FPTopReg Ind where
+ fimul32 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fmul r 0 True
+ fimul16 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fmul r 0 False
+
+
+class Fdiv a b where
+ fdiv :: a -> b -> CodeGen e s ()
+
+instance Fdiv FPTopReg FPReg where
+ fdiv FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fdiv idx
+
+instance Fdiv FPTopReg Addr where
+ fdiv FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fdiv a True
+
+instance Fdiv FPTopReg (Disp, Reg32) where
+ fdiv FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fdiv r d True
+
+instance Fdiv FPTopReg Ind where
+ fdiv FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fdiv r 0 True
+
+instance Fdiv FPReg FPTopReg where
+ fdiv (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fdiv idx False
+
+
+class Fdivp a b where
+ fdivp :: a -> b -> CodeGen e s ()
+
+instance Fdivp FPReg FPTopReg where
+ fdivp (FPReg idx) FPTopReg = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_reg x86_fdiv idx True
+
+
+class Fidiv a b where
+ fidiv32 :: a -> b -> CodeGen e s ()
+ fidiv16 :: a -> b -> CodeGen e s ()
+
+instance Fidiv FPTopReg (Disp, Reg32) where
+ fidiv32 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fdiv r d True
+ fidiv16 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fdiv r d False
+
+instance Fidiv FPTopReg Ind where
+ fidiv32 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fdiv r 0 True
+ fidiv16 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_int_op_membase x86_fdiv r 0 False
+
+
+class Fdivr a b where
+ fdivr :: a -> b -> CodeGen e s ()
+
+instance Fdivr FPTopReg FPReg where
+ fdivr FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fdivr idx
+
+instance Fdivr FPTopReg Addr where
+ fdivr FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fdivr a True
+
+instance Fdivr FPTopReg (Disp, Reg32) where
+ fdivr FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fdivr r d True
+
+instance Fdivr FPTopReg Ind where
+ fdivr FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fdivr r 0 True
+
+
+class Fcom a b where
+ fcom :: a -> b -> CodeGen e s ()
+
+instance Fcom FPTopReg FPReg where
+ fcom FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fcom idx
+
+instance Fcom FPTopReg Addr where
+ fcom FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fcom a True
+
+instance Fcom FPTopReg (Disp, Reg32) where
+ fcom FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fcom r d True
+
+instance Fcom FPTopReg Ind where
+ fcom FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fcom r 0 True
+
+
+class Fcomp a b where
+ fcomp :: a -> b -> CodeGen e s ()
+
+instance Fcomp FPTopReg FPReg where
+ fcomp FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op x86_fcomp idx
+
+instance Fcomp FPTopReg Addr where
+ fcomp FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_mem x86_fcomp a True
+
+instance Fcomp FPTopReg (Disp, Reg32) where
+ fcomp FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fcomp r d True
+
+instance Fcomp FPTopReg Ind where
+ fcomp FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fp_op_membase x86_fcomp r 0 True
+
+
+class Fld a b where
+ fld :: a -> b -> CodeGen e s ()
+
+instance Fld FPTopReg FPReg where
+ fld FPTopReg (FPReg idx) = ensureBufferSize x86_max_instruction_bytes >> x86_fld_reg idx
+
+instance Fld FPTopReg Addr where
+ fld FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fld a True
+
+instance Fld FPTopReg (Disp, Reg32) where
+ fld FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fld_membase r d True
+
+instance Fld FPTopReg Ind where
+ fld FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fld_membase r 0 True
+
+class Fld80 a b where
+ fld80 :: a -> b -> CodeGen e s ()
+
+instance Fld80 FPTopReg Addr where
+ fld80 FPTopReg (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fld80_mem a
+
+instance Fld80 FPTopReg (Disp, Reg32) where
+ fld80 FPTopReg (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fld80_membase r d
+
+instance Fld80 FPTopReg Ind where
+ fld80 FPTopReg (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fld80_membase r 0
+
+class Fst a where
+ fst :: a -> CodeGen e s ()
+
+instance Fst Addr where
+ fst (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fst a True False
+
+instance Fst (Disp, Reg32) where
+ fst (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fst_membase r d True False
+
+instance Fst Ind where
+ fst (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fst_membase r 0 True False
+
+class Fstp a where
+ fstp :: a -> CodeGen e s ()
+
+instance Fstp FPReg where
+ fstp (FPReg r) = ensureBufferSize x86_max_instruction_bytes >> x86_fstp r
+
+instance Fstp Addr where
+ fstp (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fst a True True
+
+instance Fstp (Disp, Reg32) where
+ fstp (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fst_membase r d True True
+
+instance Fstp Ind where
+ fstp (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fst_membase r 0 True True
+
+
+class Fst80 a where
+ fst80 :: a -> CodeGen e s ()
+
+instance Fst80 Addr where
+ fst80 (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fst80_mem a
+
+instance Fst80 (Disp, Reg32) where
+ fst80 (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fst80_membase r d
+
+instance Fst80 Ind where
+ fst80 (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fst80_membase r 0
+
+
+class Fnstcw a where
+ fnstcw :: a -> CodeGen e s ()
+
+instance Fnstcw Addr where
+ fnstcw (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fnstcw a
+
+instance Fnstcw (Disp, Reg32) where
+ fnstcw (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fnstcw_membase r d
+
+instance Fnstcw Ind where
+ fnstcw (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fnstcw_membase r 0
+
+
+class Fldcw a where
+ fldcw :: a -> CodeGen e s ()
+
+instance Fldcw Addr where
+ fldcw (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fldcw a
+
+instance Fldcw (Disp, Reg32) where
+ fldcw (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fldcw_membase r d
+
+instance Fldcw Ind where
+ fldcw (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fldcw_membase r 0
+
+
+class Fild a where
+ fild :: a -> CodeGen e s ()
+
+instance Fild Addr where
+ fild (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fild a FInt32
+
+instance Fild (Disp, Reg32) where
+ fild (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fild_membase r d FInt32
+
+instance Fild Ind where
+ fild (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fild_membase r 0 FInt32
+
+
+class Fist a where
+ fist :: a -> CodeGen e s ()
+
+instance Fist (Disp, Reg32) where
+ fist (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fist_membase r d FInt32
+
+instance Fist Ind where
+ fist (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fist_membase r 0 FInt32
+
+
+class Fistp a where
+ fistp :: a -> CodeGen e s ()
+
+instance Fistp Addr where
+ fistp (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_fist_pop a FInt32
+
+instance Fistp (Disp, Reg32) where
+ fistp (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_fist_pop_membase r d FInt32
+
+instance Fistp Ind where
+ fistp (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_fist_pop_membase r 0 FInt32
+
+
+class Sqrtsd a b where
+ sqrtsd :: a -> b -> CodeGen e s ()
+
+instance Sqrtsd XMMReg XMMReg where
+ sqrtsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_reg x86_sse_sd xd xs
+
+instance Sqrtsd XMMReg Addr where
+ sqrtsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_mem x86_sse_sd xd a
+
+instance Sqrtsd XMMReg Ind where
+ sqrtsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_sd xd r 0
+
+instance Sqrtsd XMMReg (Disp, Reg32) where
+ sqrtsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_sd xd r d
+
+
+class Sqrtss a b where
+ sqrtss :: a -> b -> CodeGen e s ()
+
+instance Sqrtss XMMReg XMMReg where
+ sqrtss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_reg x86_sse_ss xd xs
+
+instance Sqrtss XMMReg Addr where
+ sqrtss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_mem x86_sse_ss xd a
+
+instance Sqrtss XMMReg Ind where
+ sqrtss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_ss xd r 0
+
+instance Sqrtss XMMReg (Disp, Reg32) where
+ sqrtss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_ss xd r d
+
+
+class Sqrtpd a b where
+ sqrtpd :: a -> b -> CodeGen e s ()
+
+instance Sqrtpd XMMReg XMMReg where
+ sqrtpd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_reg x86_sse_pd xd xs
+
+instance Sqrtpd XMMReg Addr where
+ sqrtpd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_mem x86_sse_pd xd a
+
+instance Sqrtpd XMMReg Ind where
+ sqrtpd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_pd xd r 0
+
+instance Sqrtpd XMMReg (Disp, Reg32) where
+ sqrtpd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_pd xd r d
+
+
+class Sqrtps a b where
+ sqrtps :: a -> b -> CodeGen e s ()
+
+instance Sqrtps XMMReg XMMReg where
+ sqrtps (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_reg x86_sse_ps xd xs
+
+instance Sqrtps XMMReg Addr where
+ sqrtps (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_mem x86_sse_ps xd a
+
+instance Sqrtps XMMReg Ind where
+ sqrtps (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_ps xd r 0
+
+instance Sqrtps XMMReg (Disp, Reg32) where
+ sqrtps (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sqrt_sse_reg_membase x86_sse_ps xd r d
+
+
+class Addsd a b where
+ addsd :: a -> b -> CodeGen e s ()
+
+instance Addsd XMMReg XMMReg where
+ addsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_reg x86_sse_sd xd xs
+
+instance Addsd XMMReg Addr where
+ addsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_mem x86_sse_sd xd a
+
+instance Addsd XMMReg Ind where
+ addsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_sd xd r 0
+
+instance Addsd XMMReg (Disp, Reg32) where
+ addsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_sd xd r d
+
+
+class Addss a b where
+ addss :: a -> b -> CodeGen e s ()
+
+instance Addss XMMReg XMMReg where
+ addss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_reg x86_sse_ss xd xs
+
+instance Addss XMMReg Addr where
+ addss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_mem x86_sse_ss xd a
+
+instance Addss XMMReg Ind where
+ addss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_ss xd r 0
+
+instance Addss XMMReg (Disp, Reg32) where
+ addss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_ss xd r d
+
+
+class Addpd a b where
+ addpd :: a -> b -> CodeGen e s ()
+
+instance Addpd XMMReg XMMReg where
+ addpd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_reg x86_sse_pd xd xs
+
+instance Addpd XMMReg Addr where
+ addpd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_mem x86_sse_pd xd a
+
+instance Addpd XMMReg Ind where
+ addpd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_pd xd r 0
+
+instance Addpd XMMReg (Disp, Reg32) where
+ addpd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_pd xd r d
+
+
+class Addps a b where
+ addps :: a -> b -> CodeGen e s ()
+
+instance Addps XMMReg XMMReg where
+ addps (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_reg x86_sse_ps xd xs
+
+instance Addps XMMReg Addr where
+ addps (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_mem x86_sse_ps xd a
+
+instance Addps XMMReg Ind where
+ addps (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_ps xd r 0
+
+instance Addps XMMReg (Disp, Reg32) where
+ addps (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_add_sse_reg_membase x86_sse_ps xd r d
+
+class Subsd a b where
+ subsd :: a -> b -> CodeGen e s ()
+
+instance Subsd XMMReg XMMReg where
+ subsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_reg x86_sse_sd xd xs
+
+instance Subsd XMMReg Addr where
+ subsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_mem x86_sse_sd xd a
+
+instance Subsd XMMReg Ind where
+ subsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_sd xd r 0
+
+instance Subsd XMMReg (Disp, Reg32) where
+ subsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_sd xd r d
+
+
+class Subss a b where
+ subss :: a -> b -> CodeGen e s ()
+
+instance Subss XMMReg XMMReg where
+ subss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_reg x86_sse_ss xd xs
+
+instance Subss XMMReg Addr where
+ subss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_mem x86_sse_ss xd a
+
+instance Subss XMMReg Ind where
+ subss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_ss xd r 0
+
+instance Subss XMMReg (Disp, Reg32) where
+ subss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_ss xd r d
+
+
+class Subpd a b where
+ subpd :: a -> b -> CodeGen e s ()
+
+instance Subpd XMMReg XMMReg where
+ subpd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_reg x86_sse_pd xd xs
+
+instance Subpd XMMReg Addr where
+ subpd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_mem x86_sse_pd xd a
+
+instance Subpd XMMReg Ind where
+ subpd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_pd xd r 0
+
+instance Subpd XMMReg (Disp, Reg32) where
+ subpd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_pd xd r d
+
+
+class Subps a b where
+ subps :: a -> b -> CodeGen e s ()
+
+instance Subps XMMReg XMMReg where
+ subps (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_reg x86_sse_ps xd xs
+
+instance Subps XMMReg Addr where
+ subps (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_mem x86_sse_ps xd a
+
+instance Subps XMMReg Ind where
+ subps (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_ps xd r 0
+
+instance Subps XMMReg (Disp, Reg32) where
+ subps (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_sub_sse_reg_membase x86_sse_ps xd r d
+
+class Mulsd a b where
+ mulsd :: a -> b -> CodeGen e s ()
+
+instance Mulsd XMMReg XMMReg where
+ mulsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_reg x86_sse_sd xd xs
+
+instance Mulsd XMMReg Addr where
+ mulsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_mem x86_sse_sd xd a
+
+instance Mulsd XMMReg Ind where
+ mulsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_sd xd r 0
+
+instance Mulsd XMMReg (Disp, Reg32) where
+ mulsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_sd xd r d
+
+
+class Mulss a b where
+ mulss :: a -> b -> CodeGen e s ()
+
+instance Mulss XMMReg XMMReg where
+ mulss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_reg x86_sse_ss xd xs
+
+instance Mulss XMMReg Addr where
+ mulss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_mem x86_sse_ss xd a
+
+instance Mulss XMMReg Ind where
+ mulss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_ss xd r 0
+
+instance Mulss XMMReg (Disp, Reg32) where
+ mulss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_ss xd r d
+
+
+class Mulpd a b where
+ mulpd :: a -> b -> CodeGen e s ()
+
+instance Mulpd XMMReg XMMReg where
+ mulpd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_reg x86_sse_pd xd xs
+
+instance Mulpd XMMReg Addr where
+ mulpd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_mem x86_sse_pd xd a
+
+instance Mulpd XMMReg Ind where
+ mulpd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_pd xd r 0
+
+instance Mulpd XMMReg (Disp, Reg32) where
+ mulpd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_pd xd r d
+
+
+class Mulps a b where
+ mulps :: a -> b -> CodeGen e s ()
+
+instance Mulps XMMReg XMMReg where
+ mulps (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_reg x86_sse_ps xd xs
+
+instance Mulps XMMReg Addr where
+ mulps (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_mem x86_sse_ps xd a
+
+instance Mulps XMMReg Ind where
+ mulps (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_ps xd r 0
+
+instance Mulps XMMReg (Disp, Reg32) where
+ mulps (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_mul_sse_reg_membase x86_sse_ps xd r d
+
+
+class Divsd a b where
+ divsd :: a -> b -> CodeGen e s ()
+
+instance Divsd XMMReg XMMReg where
+ divsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_reg x86_sse_sd xd xs
+
+instance Divsd XMMReg Addr where
+ divsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_mem x86_sse_sd xd a
+
+instance Divsd XMMReg Ind where
+ divsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_sd xd r 0
+
+instance Divsd XMMReg (Disp, Reg32) where
+ divsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_sd xd r d
+
+
+class Divss a b where
+ divss :: a -> b -> CodeGen e s ()
+
+instance Divss XMMReg XMMReg where
+ divss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_reg x86_sse_ss xd xs
+
+instance Divss XMMReg Addr where
+ divss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_mem x86_sse_ss xd a
+
+instance Divss XMMReg Ind where
+ divss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_ss xd r 0
+
+instance Divss XMMReg (Disp, Reg32) where
+ divss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_ss xd r d
+
+
+class Divpd a b where
+ divpd :: a -> b -> CodeGen e s ()
+
+instance Divpd XMMReg XMMReg where
+ divpd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_reg x86_sse_pd xd xs
+
+instance Divpd XMMReg Addr where
+ divpd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_mem x86_sse_pd xd a
+
+instance Divpd XMMReg Ind where
+ divpd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_pd xd r 0
+
+instance Divpd XMMReg (Disp, Reg32) where
+ divpd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_pd xd r d
+
+
+class Divps a b where
+ divps :: a -> b -> CodeGen e s ()
+
+instance Divps XMMReg XMMReg where
+ divps (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_reg x86_sse_ps xd xs
+
+instance Divps XMMReg Addr where
+ divps (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_mem x86_sse_ps xd a
+
+instance Divps XMMReg Ind where
+ divps (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_ps xd r 0
+
+instance Divps XMMReg (Disp, Reg32) where
+ divps (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_div_sse_reg_membase x86_sse_ps xd r d
+
+class Minsd a b where
+ minsd :: a -> b -> CodeGen e s ()
+
+instance Minsd XMMReg XMMReg where
+ minsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_reg x86_sse_sd xd xs
+
+instance Minsd XMMReg Addr where
+ minsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_mem x86_sse_sd xd a
+
+instance Minsd XMMReg Ind where
+ minsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_sd xd r 0
+
+instance Minsd XMMReg (Disp, Reg32) where
+ minsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_sd xd r d
+
+
+class Minss a b where
+ minss :: a -> b -> CodeGen e s ()
+
+instance Minss XMMReg XMMReg where
+ minss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_reg x86_sse_ss xd xs
+
+instance Minss XMMReg Addr where
+ minss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_mem x86_sse_ss xd a
+
+instance Minss XMMReg Ind where
+ minss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_ss xd r 0
+
+instance Minss XMMReg (Disp, Reg32) where
+ minss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_ss xd r d
+
+
+class Minpd a b where
+ minpd :: a -> b -> CodeGen e s ()
+
+instance Minpd XMMReg XMMReg where
+ minpd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_reg x86_sse_pd xd xs
+
+instance Minpd XMMReg Addr where
+ minpd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_mem x86_sse_pd xd a
+
+instance Minpd XMMReg Ind where
+ minpd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_pd xd r 0
+
+instance Minpd XMMReg (Disp, Reg32) where
+ minpd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_pd xd r d
+
+
+class Minps a b where
+ minps :: a -> b -> CodeGen e s ()
+
+instance Minps XMMReg XMMReg where
+ minps (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_reg x86_sse_ps xd xs
+
+instance Minps XMMReg Addr where
+ minps (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_mem x86_sse_ps xd a
+
+instance Minps XMMReg Ind where
+ minps (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_ps xd r 0
+
+instance Minps XMMReg (Disp, Reg32) where
+ minps (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_min_sse_reg_membase x86_sse_ps xd r d
+
+
+class Maxsd a b where
+ maxsd :: a -> b -> CodeGen e s ()
+
+instance Maxsd XMMReg XMMReg where
+ maxsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_reg x86_sse_sd xd xs
+
+instance Maxsd XMMReg Addr where
+ maxsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_mem x86_sse_sd xd a
+
+instance Maxsd XMMReg Ind where
+ maxsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_sd xd r 0
+
+instance Maxsd XMMReg (Disp, Reg32) where
+ maxsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_sd xd r d
+
+
+class Maxss a b where
+ maxss :: a -> b -> CodeGen e s ()
+
+instance Maxss XMMReg XMMReg where
+ maxss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_reg x86_sse_ss xd xs
+
+instance Maxss XMMReg Addr where
+ maxss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_mem x86_sse_ss xd a
+
+instance Maxss XMMReg Ind where
+ maxss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_ss xd r 0
+
+instance Maxss XMMReg (Disp, Reg32) where
+ maxss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_ss xd r d
+
+
+class Maxpd a b where
+ maxpd :: a -> b -> CodeGen e s ()
+
+instance Maxpd XMMReg XMMReg where
+ maxpd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_reg x86_sse_pd xd xs
+
+instance Maxpd XMMReg Addr where
+ maxpd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_mem x86_sse_pd xd a
+
+instance Maxpd XMMReg Ind where
+ maxpd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_pd xd r 0
+
+instance Maxpd XMMReg (Disp, Reg32) where
+ maxpd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_pd xd r d
+
+
+class Maxps a b where
+ maxps :: a -> b -> CodeGen e s ()
+
+instance Maxps XMMReg XMMReg where
+ maxps (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_reg x86_sse_ps xd xs
+
+instance Maxps XMMReg Addr where
+ maxps (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_mem x86_sse_ps xd a
+
+instance Maxps XMMReg Ind where
+ maxps (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_ps xd r 0
+
+instance Maxps XMMReg (Disp, Reg32) where
+ maxps (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_max_sse_reg_membase x86_sse_ps xd r d
+
+
+class Movss a b where
+ movss :: a -> b -> CodeGen e s ()
+
+instance Movss XMMReg XMMReg where
+ movss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_reg x86_sse_ss xd xs
+
+instance Movss XMMReg Addr where
+ movss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_mem x86_sse_ss xd a
+
+instance Movss Addr XMMReg where
+ movss (Addr a) (XMMReg xd) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_mem_reg x86_sse_ss a xd
+
+instance Movss XMMReg Ind where
+ movss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_membase x86_sse_ss xd r 0
+
+instance Movss Ind XMMReg where
+ movss (Ind (Reg32 r)) (XMMReg xd) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_membase_reg x86_sse_ss r 0 xd
+
+instance Movss XMMReg (Disp, Reg32) where
+ movss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_membase x86_sse_ss xd r d
+
+instance Movss (Disp, Reg32) XMMReg where
+ movss (Disp d, Reg32 r) (XMMReg xd) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_membase_reg x86_sse_ss r d xd
+
+
+class Movsd a b where
+ movsd :: a -> b -> CodeGen e s ()
+
+instance Movsd XMMReg XMMReg where
+ movsd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_reg x86_sse_sd xd xs
+
+instance Movsd XMMReg Addr where
+ movsd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_mem x86_sse_sd xd a
+
+instance Movsd Addr XMMReg where
+ movsd (Addr a) (XMMReg xd) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_mem_reg x86_sse_sd a xd
+
+instance Movsd XMMReg Ind where
+ movsd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_membase x86_sse_sd xd r 0
+
+instance Movsd Ind XMMReg where
+ movsd (Ind (Reg32 r)) (XMMReg xd) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_membase_reg x86_sse_sd r 0 xd
+
+instance Movsd XMMReg (Disp, Reg32) where
+ movsd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_reg_membase x86_sse_sd xd r d
+
+instance Movsd (Disp, Reg32) XMMReg where
+ movsd (Disp d, Reg32 r) (XMMReg xd) = ensureBufferSize x86_max_instruction_bytes >> x86_mov_sse_membase_reg x86_sse_sd r d xd
+
+
+class Movups a b where
+ movups :: a -> b -> CodeGen e s ()
+
+instance Movups XMMReg XMMReg where
+ movups (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movups_to_reg xd (xmmLocLowLevel xs)
+
+instance Movups XMMReg Addr where
+ movups (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movups_to_reg xd (xmmLocLowLevel xs)
+
+instance Movups Addr XMMReg where
+ movups xd (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_movups_from_reg xs (xmmLocLowLevel xd)
+
+instance Movups XMMReg Ind where
+ movups (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movups_to_reg xd (xmmLocLowLevel xs)
+
+instance Movups Ind XMMReg where
+ movups xd (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_movups_from_reg xs (xmmLocLowLevel xd)
+
+instance Movups XMMReg (Disp, Reg32) where
+ movups (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movups_to_reg xd (xmmLocLowLevel xs)
+
+instance Movups (Disp, Reg32) XMMReg where
+ movups xd (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_movups_from_reg xs (xmmLocLowLevel xd)
+
+
+class Movlps a b where
+ movlps :: a -> b -> CodeGen e s ()
+
+instance Movlps XMMReg XMMReg where
+ movlps (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movlps_to_reg xd (xmmLocLowLevel xs)
+
+instance Movlps XMMReg Addr where
+ movlps (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movlps_to_reg xd (xmmLocLowLevel xs)
+
+instance Movlps Addr XMMReg where
+ movlps xd (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_movlps_from_reg xs (xmmLocLowLevel xd)
+
+instance Movlps XMMReg Ind where
+ movlps (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movlps_to_reg xd (xmmLocLowLevel xs)
+
+instance Movlps Ind XMMReg where
+ movlps xd (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_movlps_from_reg xs (xmmLocLowLevel xd)
+
+instance Movlps XMMReg (Disp, Reg32) where
+ movlps (XMMReg xd) xs = ensureBufferSize x86_max_instruction_bytes >> x86_movlps_to_reg xd (xmmLocLowLevel xs)
+
+instance Movlps (Disp, Reg32) XMMReg where
+ movlps xd (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_movlps_from_reg xs (xmmLocLowLevel xd)
+
+
+class Comisd a b where
+ comisd :: a -> b -> CodeGen e s ()
+
+instance Comisd XMMReg XMMReg where
+ comisd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_comisd_reg_reg xd xs
+
+instance Comisd XMMReg Addr where
+ comisd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_comisd_reg_mem xd a
+
+instance Comisd XMMReg Ind where
+ comisd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_comisd_reg_membase xd r 0
+
+instance Comisd XMMReg (Disp, Reg32) where
+ comisd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_comisd_reg_membase xd r d
+
+
+class Comiss a b where
+ comiss :: a -> b -> CodeGen e s ()
+
+instance Comiss XMMReg XMMReg where
+ comiss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_comiss_reg_reg xd xs
+
+instance Comiss XMMReg Addr where
+ comiss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_comiss_reg_mem xd a
+
+instance Comiss XMMReg Ind where
+ comiss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_comiss_reg_membase xd r 0
+
+instance Comiss XMMReg (Disp, Reg32) where
+ comiss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_comiss_reg_membase xd r d
+
+
+class Ucomisd a b where
+ ucomisd :: a -> b -> CodeGen e s ()
+
+instance Ucomisd XMMReg XMMReg where
+ ucomisd (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomisd_reg_reg xd xs
+
+instance Ucomisd XMMReg Addr where
+ ucomisd (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomisd_reg_mem xd a
+
+instance Ucomisd XMMReg Ind where
+ ucomisd (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomisd_reg_membase xd r 0
+
+instance Ucomisd XMMReg (Disp, Reg32) where
+ ucomisd (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomisd_reg_membase xd r d
+
+
+class Ucomiss a b where
+ ucomiss :: a -> b -> CodeGen e s ()
+
+instance Ucomiss XMMReg XMMReg where
+ ucomiss (XMMReg xd) (XMMReg xs) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomiss_reg_reg xd xs
+
+instance Ucomiss XMMReg Addr where
+ ucomiss (XMMReg xd) (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomiss_reg_mem xd a
+
+instance Ucomiss XMMReg Ind where
+ ucomiss (XMMReg xd) (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomiss_reg_membase xd r 0
+
+instance Ucomiss XMMReg (Disp, Reg32) where
+ ucomiss (XMMReg xd) (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_ucomiss_reg_membase xd r d
+
+
+class XMMLocation b => XMMLoc a b | a -> b where
+ xmmLocLowLevel :: a -> b
+
+instance XMMLoc XMMReg XMMReg where
+ xmmLocLowLevel = id
+
+instance XMMLoc Addr Mem where
+ xmmLocLowLevel (Addr a) = Mem a
+
+instance XMMLoc Ind MemBase where
+ xmmLocLowLevel (Ind (Reg32 r)) = MemBase r 0
+
+instance XMMLoc (Disp, Reg32) MemBase where
+ xmmLocLowLevel (Disp d, Reg32 r) = MemBase r d
+
+
+haddps :: XMMLoc xmm a => XMMReg -> xmm -> CodeGen e s ()
+haddps (XMMReg dreg) reg =
+ x86_haddps dreg (xmmLocLowLevel reg)
+
+haddpd :: XMMLoc xmm a => XMMReg -> xmm -> CodeGen e s ()
+haddpd (XMMReg dreg) reg =
+ x86_haddpd dreg (xmmLocLowLevel reg)
+
+
+shufps :: XMMLoc xmm a => XMMReg -> xmm -> Word8 -> CodeGen e s ()
+shufps (XMMReg dreg) reg src =
+ x86_shufps dreg (xmmLocLowLevel reg) src
+
+shufpd :: XMMLoc xmm a => XMMReg -> xmm -> Word8 -> CodeGen e s ()
+shufpd (XMMReg dreg) reg src =
+ x86_shufpd dreg (xmmLocLowLevel reg) src
+
+
+cvtdq2ps :: XMMLoc xmm a => XMMReg -> xmm -> CodeGen e s ()
+cvtdq2ps (XMMReg dreg) reg =
+ x86_cvtdq2ps dreg (xmmLocLowLevel reg)
+
+cvttps2dq :: XMMLoc xmm a => XMMReg -> xmm -> CodeGen e s ()
+cvttps2dq (XMMReg dreg) reg =
+ x86_cvttps2dq dreg (xmmLocLowLevel reg)
+
+
+class Prefetchnta a where
+ prefetchnta :: a -> CodeGen e s ()
+
+instance Prefetchnta Addr where
+ prefetchnta (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetchnta_mem a
+
+instance Prefetchnta (Disp, Reg32) where
+ prefetchnta (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetchnta_membase r d
+
+instance Prefetchnta Ind where
+ prefetchnta (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetchnta_regp r
+
+class Prefetch0 a where
+ prefetch0 :: a -> CodeGen e s ()
+
+instance Prefetch0 Addr where
+ prefetch0 (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch0_mem a
+
+instance Prefetch0 (Disp, Reg32) where
+ prefetch0 (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch0_membase r d
+
+instance Prefetch0 Ind where
+ prefetch0 (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch0_regp r
+
+class Prefetch1 a where
+ prefetch1 :: a -> CodeGen e s ()
+
+instance Prefetch1 Addr where
+ prefetch1 (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch1_mem a
+
+instance Prefetch1 (Disp, Reg32) where
+ prefetch1 (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch1_membase r d
+
+instance Prefetch1 Ind where
+ prefetch1 (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch1_regp r
+
+class Prefetch2 a where
+ prefetch2 :: a -> CodeGen e s ()
+
+instance Prefetch2 Addr where
+ prefetch2 (Addr a) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch2_mem a
+
+instance Prefetch2 (Disp, Reg32) where
+ prefetch2 (Disp d, Reg32 r) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch2_membase r d
+
+instance Prefetch2 Ind where
+ prefetch2 (Ind (Reg32 r)) = ensureBufferSize x86_max_instruction_bytes >> x86_prefetch2_regp r
+
+
+ptrToWord32 :: Ptr a -> Word32
+ptrToWord32 = fromIntegral . ptrToIntPtr
+
+ptrToInt :: Ptr a -> Int
+ptrToInt = fromIntegral . ptrToIntPtr