|  | //===- 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; | 
|  | } | 
|  | } | 
|  |  | 
|  | } // namespace naclbitc | 
|  | } // namespace llvm |