//===- NaClBitcodeDecoders.cpp --------------------------------------------===// // Internal implementation of decoder functions for PNaCl Bitcode files. // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/Bitcode/NaCl/NaClBitcodeDecoders.h" namespace llvm { namespace naclbitc { bool DecodeCastOpcode(uint64_t NaClOpcode, Instruction::CastOps &LLVMOpcode) { switch (NaClOpcode) { default: LLVMOpcode = Instruction::BitCast; return false; case naclbitc::CAST_TRUNC: LLVMOpcode = Instruction::Trunc; return true; case naclbitc::CAST_ZEXT: LLVMOpcode = Instruction::ZExt; return true; case naclbitc::CAST_SEXT: LLVMOpcode = Instruction::SExt; return true; case naclbitc::CAST_FPTOUI: LLVMOpcode = Instruction::FPToUI; return true; case naclbitc::CAST_FPTOSI: LLVMOpcode = Instruction::FPToSI; return true; case naclbitc::CAST_UITOFP: LLVMOpcode = Instruction::UIToFP; return true; case naclbitc::CAST_SITOFP: LLVMOpcode = Instruction::SIToFP; return true; case naclbitc::CAST_FPTRUNC: LLVMOpcode = Instruction::FPTrunc; return true; case naclbitc::CAST_FPEXT: LLVMOpcode = Instruction::FPExt; return true; case naclbitc::CAST_BITCAST: LLVMOpcode = Instruction::BitCast; return true; } } bool DecodeLinkage(uint64_t NaClLinkage, GlobalValue::LinkageTypes &LLVMLinkage) { switch (NaClLinkage) { default: LLVMLinkage = GlobalValue::InternalLinkage; return false; case naclbitc::LINKAGE_EXTERNAL: LLVMLinkage = GlobalValue::ExternalLinkage; return true; case naclbitc::LINKAGE_INTERNAL: LLVMLinkage = GlobalValue::InternalLinkage; return true; } } bool DecodeBinaryOpcode(uint64_t NaClOpcode, Type *Ty, Instruction::BinaryOps &LLVMOpcode) { switch (NaClOpcode) { default: LLVMOpcode = Instruction::Add; return false; case naclbitc::BINOP_ADD: LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add; return true; case naclbitc::BINOP_SUB: LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub; return true; case naclbitc::BINOP_MUL: LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul; return true; case naclbitc::BINOP_UDIV: LLVMOpcode = Instruction::UDiv; return true; case naclbitc::BINOP_SDIV: LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv; return true; case naclbitc::BINOP_UREM: LLVMOpcode = Instruction::URem; return true; case naclbitc::BINOP_SREM: LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem; return true; case naclbitc::BINOP_SHL: LLVMOpcode = Instruction::Shl; return true; case naclbitc::BINOP_LSHR: LLVMOpcode = Instruction::LShr; return true; case naclbitc::BINOP_ASHR: LLVMOpcode = Instruction::AShr; return true; case naclbitc::BINOP_AND: LLVMOpcode = Instruction::And; return true; case naclbitc::BINOP_OR: LLVMOpcode = Instruction::Or; return true; case naclbitc::BINOP_XOR: LLVMOpcode = Instruction::Xor; return true; } } bool DecodeCallingConv(uint64_t NaClCallingConv, CallingConv::ID &LLVMCallingConv) { switch (NaClCallingConv) { default: LLVMCallingConv = CallingConv::C; return false; case naclbitc::C_CallingConv: LLVMCallingConv = CallingConv::C; return true; } } bool DecodeFcmpPredicate(uint64_t NaClPredicate, CmpInst::Predicate &LLVMPredicate) { switch (NaClPredicate) { default: LLVMPredicate = CmpInst::FCMP_FALSE; return false; case naclbitc::FCMP_FALSE: LLVMPredicate = CmpInst::FCMP_FALSE; return true; case naclbitc::FCMP_OEQ: LLVMPredicate = CmpInst::FCMP_OEQ; return true; case naclbitc::FCMP_OGT: LLVMPredicate = CmpInst::FCMP_OGT; return true; case naclbitc::FCMP_OGE: LLVMPredicate = CmpInst::FCMP_OGE; return true; case naclbitc::FCMP_OLT: LLVMPredicate = CmpInst::FCMP_OLT; return true; case naclbitc::FCMP_OLE: LLVMPredicate = CmpInst::FCMP_OLE; return true; case naclbitc::FCMP_ONE: LLVMPredicate = CmpInst::FCMP_ONE; return true; case naclbitc::FCMP_ORD: LLVMPredicate = CmpInst::FCMP_ORD; return true; case naclbitc::FCMP_UNO: LLVMPredicate = CmpInst::FCMP_UNO; return true; case naclbitc::FCMP_UEQ: LLVMPredicate = CmpInst::FCMP_UEQ; return true; case naclbitc::FCMP_UGT: LLVMPredicate = CmpInst::FCMP_UGT; return true; case naclbitc::FCMP_UGE: LLVMPredicate = CmpInst::FCMP_UGE; return true; case naclbitc::FCMP_ULT: LLVMPredicate = CmpInst::FCMP_ULT; return true; case naclbitc::FCMP_ULE: LLVMPredicate = CmpInst::FCMP_ULE; return true; case naclbitc::FCMP_UNE: LLVMPredicate = CmpInst::FCMP_UNE; return true; case naclbitc::FCMP_TRUE: LLVMPredicate = CmpInst::FCMP_TRUE; return true; } } bool DecodeIcmpPredicate(uint64_t NaClPredicate, CmpInst::Predicate &LLVMPredicate) { switch (NaClPredicate) { default: LLVMPredicate = CmpInst::ICMP_EQ; return false; case naclbitc::ICMP_EQ: LLVMPredicate = CmpInst::ICMP_EQ; return true; case naclbitc::ICMP_NE: LLVMPredicate = CmpInst::ICMP_NE; return true; case naclbitc::ICMP_UGT: LLVMPredicate = CmpInst::ICMP_UGT; return true; case naclbitc::ICMP_UGE: LLVMPredicate = CmpInst::ICMP_UGE; return true; case naclbitc::ICMP_ULT: LLVMPredicate = CmpInst::ICMP_ULT; return true; case naclbitc::ICMP_ULE: LLVMPredicate = CmpInst::ICMP_ULE; return true; case naclbitc::ICMP_SGT: LLVMPredicate = CmpInst::ICMP_SGT; return true; case naclbitc::ICMP_SGE: LLVMPredicate = CmpInst::ICMP_SGE; return true; case naclbitc::ICMP_SLT: LLVMPredicate = CmpInst::ICMP_SLT; return true; case naclbitc::ICMP_SLE: LLVMPredicate = CmpInst::ICMP_SLE; return true; } } } }