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