packages feed

bindings-bfd-1.2.0.0: src/Bindings/Bfd/Disasm/I386/Register.hs

module Bindings.Bfd.Disasm.I386.Register where


data Register  = X Char Int Int
               | I Char Int Int
               | N Int  Int Int
               | P Char Int Int
               | Q      Int Int
               | F Int
               | Z Int  Int Int
               | S Char
               | C [Register]
     deriving (Eq, Ord, Show)


toRegister
   :: String
   -> Register
toRegister "ah"     = X 'a' 8  15
toRegister "al"     = X 'a' 0   7
toRegister "ax"     = X 'a' 0  15
toRegister "bh"     = X 'b' 8  15
toRegister "bl"     = X 'b' 0   7
toRegister "bp"     = P 'b' 0  15
toRegister "bpl"    = P 'b' 0   7
toRegister "bx"     = X 'b' 0  15
toRegister "ch"     = X 'c' 8  15
toRegister "cl"     = X 'c' 0   7
toRegister "cx"     = X 'c' 0  15
toRegister "dh"     = X 'd' 8  15
toRegister "di"     = I 'd' 0  15
toRegister "dil"    = I 'd' 0   7
toRegister "dl"     = X 'd' 0   7
toRegister "ds"     = S 'd'
toRegister "dx"     = X 'd' 0  15
toRegister "dxax"   = C [(X 'd' 0 15), (X 'a' 0 15)]
toRegister "eax"    = X 'a' 0  31
toRegister "ebp"    = P 'b' 0  31
toRegister "ebx"    = X 'b' 0  31
toRegister "ecx"    = X 'c' 0  31
toRegister "edi"    = I 'd' 0  31
toRegister "edx"    = X 'd' 0  31
toRegister "edxeax" = C [(X 'd' 0 31), (X 'a' 0 31)]
toRegister "es"     = S 'e'
toRegister "esi"    = I 's' 0  31
toRegister "fs"     = S 'f'
toRegister "r8"     = N  8  0  63
toRegister "r8b"    = N  8  0   7
toRegister "r8d"    = N  8  0  31
toRegister "r8w"    = N  8  0  15
toRegister "r9"     = N  9  0  63
toRegister "r9b"    = N  9  0   7
toRegister "r9d"    = N  9  0  31
toRegister "r9w"    = N  9  0  15
toRegister "r10"    = N 10  0  63
toRegister "r10b"   = N 10  0   7
toRegister "r10d"   = N 10  0  31
toRegister "r10w"   = N 10  0  15
toRegister "r11"    = N 11  0  63
toRegister "r11b"   = N 11  0   7
toRegister "r11d"   = N 11  0  31
toRegister "r11w"   = N 11  0  15
toRegister "r12"    = N 12  0  63
toRegister "r12b"   = N 12  0   7
toRegister "r12d"   = N 12  0  31
toRegister "r12w"   = N 12  0  15
toRegister "r13"    = N 13  0  63
toRegister "r13b"   = N 13  0   7
toRegister "r13d"   = N 13  0  31
toRegister "r13w"   = N 13  0  15
toRegister "r14"    = N 14  0  63
toRegister "r14b"   = N 14  0   7
toRegister "r14d"   = N 14  0  31
toRegister "r14w"   = N 14  0  15
toRegister "r15"    = N 15  0  63
toRegister "r15b"   = N 15  0   7
toRegister "r15d"   = N 15  0  31
toRegister "r15w"   = N 15  0  15
toRegister "rax"    = X 'a' 0  63
toRegister "rbp"    = P 'b' 0  63
toRegister "rbx"    = X 'b' 0  63
toRegister "rcx"    = X 'c' 0  63
toRegister "rdi"    = I 'd' 0  63
toRegister "rdx"    = X 'd' 0  63
toRegister "rdxrax" = C [X 'd' 0 63, X 'a' 0 63]
toRegister "rip"    = Q     0  63
toRegister "rsi"    = I 's' 0  63
toRegister "rsp"    = P 's' 0  63
toRegister "si"     = I 's' 0  15
toRegister "sil"    = I 's' 0   7
toRegister "st"     = F (-1)
toRegister "st(0)"  = F  0
toRegister "st(1)"  = F  1
toRegister "xmm0"   = Z  0  0 127
toRegister "xmm1"   = Z  1  0 127
toRegister "xmm2"   = Z  2  0 127
toRegister "xmm3"   = Z  3  0 127
toRegister "xmm4"   = Z  4  0 127
toRegister "xmm5"   = Z  5  0 127
toRegister "xmm6"   = Z  6  0 127
toRegister "xmm7"   = Z  7  0 127
toRegister "xmm8"   = Z  8  0 127
toRegister "xmm9"   = Z  9  0 127
toRegister "xmm10"  = Z 10  0 127
toRegister "xmm11"  = Z 11  0 127
toRegister "xmm12"  = Z 12  0 127
toRegister "xmm13"  = Z 13  0 127
toRegister "xmm14"  = Z 14  0 127
toRegister "xmm15"  = Z 15  0 127
toRegister r        = error $ "Register.toRegister: " ++ r

size
   :: Register
   -> Int
size (X _ a b) = b - a + 1
size (I _ a b) = b - a + 1
size (N _ a b) = b - a + 1
size (P _ a b) = b - a + 1
size (F _) = 80
size (Z _ a b) = b - a + 1 
size (S _) = 16
size x = error $ "Register.size: " ++ show x

restrictBits
   :: Int
   -> Int
   -> Register
   -> Register
restrictBits a b (X r _ _) = X r a b
restrictBits a b (Z r _ _) = Z r a b
restrictBits _ _ r         = error $ "Register.restrictBits: " ++ show r