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