{-# LINE 1 "src/LLVM/Internal/FFI/InstructionDefs.hsc" #-}
-- This module translates the instruction data in "llvm/Instruction.def" into a Haskell data structure,
-- so it may be accessed conveniently with Template Haskell code
module LLVM.Internal.FFI.InstructionDefs where

import LLVM.Prelude

import LLVM.Internal.FFI.LLVMCTypes









data InstructionKind = Terminator | Binary | Memory | Cast | FuncletPad | Other
  deriving (Eq, Ord, Show)

data InstructionDef = InstructionDef {
    cppOpcode :: CPPOpcode,
    cAPIName :: String,
    cAPIClassName :: String,
    instructionKind :: InstructionKind
  }
  deriving (Eq, Ord, Show)

instructionDefs :: [InstructionDef]
instructionDefs = [
 InstructionDef o an acn k
 | (o, an, acn, k) <-
   [ (CPPOpcode 1,"Ret","ReturnInst", Terminator)
   , (CPPOpcode 2,"Br","BranchInst", Terminator)
   , (CPPOpcode 3,"Switch","SwitchInst", Terminator)
   , (CPPOpcode 4,"IndirectBr","IndirectBrInst", Terminator)
   , (CPPOpcode 5,"Invoke","InvokeInst", Terminator)
   , (CPPOpcode 6,"Resume","ResumeInst", Terminator)
   , (CPPOpcode 7,"Unreachable","UnreachableInst", Terminator)
   , (CPPOpcode 8,"CleanupRet","CleanupReturnInst", Terminator)
   , (CPPOpcode 9,"CatchRet","CatchReturnInst", Terminator)
   , (CPPOpcode 10,"CatchSwitch","CatchSwitchInst", Terminator)
   , (CPPOpcode 11,"FNeg","UnaryOperator", Terminator)
   , (CPPOpcode 12,"Add","BinaryOperator", Binary)
   , (CPPOpcode 13,"FAdd","BinaryOperator", Binary)
   , (CPPOpcode 14,"Sub","BinaryOperator", Binary)
   , (CPPOpcode 15,"FSub","BinaryOperator", Binary)
   , (CPPOpcode 16,"Mul","BinaryOperator", Binary)
   , (CPPOpcode 17,"FMul","BinaryOperator", Binary)
   , (CPPOpcode 18,"UDiv","BinaryOperator", Binary)
   , (CPPOpcode 19,"SDiv","BinaryOperator", Binary)
   , (CPPOpcode 20,"FDiv","BinaryOperator", Binary)
   , (CPPOpcode 21,"URem","BinaryOperator", Binary)
   , (CPPOpcode 22,"SRem","BinaryOperator", Binary)
   , (CPPOpcode 23,"FRem","BinaryOperator", Binary)
   , (CPPOpcode 24,"Shl","BinaryOperator", Binary)
   , (CPPOpcode 25,"LShr","BinaryOperator", Binary)
   , (CPPOpcode 26,"AShr","BinaryOperator", Binary)
   , (CPPOpcode 27,"And","BinaryOperator", Binary)
   , (CPPOpcode 28,"Or","BinaryOperator", Binary)
   , (CPPOpcode 29,"Xor","BinaryOperator", Binary)
   , (CPPOpcode 30,"Alloca","AllocaInst", Memory)
   , (CPPOpcode 31,"Load","LoadInst", Memory)
   , (CPPOpcode 32,"Store","StoreInst", Memory)
   , (CPPOpcode 33,"GetElementPtr","GetElementPtrInst", Memory)
   , (CPPOpcode 34,"Fence","FenceInst", Memory)
   , (CPPOpcode 35,"AtomicCmpXchg","AtomicCmpXchgInst", Memory)
   , (CPPOpcode 36,"AtomicRMW","AtomicRMWInst", Memory)
   , (CPPOpcode 37,"Trunc","TruncInst", Cast)
   , (CPPOpcode 38,"ZExt","ZExtInst", Cast)
   , (CPPOpcode 39,"SExt","SExtInst", Cast)
   , (CPPOpcode 40,"FPToUI","FPToUIInst", Cast)
   , (CPPOpcode 41,"FPToSI","FPToSIInst", Cast)
   , (CPPOpcode 42,"UIToFP","UIToFPInst", Cast)
   , (CPPOpcode 43,"SIToFP","SIToFPInst", Cast)
   , (CPPOpcode 44,"FPTrunc","FPTruncInst", Cast)
   , (CPPOpcode 45,"FPExt","FPExtInst", Cast)
   , (CPPOpcode 46,"PtrToInt","PtrToIntInst", Cast)
   , (CPPOpcode 47,"IntToPtr","IntToPtrInst", Cast)
   , (CPPOpcode 48,"BitCast","BitCastInst", Cast)
   , (CPPOpcode 49,"AddrSpaceCast","AddrSpaceCastInst", Cast)
   , (CPPOpcode 50,"CleanupPad","CleanupPadInst", FuncletPad)
   , (CPPOpcode 51,"CatchPad","CatchPadInst", FuncletPad)
   , (CPPOpcode 52,"ICmp","ICmpInst", Other)
   , (CPPOpcode 53,"FCmp","FCmpInst", Other)
   , (CPPOpcode 54,"PHI","PHINode", Other)
   , (CPPOpcode 55,"Call","CallInst", Other)
   , (CPPOpcode 56,"Select","SelectInst", Other)
   , (CPPOpcode 57,"UserOp1","Instruction", Other)
   , (CPPOpcode 58,"UserOp2","Instruction", Other)
   , (CPPOpcode 59,"VAArg","VAArgInst", Other)
   , (CPPOpcode 60,"ExtractElement","ExtractElementInst", Other)
   , (CPPOpcode 61,"InsertElement","InsertElementInst", Other)
   , (CPPOpcode 62,"ShuffleVector","ShuffleVectorInst", Other)
   , (CPPOpcode 63,"ExtractValue","ExtractValueInst", Other)
   , (CPPOpcode 64,"InsertValue","InsertValueInst", Other)
   , (CPPOpcode 65,"LandingPad","LandingPadInst", Other) ] ,
{-# LINE 59 "src/LLVM/Internal/FFI/InstructionDefs.hsc" #-}
 an /= "UserOp1" && an /= "UserOp2"
 ]