-- GENERATED by C->Haskell Compiler, version 0.28.1 Switcheroo, 1 April 2016 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Hapstone/Internal/XCore.chs" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-|
Module      : Hapstone.Internal.XCore
Description : XCore architecture header ported using C2HS + some boilerplate
Copyright   : (c) Inokentiy Babushkin, 2016
License     : BSD3
Maintainer  : Inokentiy Babushkin <inokentiy.babushkin@googlemail.com>
Stability   : experimental

This module contains XCore specific datatypes and their respective Storable
instances. Most of the types are used internally and can be looked up here.
Some of them are currently unused, as the headers only define them as symbolic
constants whose type is never used explicitly, which poses a problem for a
memory-safe port to the Haskell language, this is about to get fixed in a
future version.

Apart from that, because the module is generated using C2HS, some of the
documentation is misplaced or rendered incorrectly, so if in doubt, read the
source file.
-}
module Hapstone.Internal.XCore where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Storable as C2HSImp






{-# LINE 25 "src/Hapstone/Internal/XCore.chs" #-}


import Foreign
import Foreign.C.Types

-- | operand type for instruction's operands
data XCoreOpType = XcoreOpInvalid
                 | XcoreOpReg
                 | XcoreOpImm
                 | XcoreOpMem
  deriving (Show,Eq,Bounded)
instance Enum XCoreOpType where
  succ XcoreOpInvalid = XcoreOpReg
  succ XcoreOpReg = XcoreOpImm
  succ XcoreOpImm = XcoreOpMem
  succ XcoreOpMem = error "XCoreOpType.succ: XcoreOpMem has no successor"

  pred XcoreOpReg = XcoreOpInvalid
  pred XcoreOpImm = XcoreOpReg
  pred XcoreOpMem = XcoreOpImm
  pred XcoreOpInvalid = error "XCoreOpType.pred: XcoreOpInvalid has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from XcoreOpMem

  fromEnum XcoreOpInvalid = 0
  fromEnum XcoreOpReg = 1
  fromEnum XcoreOpImm = 2
  fromEnum XcoreOpMem = 3

  toEnum 0 = XcoreOpInvalid
  toEnum 1 = XcoreOpReg
  toEnum 2 = XcoreOpImm
  toEnum 3 = XcoreOpMem
  toEnum unmatched = error ("XCoreOpType.toEnum: Cannot match " ++ show unmatched)

{-# LINE 32 "src/Hapstone/Internal/XCore.chs" #-}


-- | XCore registers
data XCoreReg = XcoreRegInvalid
              | XcoreRegCp
              | XcoreRegDp
              | XcoreRegLr
              | XcoreRegSp
              | XcoreRegR0
              | XcoreRegR1
              | XcoreRegR2
              | XcoreRegR3
              | XcoreRegR4
              | XcoreRegR5
              | XcoreRegR6
              | XcoreRegR7
              | XcoreRegR8
              | XcoreRegR9
              | XcoreRegR10
              | XcoreRegR11
              | XcoreRegPc
              | XcoreRegScp
              | XcoreRegSsr
              | XcoreRegEt
              | XcoreRegEd
              | XcoreRegSed
              | XcoreRegKep
              | XcoreRegKsp
              | XcoreRegId
              | XcoreRegEnding
  deriving (Show,Eq,Bounded)
instance Enum XCoreReg where
  succ XcoreRegInvalid = XcoreRegCp
  succ XcoreRegCp = XcoreRegDp
  succ XcoreRegDp = XcoreRegLr
  succ XcoreRegLr = XcoreRegSp
  succ XcoreRegSp = XcoreRegR0
  succ XcoreRegR0 = XcoreRegR1
  succ XcoreRegR1 = XcoreRegR2
  succ XcoreRegR2 = XcoreRegR3
  succ XcoreRegR3 = XcoreRegR4
  succ XcoreRegR4 = XcoreRegR5
  succ XcoreRegR5 = XcoreRegR6
  succ XcoreRegR6 = XcoreRegR7
  succ XcoreRegR7 = XcoreRegR8
  succ XcoreRegR8 = XcoreRegR9
  succ XcoreRegR9 = XcoreRegR10
  succ XcoreRegR10 = XcoreRegR11
  succ XcoreRegR11 = XcoreRegPc
  succ XcoreRegPc = XcoreRegScp
  succ XcoreRegScp = XcoreRegSsr
  succ XcoreRegSsr = XcoreRegEt
  succ XcoreRegEt = XcoreRegEd
  succ XcoreRegEd = XcoreRegSed
  succ XcoreRegSed = XcoreRegKep
  succ XcoreRegKep = XcoreRegKsp
  succ XcoreRegKsp = XcoreRegId
  succ XcoreRegId = XcoreRegEnding
  succ XcoreRegEnding = error "XCoreReg.succ: XcoreRegEnding has no successor"

  pred XcoreRegCp = XcoreRegInvalid
  pred XcoreRegDp = XcoreRegCp
  pred XcoreRegLr = XcoreRegDp
  pred XcoreRegSp = XcoreRegLr
  pred XcoreRegR0 = XcoreRegSp
  pred XcoreRegR1 = XcoreRegR0
  pred XcoreRegR2 = XcoreRegR1
  pred XcoreRegR3 = XcoreRegR2
  pred XcoreRegR4 = XcoreRegR3
  pred XcoreRegR5 = XcoreRegR4
  pred XcoreRegR6 = XcoreRegR5
  pred XcoreRegR7 = XcoreRegR6
  pred XcoreRegR8 = XcoreRegR7
  pred XcoreRegR9 = XcoreRegR8
  pred XcoreRegR10 = XcoreRegR9
  pred XcoreRegR11 = XcoreRegR10
  pred XcoreRegPc = XcoreRegR11
  pred XcoreRegScp = XcoreRegPc
  pred XcoreRegSsr = XcoreRegScp
  pred XcoreRegEt = XcoreRegSsr
  pred XcoreRegEd = XcoreRegEt
  pred XcoreRegSed = XcoreRegEd
  pred XcoreRegKep = XcoreRegSed
  pred XcoreRegKsp = XcoreRegKep
  pred XcoreRegId = XcoreRegKsp
  pred XcoreRegEnding = XcoreRegId
  pred XcoreRegInvalid = error "XCoreReg.pred: XcoreRegInvalid has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from XcoreRegEnding

  fromEnum XcoreRegInvalid = 0
  fromEnum XcoreRegCp = 1
  fromEnum XcoreRegDp = 2
  fromEnum XcoreRegLr = 3
  fromEnum XcoreRegSp = 4
  fromEnum XcoreRegR0 = 5
  fromEnum XcoreRegR1 = 6
  fromEnum XcoreRegR2 = 7
  fromEnum XcoreRegR3 = 8
  fromEnum XcoreRegR4 = 9
  fromEnum XcoreRegR5 = 10
  fromEnum XcoreRegR6 = 11
  fromEnum XcoreRegR7 = 12
  fromEnum XcoreRegR8 = 13
  fromEnum XcoreRegR9 = 14
  fromEnum XcoreRegR10 = 15
  fromEnum XcoreRegR11 = 16
  fromEnum XcoreRegPc = 17
  fromEnum XcoreRegScp = 18
  fromEnum XcoreRegSsr = 19
  fromEnum XcoreRegEt = 20
  fromEnum XcoreRegEd = 21
  fromEnum XcoreRegSed = 22
  fromEnum XcoreRegKep = 23
  fromEnum XcoreRegKsp = 24
  fromEnum XcoreRegId = 25
  fromEnum XcoreRegEnding = 26

  toEnum 0 = XcoreRegInvalid
  toEnum 1 = XcoreRegCp
  toEnum 2 = XcoreRegDp
  toEnum 3 = XcoreRegLr
  toEnum 4 = XcoreRegSp
  toEnum 5 = XcoreRegR0
  toEnum 6 = XcoreRegR1
  toEnum 7 = XcoreRegR2
  toEnum 8 = XcoreRegR3
  toEnum 9 = XcoreRegR4
  toEnum 10 = XcoreRegR5
  toEnum 11 = XcoreRegR6
  toEnum 12 = XcoreRegR7
  toEnum 13 = XcoreRegR8
  toEnum 14 = XcoreRegR9
  toEnum 15 = XcoreRegR10
  toEnum 16 = XcoreRegR11
  toEnum 17 = XcoreRegPc
  toEnum 18 = XcoreRegScp
  toEnum 19 = XcoreRegSsr
  toEnum 20 = XcoreRegEt
  toEnum 21 = XcoreRegEd
  toEnum 22 = XcoreRegSed
  toEnum 23 = XcoreRegKep
  toEnum 24 = XcoreRegKsp
  toEnum 25 = XcoreRegId
  toEnum 26 = XcoreRegEnding
  toEnum unmatched = error ("XCoreReg.toEnum: Cannot match " ++ show unmatched)

{-# LINE 36 "src/Hapstone/Internal/XCore.chs" #-}


-- | memory access operands
-- associated with 'XcoreOpMem' operand type
data XCoreOpMemStruct = XCoreOpMemStruct
    { base :: Word8 -- ^ base register
    , index :: Word8 -- ^ index register
    , disp :: Int32 -- ^ displacement/offset value
    , direct :: Int32 -- ^ +1: forward, -1: backward
    } deriving (Show, Eq)

instance Storable XCoreOpMemStruct where
    sizeOf _ = 12
{-# LINE 48 "src/Hapstone/Internal/XCore.chs" #-}

    alignment _ = 4
{-# LINE 49 "src/Hapstone/Internal/XCore.chs" #-}

    peek p = XCoreOpMemStruct
        <$> (fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CUChar}) p)
        <*> (fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 1 :: IO C2HSImp.CUChar}) p)
        <*> (fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 4 :: IO C2HSImp.CInt}) p)
        <*> (fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CInt}) p)
    poke p (XCoreOpMemStruct b i disp dir) = do
        (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: C2HSImp.CUChar)}) p (fromIntegral b)
        (\ptr val -> do {C2HSImp.pokeByteOff ptr 1 (val :: C2HSImp.CUChar)}) p (fromIntegral i)
        (\ptr val -> do {C2HSImp.pokeByteOff ptr 4 (val :: C2HSImp.CInt)}) p (fromIntegral disp)
        (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: C2HSImp.CInt)}) p (fromIntegral dir)

-- | instruction operand
data CsXCoreOp
    = Reg XCoreReg -- ^ register value for 'XcoreOpReg' operands
    | Imm Int32 -- ^ immediate value for 'XcoreOpImm' operands
    | Mem XCoreOpMemStruct -- ^ base/index/disp/direct value for 'XcoreOpMem'
                           -- operands
    | Undefined -- ^ invalid operand value, for 'XcoreOpInvalid' operand
    deriving (Show, Eq)

instance Storable CsXCoreOp where
    sizeOf _ = 16
    alignment _ = 4
    peek p = do
        t <- fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CInt}) p
        let bP = plusPtr p 4
        case toEnum t of
          XcoreOpReg -> (Reg . toEnum . fromIntegral) <$> (peek bP :: IO Int32)
          XcoreOpImm -> Imm <$> peek bP
          XcoreOpMem -> Mem <$> peek bP
          _ -> return Undefined
    poke p op = do
        let bP = plusPtr p 4
            setType = (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: C2HSImp.CInt)}) p . fromIntegral . fromEnum
        case op of
          Reg r -> do poke bP (fromIntegral $ fromEnum r :: Int32)
                      setType XcoreOpReg
          Imm i -> poke bP i >> setType XcoreOpImm
          Mem m -> poke bP m >> setType XcoreOpMem
          _ -> setType XcoreOpInvalid

-- | instruction datatype
newtype CsXCore = CsXCore [CsXCoreOp] -- ^ operand list of this instruction,
                                      -- *MUST* have <= 8 operands, else you'll
                                      -- get a runtime error when you
                                      -- (implicitly) try to write it to memory
                                      -- via it's Storable instance
    deriving (Show, Eq)

instance Storable CsXCore where
    sizeOf _ = 132
    alignment _ = 4
    peek p = do
        num <- fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CUChar}) p
        CsXCore <$> peekArray num (plusPtr p (4))
    poke p (CsXCore o) = do
        (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: C2HSImp.CUChar)}) p (fromIntegral $ length o)
        if length o > 8
           then error "operands overflew 8 elements"
           else pokeArray (plusPtr p (4)) o

-- | XCore instructions
data XCoreInsn = XcoreInsInvalid
               | XcoreInsAdd
               | XcoreInsAndnot
               | XcoreInsAnd
               | XcoreInsAshr
               | XcoreInsBau
               | XcoreInsBitrev
               | XcoreInsBla
               | XcoreInsBlat
               | XcoreInsBl
               | XcoreInsBf
               | XcoreInsBt
               | XcoreInsBu
               | XcoreInsBru
               | XcoreInsByterev
               | XcoreInsChkct
               | XcoreInsClre
               | XcoreInsClrpt
               | XcoreInsClrsr
               | XcoreInsClz
               | XcoreInsCrc8
               | XcoreInsCrc32
               | XcoreInsDcall
               | XcoreInsDentsp
               | XcoreInsDgetreg
               | XcoreInsDivs
               | XcoreInsDivu
               | XcoreInsDrestsp
               | XcoreInsDret
               | XcoreInsEcallf
               | XcoreInsEcallt
               | XcoreInsEdu
               | XcoreInsEef
               | XcoreInsEet
               | XcoreInsEeu
               | XcoreInsEndin
               | XcoreInsEntsp
               | XcoreInsEq
               | XcoreInsExtdp
               | XcoreInsExtsp
               | XcoreInsFreer
               | XcoreInsFreet
               | XcoreInsGetd
               | XcoreInsGet
               | XcoreInsGetn
               | XcoreInsGetr
               | XcoreInsGetsr
               | XcoreInsGetst
               | XcoreInsGetts
               | XcoreInsInct
               | XcoreInsInit
               | XcoreInsInpw
               | XcoreInsInshr
               | XcoreInsInt
               | XcoreInsIn
               | XcoreInsKcall
               | XcoreInsKentsp
               | XcoreInsKrestsp
               | XcoreInsKret
               | XcoreInsLadd
               | XcoreInsLd16s
               | XcoreInsLd8u
               | XcoreInsLda16
               | XcoreInsLdap
               | XcoreInsLdaw
               | XcoreInsLdc
               | XcoreInsLdw
               | XcoreInsLdivu
               | XcoreInsLmul
               | XcoreInsLss
               | XcoreInsLsub
               | XcoreInsLsu
               | XcoreInsMaccs
               | XcoreInsMaccu
               | XcoreInsMjoin
               | XcoreInsMkmsk
               | XcoreInsMsync
               | XcoreInsMul
               | XcoreInsNeg
               | XcoreInsNot
               | XcoreInsOr
               | XcoreInsOutct
               | XcoreInsOutpw
               | XcoreInsOutshr
               | XcoreInsOutt
               | XcoreInsOut
               | XcoreInsPeek
               | XcoreInsRems
               | XcoreInsRemu
               | XcoreInsRetsp
               | XcoreInsSetclk
               | XcoreInsSet
               | XcoreInsSetc
               | XcoreInsSetd
               | XcoreInsSetev
               | XcoreInsSetn
               | XcoreInsSetpsc
               | XcoreInsSetpt
               | XcoreInsSetrdy
               | XcoreInsSetsr
               | XcoreInsSettw
               | XcoreInsSetv
               | XcoreInsSext
               | XcoreInsShl
               | XcoreInsShr
               | XcoreInsSsync
               | XcoreInsSt16
               | XcoreInsSt8
               | XcoreInsStw
               | XcoreInsSub
               | XcoreInsSyncr
               | XcoreInsTestct
               | XcoreInsTestlcl
               | XcoreInsTestwct
               | XcoreInsTsetmr
               | XcoreInsStart
               | XcoreInsWaitef
               | XcoreInsWaitet
               | XcoreInsWaiteu
               | XcoreInsXor
               | XcoreInsZext
               | XcoreInsEnding
  deriving (Show,Eq,Bounded)
instance Enum XCoreInsn where
  succ XcoreInsInvalid = XcoreInsAdd
  succ XcoreInsAdd = XcoreInsAndnot
  succ XcoreInsAndnot = XcoreInsAnd
  succ XcoreInsAnd = XcoreInsAshr
  succ XcoreInsAshr = XcoreInsBau
  succ XcoreInsBau = XcoreInsBitrev
  succ XcoreInsBitrev = XcoreInsBla
  succ XcoreInsBla = XcoreInsBlat
  succ XcoreInsBlat = XcoreInsBl
  succ XcoreInsBl = XcoreInsBf
  succ XcoreInsBf = XcoreInsBt
  succ XcoreInsBt = XcoreInsBu
  succ XcoreInsBu = XcoreInsBru
  succ XcoreInsBru = XcoreInsByterev
  succ XcoreInsByterev = XcoreInsChkct
  succ XcoreInsChkct = XcoreInsClre
  succ XcoreInsClre = XcoreInsClrpt
  succ XcoreInsClrpt = XcoreInsClrsr
  succ XcoreInsClrsr = XcoreInsClz
  succ XcoreInsClz = XcoreInsCrc8
  succ XcoreInsCrc8 = XcoreInsCrc32
  succ XcoreInsCrc32 = XcoreInsDcall
  succ XcoreInsDcall = XcoreInsDentsp
  succ XcoreInsDentsp = XcoreInsDgetreg
  succ XcoreInsDgetreg = XcoreInsDivs
  succ XcoreInsDivs = XcoreInsDivu
  succ XcoreInsDivu = XcoreInsDrestsp
  succ XcoreInsDrestsp = XcoreInsDret
  succ XcoreInsDret = XcoreInsEcallf
  succ XcoreInsEcallf = XcoreInsEcallt
  succ XcoreInsEcallt = XcoreInsEdu
  succ XcoreInsEdu = XcoreInsEef
  succ XcoreInsEef = XcoreInsEet
  succ XcoreInsEet = XcoreInsEeu
  succ XcoreInsEeu = XcoreInsEndin
  succ XcoreInsEndin = XcoreInsEntsp
  succ XcoreInsEntsp = XcoreInsEq
  succ XcoreInsEq = XcoreInsExtdp
  succ XcoreInsExtdp = XcoreInsExtsp
  succ XcoreInsExtsp = XcoreInsFreer
  succ XcoreInsFreer = XcoreInsFreet
  succ XcoreInsFreet = XcoreInsGetd
  succ XcoreInsGetd = XcoreInsGet
  succ XcoreInsGet = XcoreInsGetn
  succ XcoreInsGetn = XcoreInsGetr
  succ XcoreInsGetr = XcoreInsGetsr
  succ XcoreInsGetsr = XcoreInsGetst
  succ XcoreInsGetst = XcoreInsGetts
  succ XcoreInsGetts = XcoreInsInct
  succ XcoreInsInct = XcoreInsInit
  succ XcoreInsInit = XcoreInsInpw
  succ XcoreInsInpw = XcoreInsInshr
  succ XcoreInsInshr = XcoreInsInt
  succ XcoreInsInt = XcoreInsIn
  succ XcoreInsIn = XcoreInsKcall
  succ XcoreInsKcall = XcoreInsKentsp
  succ XcoreInsKentsp = XcoreInsKrestsp
  succ XcoreInsKrestsp = XcoreInsKret
  succ XcoreInsKret = XcoreInsLadd
  succ XcoreInsLadd = XcoreInsLd16s
  succ XcoreInsLd16s = XcoreInsLd8u
  succ XcoreInsLd8u = XcoreInsLda16
  succ XcoreInsLda16 = XcoreInsLdap
  succ XcoreInsLdap = XcoreInsLdaw
  succ XcoreInsLdaw = XcoreInsLdc
  succ XcoreInsLdc = XcoreInsLdw
  succ XcoreInsLdw = XcoreInsLdivu
  succ XcoreInsLdivu = XcoreInsLmul
  succ XcoreInsLmul = XcoreInsLss
  succ XcoreInsLss = XcoreInsLsub
  succ XcoreInsLsub = XcoreInsLsu
  succ XcoreInsLsu = XcoreInsMaccs
  succ XcoreInsMaccs = XcoreInsMaccu
  succ XcoreInsMaccu = XcoreInsMjoin
  succ XcoreInsMjoin = XcoreInsMkmsk
  succ XcoreInsMkmsk = XcoreInsMsync
  succ XcoreInsMsync = XcoreInsMul
  succ XcoreInsMul = XcoreInsNeg
  succ XcoreInsNeg = XcoreInsNot
  succ XcoreInsNot = XcoreInsOr
  succ XcoreInsOr = XcoreInsOutct
  succ XcoreInsOutct = XcoreInsOutpw
  succ XcoreInsOutpw = XcoreInsOutshr
  succ XcoreInsOutshr = XcoreInsOutt
  succ XcoreInsOutt = XcoreInsOut
  succ XcoreInsOut = XcoreInsPeek
  succ XcoreInsPeek = XcoreInsRems
  succ XcoreInsRems = XcoreInsRemu
  succ XcoreInsRemu = XcoreInsRetsp
  succ XcoreInsRetsp = XcoreInsSetclk
  succ XcoreInsSetclk = XcoreInsSet
  succ XcoreInsSet = XcoreInsSetc
  succ XcoreInsSetc = XcoreInsSetd
  succ XcoreInsSetd = XcoreInsSetev
  succ XcoreInsSetev = XcoreInsSetn
  succ XcoreInsSetn = XcoreInsSetpsc
  succ XcoreInsSetpsc = XcoreInsSetpt
  succ XcoreInsSetpt = XcoreInsSetrdy
  succ XcoreInsSetrdy = XcoreInsSetsr
  succ XcoreInsSetsr = XcoreInsSettw
  succ XcoreInsSettw = XcoreInsSetv
  succ XcoreInsSetv = XcoreInsSext
  succ XcoreInsSext = XcoreInsShl
  succ XcoreInsShl = XcoreInsShr
  succ XcoreInsShr = XcoreInsSsync
  succ XcoreInsSsync = XcoreInsSt16
  succ XcoreInsSt16 = XcoreInsSt8
  succ XcoreInsSt8 = XcoreInsStw
  succ XcoreInsStw = XcoreInsSub
  succ XcoreInsSub = XcoreInsSyncr
  succ XcoreInsSyncr = XcoreInsTestct
  succ XcoreInsTestct = XcoreInsTestlcl
  succ XcoreInsTestlcl = XcoreInsTestwct
  succ XcoreInsTestwct = XcoreInsTsetmr
  succ XcoreInsTsetmr = XcoreInsStart
  succ XcoreInsStart = XcoreInsWaitef
  succ XcoreInsWaitef = XcoreInsWaitet
  succ XcoreInsWaitet = XcoreInsWaiteu
  succ XcoreInsWaiteu = XcoreInsXor
  succ XcoreInsXor = XcoreInsZext
  succ XcoreInsZext = XcoreInsEnding
  succ XcoreInsEnding = error "XCoreInsn.succ: XcoreInsEnding has no successor"

  pred XcoreInsAdd = XcoreInsInvalid
  pred XcoreInsAndnot = XcoreInsAdd
  pred XcoreInsAnd = XcoreInsAndnot
  pred XcoreInsAshr = XcoreInsAnd
  pred XcoreInsBau = XcoreInsAshr
  pred XcoreInsBitrev = XcoreInsBau
  pred XcoreInsBla = XcoreInsBitrev
  pred XcoreInsBlat = XcoreInsBla
  pred XcoreInsBl = XcoreInsBlat
  pred XcoreInsBf = XcoreInsBl
  pred XcoreInsBt = XcoreInsBf
  pred XcoreInsBu = XcoreInsBt
  pred XcoreInsBru = XcoreInsBu
  pred XcoreInsByterev = XcoreInsBru
  pred XcoreInsChkct = XcoreInsByterev
  pred XcoreInsClre = XcoreInsChkct
  pred XcoreInsClrpt = XcoreInsClre
  pred XcoreInsClrsr = XcoreInsClrpt
  pred XcoreInsClz = XcoreInsClrsr
  pred XcoreInsCrc8 = XcoreInsClz
  pred XcoreInsCrc32 = XcoreInsCrc8
  pred XcoreInsDcall = XcoreInsCrc32
  pred XcoreInsDentsp = XcoreInsDcall
  pred XcoreInsDgetreg = XcoreInsDentsp
  pred XcoreInsDivs = XcoreInsDgetreg
  pred XcoreInsDivu = XcoreInsDivs
  pred XcoreInsDrestsp = XcoreInsDivu
  pred XcoreInsDret = XcoreInsDrestsp
  pred XcoreInsEcallf = XcoreInsDret
  pred XcoreInsEcallt = XcoreInsEcallf
  pred XcoreInsEdu = XcoreInsEcallt
  pred XcoreInsEef = XcoreInsEdu
  pred XcoreInsEet = XcoreInsEef
  pred XcoreInsEeu = XcoreInsEet
  pred XcoreInsEndin = XcoreInsEeu
  pred XcoreInsEntsp = XcoreInsEndin
  pred XcoreInsEq = XcoreInsEntsp
  pred XcoreInsExtdp = XcoreInsEq
  pred XcoreInsExtsp = XcoreInsExtdp
  pred XcoreInsFreer = XcoreInsExtsp
  pred XcoreInsFreet = XcoreInsFreer
  pred XcoreInsGetd = XcoreInsFreet
  pred XcoreInsGet = XcoreInsGetd
  pred XcoreInsGetn = XcoreInsGet
  pred XcoreInsGetr = XcoreInsGetn
  pred XcoreInsGetsr = XcoreInsGetr
  pred XcoreInsGetst = XcoreInsGetsr
  pred XcoreInsGetts = XcoreInsGetst
  pred XcoreInsInct = XcoreInsGetts
  pred XcoreInsInit = XcoreInsInct
  pred XcoreInsInpw = XcoreInsInit
  pred XcoreInsInshr = XcoreInsInpw
  pred XcoreInsInt = XcoreInsInshr
  pred XcoreInsIn = XcoreInsInt
  pred XcoreInsKcall = XcoreInsIn
  pred XcoreInsKentsp = XcoreInsKcall
  pred XcoreInsKrestsp = XcoreInsKentsp
  pred XcoreInsKret = XcoreInsKrestsp
  pred XcoreInsLadd = XcoreInsKret
  pred XcoreInsLd16s = XcoreInsLadd
  pred XcoreInsLd8u = XcoreInsLd16s
  pred XcoreInsLda16 = XcoreInsLd8u
  pred XcoreInsLdap = XcoreInsLda16
  pred XcoreInsLdaw = XcoreInsLdap
  pred XcoreInsLdc = XcoreInsLdaw
  pred XcoreInsLdw = XcoreInsLdc
  pred XcoreInsLdivu = XcoreInsLdw
  pred XcoreInsLmul = XcoreInsLdivu
  pred XcoreInsLss = XcoreInsLmul
  pred XcoreInsLsub = XcoreInsLss
  pred XcoreInsLsu = XcoreInsLsub
  pred XcoreInsMaccs = XcoreInsLsu
  pred XcoreInsMaccu = XcoreInsMaccs
  pred XcoreInsMjoin = XcoreInsMaccu
  pred XcoreInsMkmsk = XcoreInsMjoin
  pred XcoreInsMsync = XcoreInsMkmsk
  pred XcoreInsMul = XcoreInsMsync
  pred XcoreInsNeg = XcoreInsMul
  pred XcoreInsNot = XcoreInsNeg
  pred XcoreInsOr = XcoreInsNot
  pred XcoreInsOutct = XcoreInsOr
  pred XcoreInsOutpw = XcoreInsOutct
  pred XcoreInsOutshr = XcoreInsOutpw
  pred XcoreInsOutt = XcoreInsOutshr
  pred XcoreInsOut = XcoreInsOutt
  pred XcoreInsPeek = XcoreInsOut
  pred XcoreInsRems = XcoreInsPeek
  pred XcoreInsRemu = XcoreInsRems
  pred XcoreInsRetsp = XcoreInsRemu
  pred XcoreInsSetclk = XcoreInsRetsp
  pred XcoreInsSet = XcoreInsSetclk
  pred XcoreInsSetc = XcoreInsSet
  pred XcoreInsSetd = XcoreInsSetc
  pred XcoreInsSetev = XcoreInsSetd
  pred XcoreInsSetn = XcoreInsSetev
  pred XcoreInsSetpsc = XcoreInsSetn
  pred XcoreInsSetpt = XcoreInsSetpsc
  pred XcoreInsSetrdy = XcoreInsSetpt
  pred XcoreInsSetsr = XcoreInsSetrdy
  pred XcoreInsSettw = XcoreInsSetsr
  pred XcoreInsSetv = XcoreInsSettw
  pred XcoreInsSext = XcoreInsSetv
  pred XcoreInsShl = XcoreInsSext
  pred XcoreInsShr = XcoreInsShl
  pred XcoreInsSsync = XcoreInsShr
  pred XcoreInsSt16 = XcoreInsSsync
  pred XcoreInsSt8 = XcoreInsSt16
  pred XcoreInsStw = XcoreInsSt8
  pred XcoreInsSub = XcoreInsStw
  pred XcoreInsSyncr = XcoreInsSub
  pred XcoreInsTestct = XcoreInsSyncr
  pred XcoreInsTestlcl = XcoreInsTestct
  pred XcoreInsTestwct = XcoreInsTestlcl
  pred XcoreInsTsetmr = XcoreInsTestwct
  pred XcoreInsStart = XcoreInsTsetmr
  pred XcoreInsWaitef = XcoreInsStart
  pred XcoreInsWaitet = XcoreInsWaitef
  pred XcoreInsWaiteu = XcoreInsWaitet
  pred XcoreInsXor = XcoreInsWaiteu
  pred XcoreInsZext = XcoreInsXor
  pred XcoreInsEnding = XcoreInsZext
  pred XcoreInsInvalid = error "XCoreInsn.pred: XcoreInsInvalid has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from XcoreInsEnding

  fromEnum XcoreInsInvalid = 0
  fromEnum XcoreInsAdd = 1
  fromEnum XcoreInsAndnot = 2
  fromEnum XcoreInsAnd = 3
  fromEnum XcoreInsAshr = 4
  fromEnum XcoreInsBau = 5
  fromEnum XcoreInsBitrev = 6
  fromEnum XcoreInsBla = 7
  fromEnum XcoreInsBlat = 8
  fromEnum XcoreInsBl = 9
  fromEnum XcoreInsBf = 10
  fromEnum XcoreInsBt = 11
  fromEnum XcoreInsBu = 12
  fromEnum XcoreInsBru = 13
  fromEnum XcoreInsByterev = 14
  fromEnum XcoreInsChkct = 15
  fromEnum XcoreInsClre = 16
  fromEnum XcoreInsClrpt = 17
  fromEnum XcoreInsClrsr = 18
  fromEnum XcoreInsClz = 19
  fromEnum XcoreInsCrc8 = 20
  fromEnum XcoreInsCrc32 = 21
  fromEnum XcoreInsDcall = 22
  fromEnum XcoreInsDentsp = 23
  fromEnum XcoreInsDgetreg = 24
  fromEnum XcoreInsDivs = 25
  fromEnum XcoreInsDivu = 26
  fromEnum XcoreInsDrestsp = 27
  fromEnum XcoreInsDret = 28
  fromEnum XcoreInsEcallf = 29
  fromEnum XcoreInsEcallt = 30
  fromEnum XcoreInsEdu = 31
  fromEnum XcoreInsEef = 32
  fromEnum XcoreInsEet = 33
  fromEnum XcoreInsEeu = 34
  fromEnum XcoreInsEndin = 35
  fromEnum XcoreInsEntsp = 36
  fromEnum XcoreInsEq = 37
  fromEnum XcoreInsExtdp = 38
  fromEnum XcoreInsExtsp = 39
  fromEnum XcoreInsFreer = 40
  fromEnum XcoreInsFreet = 41
  fromEnum XcoreInsGetd = 42
  fromEnum XcoreInsGet = 43
  fromEnum XcoreInsGetn = 44
  fromEnum XcoreInsGetr = 45
  fromEnum XcoreInsGetsr = 46
  fromEnum XcoreInsGetst = 47
  fromEnum XcoreInsGetts = 48
  fromEnum XcoreInsInct = 49
  fromEnum XcoreInsInit = 50
  fromEnum XcoreInsInpw = 51
  fromEnum XcoreInsInshr = 52
  fromEnum XcoreInsInt = 53
  fromEnum XcoreInsIn = 54
  fromEnum XcoreInsKcall = 55
  fromEnum XcoreInsKentsp = 56
  fromEnum XcoreInsKrestsp = 57
  fromEnum XcoreInsKret = 58
  fromEnum XcoreInsLadd = 59
  fromEnum XcoreInsLd16s = 60
  fromEnum XcoreInsLd8u = 61
  fromEnum XcoreInsLda16 = 62
  fromEnum XcoreInsLdap = 63
  fromEnum XcoreInsLdaw = 64
  fromEnum XcoreInsLdc = 65
  fromEnum XcoreInsLdw = 66
  fromEnum XcoreInsLdivu = 67
  fromEnum XcoreInsLmul = 68
  fromEnum XcoreInsLss = 69
  fromEnum XcoreInsLsub = 70
  fromEnum XcoreInsLsu = 71
  fromEnum XcoreInsMaccs = 72
  fromEnum XcoreInsMaccu = 73
  fromEnum XcoreInsMjoin = 74
  fromEnum XcoreInsMkmsk = 75
  fromEnum XcoreInsMsync = 76
  fromEnum XcoreInsMul = 77
  fromEnum XcoreInsNeg = 78
  fromEnum XcoreInsNot = 79
  fromEnum XcoreInsOr = 80
  fromEnum XcoreInsOutct = 81
  fromEnum XcoreInsOutpw = 82
  fromEnum XcoreInsOutshr = 83
  fromEnum XcoreInsOutt = 84
  fromEnum XcoreInsOut = 85
  fromEnum XcoreInsPeek = 86
  fromEnum XcoreInsRems = 87
  fromEnum XcoreInsRemu = 88
  fromEnum XcoreInsRetsp = 89
  fromEnum XcoreInsSetclk = 90
  fromEnum XcoreInsSet = 91
  fromEnum XcoreInsSetc = 92
  fromEnum XcoreInsSetd = 93
  fromEnum XcoreInsSetev = 94
  fromEnum XcoreInsSetn = 95
  fromEnum XcoreInsSetpsc = 96
  fromEnum XcoreInsSetpt = 97
  fromEnum XcoreInsSetrdy = 98
  fromEnum XcoreInsSetsr = 99
  fromEnum XcoreInsSettw = 100
  fromEnum XcoreInsSetv = 101
  fromEnum XcoreInsSext = 102
  fromEnum XcoreInsShl = 103
  fromEnum XcoreInsShr = 104
  fromEnum XcoreInsSsync = 105
  fromEnum XcoreInsSt16 = 106
  fromEnum XcoreInsSt8 = 107
  fromEnum XcoreInsStw = 108
  fromEnum XcoreInsSub = 109
  fromEnum XcoreInsSyncr = 110
  fromEnum XcoreInsTestct = 111
  fromEnum XcoreInsTestlcl = 112
  fromEnum XcoreInsTestwct = 113
  fromEnum XcoreInsTsetmr = 114
  fromEnum XcoreInsStart = 115
  fromEnum XcoreInsWaitef = 116
  fromEnum XcoreInsWaitet = 117
  fromEnum XcoreInsWaiteu = 118
  fromEnum XcoreInsXor = 119
  fromEnum XcoreInsZext = 120
  fromEnum XcoreInsEnding = 121

  toEnum 0 = XcoreInsInvalid
  toEnum 1 = XcoreInsAdd
  toEnum 2 = XcoreInsAndnot
  toEnum 3 = XcoreInsAnd
  toEnum 4 = XcoreInsAshr
  toEnum 5 = XcoreInsBau
  toEnum 6 = XcoreInsBitrev
  toEnum 7 = XcoreInsBla
  toEnum 8 = XcoreInsBlat
  toEnum 9 = XcoreInsBl
  toEnum 10 = XcoreInsBf
  toEnum 11 = XcoreInsBt
  toEnum 12 = XcoreInsBu
  toEnum 13 = XcoreInsBru
  toEnum 14 = XcoreInsByterev
  toEnum 15 = XcoreInsChkct
  toEnum 16 = XcoreInsClre
  toEnum 17 = XcoreInsClrpt
  toEnum 18 = XcoreInsClrsr
  toEnum 19 = XcoreInsClz
  toEnum 20 = XcoreInsCrc8
  toEnum 21 = XcoreInsCrc32
  toEnum 22 = XcoreInsDcall
  toEnum 23 = XcoreInsDentsp
  toEnum 24 = XcoreInsDgetreg
  toEnum 25 = XcoreInsDivs
  toEnum 26 = XcoreInsDivu
  toEnum 27 = XcoreInsDrestsp
  toEnum 28 = XcoreInsDret
  toEnum 29 = XcoreInsEcallf
  toEnum 30 = XcoreInsEcallt
  toEnum 31 = XcoreInsEdu
  toEnum 32 = XcoreInsEef
  toEnum 33 = XcoreInsEet
  toEnum 34 = XcoreInsEeu
  toEnum 35 = XcoreInsEndin
  toEnum 36 = XcoreInsEntsp
  toEnum 37 = XcoreInsEq
  toEnum 38 = XcoreInsExtdp
  toEnum 39 = XcoreInsExtsp
  toEnum 40 = XcoreInsFreer
  toEnum 41 = XcoreInsFreet
  toEnum 42 = XcoreInsGetd
  toEnum 43 = XcoreInsGet
  toEnum 44 = XcoreInsGetn
  toEnum 45 = XcoreInsGetr
  toEnum 46 = XcoreInsGetsr
  toEnum 47 = XcoreInsGetst
  toEnum 48 = XcoreInsGetts
  toEnum 49 = XcoreInsInct
  toEnum 50 = XcoreInsInit
  toEnum 51 = XcoreInsInpw
  toEnum 52 = XcoreInsInshr
  toEnum 53 = XcoreInsInt
  toEnum 54 = XcoreInsIn
  toEnum 55 = XcoreInsKcall
  toEnum 56 = XcoreInsKentsp
  toEnum 57 = XcoreInsKrestsp
  toEnum 58 = XcoreInsKret
  toEnum 59 = XcoreInsLadd
  toEnum 60 = XcoreInsLd16s
  toEnum 61 = XcoreInsLd8u
  toEnum 62 = XcoreInsLda16
  toEnum 63 = XcoreInsLdap
  toEnum 64 = XcoreInsLdaw
  toEnum 65 = XcoreInsLdc
  toEnum 66 = XcoreInsLdw
  toEnum 67 = XcoreInsLdivu
  toEnum 68 = XcoreInsLmul
  toEnum 69 = XcoreInsLss
  toEnum 70 = XcoreInsLsub
  toEnum 71 = XcoreInsLsu
  toEnum 72 = XcoreInsMaccs
  toEnum 73 = XcoreInsMaccu
  toEnum 74 = XcoreInsMjoin
  toEnum 75 = XcoreInsMkmsk
  toEnum 76 = XcoreInsMsync
  toEnum 77 = XcoreInsMul
  toEnum 78 = XcoreInsNeg
  toEnum 79 = XcoreInsNot
  toEnum 80 = XcoreInsOr
  toEnum 81 = XcoreInsOutct
  toEnum 82 = XcoreInsOutpw
  toEnum 83 = XcoreInsOutshr
  toEnum 84 = XcoreInsOutt
  toEnum 85 = XcoreInsOut
  toEnum 86 = XcoreInsPeek
  toEnum 87 = XcoreInsRems
  toEnum 88 = XcoreInsRemu
  toEnum 89 = XcoreInsRetsp
  toEnum 90 = XcoreInsSetclk
  toEnum 91 = XcoreInsSet
  toEnum 92 = XcoreInsSetc
  toEnum 93 = XcoreInsSetd
  toEnum 94 = XcoreInsSetev
  toEnum 95 = XcoreInsSetn
  toEnum 96 = XcoreInsSetpsc
  toEnum 97 = XcoreInsSetpt
  toEnum 98 = XcoreInsSetrdy
  toEnum 99 = XcoreInsSetsr
  toEnum 100 = XcoreInsSettw
  toEnum 101 = XcoreInsSetv
  toEnum 102 = XcoreInsSext
  toEnum 103 = XcoreInsShl
  toEnum 104 = XcoreInsShr
  toEnum 105 = XcoreInsSsync
  toEnum 106 = XcoreInsSt16
  toEnum 107 = XcoreInsSt8
  toEnum 108 = XcoreInsStw
  toEnum 109 = XcoreInsSub
  toEnum 110 = XcoreInsSyncr
  toEnum 111 = XcoreInsTestct
  toEnum 112 = XcoreInsTestlcl
  toEnum 113 = XcoreInsTestwct
  toEnum 114 = XcoreInsTsetmr
  toEnum 115 = XcoreInsStart
  toEnum 116 = XcoreInsWaitef
  toEnum 117 = XcoreInsWaitet
  toEnum 118 = XcoreInsWaiteu
  toEnum 119 = XcoreInsXor
  toEnum 120 = XcoreInsZext
  toEnum 121 = XcoreInsEnding
  toEnum unmatched = error ("XCoreInsn.toEnum: Cannot match " ++ show unmatched)

{-# LINE 113 "src/Hapstone/Internal/XCore.chs" #-}

-- | XCore instruction groups
data XCoreInsnGroup = XcoreGrpInvalid
                    | XcoreGrpJump
                    | XcoreGrpEnding
  deriving (Show,Eq,Bounded)
instance Enum XCoreInsnGroup where
  succ XcoreGrpInvalid = XcoreGrpJump
  succ XcoreGrpJump = XcoreGrpEnding
  succ XcoreGrpEnding = error "XCoreInsnGroup.succ: XcoreGrpEnding has no successor"

  pred XcoreGrpJump = XcoreGrpInvalid
  pred XcoreGrpEnding = XcoreGrpJump
  pred XcoreGrpInvalid = error "XCoreInsnGroup.pred: XcoreGrpInvalid has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from XcoreGrpEnding

  fromEnum XcoreGrpInvalid = 0
  fromEnum XcoreGrpJump = 1
  fromEnum XcoreGrpEnding = 2

  toEnum 0 = XcoreGrpInvalid
  toEnum 1 = XcoreGrpJump
  toEnum 2 = XcoreGrpEnding
  toEnum unmatched = error ("XCoreInsnGroup.toEnum: Cannot match " ++ show unmatched)

{-# LINE 116 "src/Hapstone/Internal/XCore.chs" #-}