| //===- 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 |