immutable InstructionDef{T}
    opcode::Cint
    capi_name::String
    capi_classname::String
end

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