Home | History | Annotate | Download | only in pnacl-llvm
      1 //===- NaClBitcodeDecoders.cpp --------------------------------------------===//
      2 //     Internal implementation of decoder functions for PNaCl Bitcode files.
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is distributed under the University of Illinois Open Source
      7 // License. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #include "llvm/Bitcode/NaCl/NaClBitcodeDecoders.h"
     12 
     13 namespace llvm {
     14 namespace naclbitc {
     15 
     16 bool DecodeCastOpcode(uint64_t NaClOpcode,
     17                       Instruction::CastOps &LLVMOpcode) {
     18   switch (NaClOpcode) {
     19   default:
     20     LLVMOpcode = Instruction::BitCast;
     21     return false;
     22   case naclbitc::CAST_TRUNC:
     23     LLVMOpcode = Instruction::Trunc;
     24     return true;
     25   case naclbitc::CAST_ZEXT:
     26     LLVMOpcode = Instruction::ZExt;
     27     return true;
     28   case naclbitc::CAST_SEXT:
     29     LLVMOpcode = Instruction::SExt;
     30     return true;
     31   case naclbitc::CAST_FPTOUI:
     32     LLVMOpcode = Instruction::FPToUI;
     33     return true;
     34   case naclbitc::CAST_FPTOSI:
     35     LLVMOpcode = Instruction::FPToSI;
     36     return true;
     37   case naclbitc::CAST_UITOFP:
     38     LLVMOpcode = Instruction::UIToFP;
     39     return true;
     40   case naclbitc::CAST_SITOFP:
     41     LLVMOpcode = Instruction::SIToFP;
     42     return true;
     43   case naclbitc::CAST_FPTRUNC:
     44     LLVMOpcode = Instruction::FPTrunc;
     45     return true;
     46   case naclbitc::CAST_FPEXT:
     47     LLVMOpcode = Instruction::FPExt;
     48     return true;
     49   case naclbitc::CAST_BITCAST:
     50     LLVMOpcode = Instruction::BitCast;
     51     return true;
     52   }
     53 }
     54 
     55 bool DecodeLinkage(uint64_t NaClLinkage,
     56                    GlobalValue::LinkageTypes &LLVMLinkage) {
     57   switch (NaClLinkage) {
     58   default:
     59     LLVMLinkage = GlobalValue::InternalLinkage;
     60     return false;
     61   case naclbitc::LINKAGE_EXTERNAL:
     62     LLVMLinkage = GlobalValue::ExternalLinkage;
     63     return true;
     64   case naclbitc::LINKAGE_INTERNAL:
     65     LLVMLinkage = GlobalValue::InternalLinkage;
     66     return true;
     67   }
     68 }
     69 
     70 bool DecodeBinaryOpcode(uint64_t NaClOpcode, Type *Ty,
     71                         Instruction::BinaryOps &LLVMOpcode) {
     72   switch (NaClOpcode) {
     73   default:
     74     LLVMOpcode = Instruction::Add;
     75     return false;
     76   case naclbitc::BINOP_ADD:
     77     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add;
     78     return true;
     79   case naclbitc::BINOP_SUB:
     80     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub;
     81     return true;
     82   case naclbitc::BINOP_MUL:
     83     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul;
     84     return true;
     85   case naclbitc::BINOP_UDIV:
     86     LLVMOpcode = Instruction::UDiv;
     87     return true;
     88   case naclbitc::BINOP_SDIV:
     89     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv;
     90     return true;
     91   case naclbitc::BINOP_UREM:
     92     LLVMOpcode = Instruction::URem;
     93     return true;
     94   case naclbitc::BINOP_SREM:
     95     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem;
     96     return true;
     97   case naclbitc::BINOP_SHL:
     98     LLVMOpcode = Instruction::Shl;
     99     return true;
    100   case naclbitc::BINOP_LSHR:
    101     LLVMOpcode = Instruction::LShr;
    102     return true;
    103   case naclbitc::BINOP_ASHR:
    104     LLVMOpcode = Instruction::AShr;
    105     return true;
    106   case naclbitc::BINOP_AND:
    107     LLVMOpcode = Instruction::And;
    108     return true;
    109   case naclbitc::BINOP_OR:
    110     LLVMOpcode = Instruction::Or;
    111     return true;
    112   case naclbitc::BINOP_XOR:
    113     LLVMOpcode = Instruction::Xor;
    114     return true;
    115   }
    116 }
    117 
    118 bool DecodeCallingConv(uint64_t NaClCallingConv,
    119                        CallingConv::ID &LLVMCallingConv) {
    120   switch (NaClCallingConv) {
    121   default:
    122     LLVMCallingConv = CallingConv::C;
    123     return false;
    124   case naclbitc::C_CallingConv:
    125     LLVMCallingConv = CallingConv::C;
    126     return true;
    127   }
    128 }
    129 
    130 bool DecodeFcmpPredicate(uint64_t NaClPredicate,
    131                          CmpInst::Predicate &LLVMPredicate) {
    132   switch (NaClPredicate) {
    133   default:
    134     LLVMPredicate = CmpInst::FCMP_FALSE;
    135     return false;
    136   case naclbitc::FCMP_FALSE:
    137     LLVMPredicate = CmpInst::FCMP_FALSE;
    138     return true;
    139   case naclbitc::FCMP_OEQ:
    140     LLVMPredicate = CmpInst::FCMP_OEQ;
    141     return true;
    142   case naclbitc::FCMP_OGT:
    143     LLVMPredicate = CmpInst::FCMP_OGT;
    144     return true;
    145   case naclbitc::FCMP_OGE:
    146     LLVMPredicate = CmpInst::FCMP_OGE;
    147     return true;
    148   case naclbitc::FCMP_OLT:
    149     LLVMPredicate = CmpInst::FCMP_OLT;
    150     return true;
    151   case naclbitc::FCMP_OLE:
    152     LLVMPredicate = CmpInst::FCMP_OLE;
    153     return true;
    154   case naclbitc::FCMP_ONE:
    155     LLVMPredicate = CmpInst::FCMP_ONE;
    156     return true;
    157   case naclbitc::FCMP_ORD:
    158     LLVMPredicate = CmpInst::FCMP_ORD;
    159     return true;
    160   case naclbitc::FCMP_UNO:
    161     LLVMPredicate = CmpInst::FCMP_UNO;
    162     return true;
    163   case naclbitc::FCMP_UEQ:
    164     LLVMPredicate = CmpInst::FCMP_UEQ;
    165     return true;
    166   case naclbitc::FCMP_UGT:
    167     LLVMPredicate = CmpInst::FCMP_UGT;
    168     return true;
    169   case naclbitc::FCMP_UGE:
    170     LLVMPredicate = CmpInst::FCMP_UGE;
    171     return true;
    172   case naclbitc::FCMP_ULT:
    173     LLVMPredicate = CmpInst::FCMP_ULT;
    174     return true;
    175   case naclbitc::FCMP_ULE:
    176     LLVMPredicate = CmpInst::FCMP_ULE;
    177     return true;
    178   case naclbitc::FCMP_UNE:
    179     LLVMPredicate = CmpInst::FCMP_UNE;
    180     return true;
    181   case naclbitc::FCMP_TRUE:
    182     LLVMPredicate = CmpInst::FCMP_TRUE;
    183     return true;
    184   }
    185 }
    186 
    187 bool DecodeIcmpPredicate(uint64_t NaClPredicate,
    188                          CmpInst::Predicate &LLVMPredicate) {
    189   switch (NaClPredicate) {
    190   default:
    191     LLVMPredicate = CmpInst::ICMP_EQ;
    192     return false;
    193   case naclbitc::ICMP_EQ:
    194     LLVMPredicate = CmpInst::ICMP_EQ;
    195     return true;
    196   case naclbitc::ICMP_NE:
    197     LLVMPredicate = CmpInst::ICMP_NE;
    198     return true;
    199   case naclbitc::ICMP_UGT:
    200     LLVMPredicate = CmpInst::ICMP_UGT;
    201     return true;
    202   case naclbitc::ICMP_UGE:
    203     LLVMPredicate = CmpInst::ICMP_UGE;
    204     return true;
    205   case naclbitc::ICMP_ULT:
    206     LLVMPredicate = CmpInst::ICMP_ULT;
    207     return true;
    208   case naclbitc::ICMP_ULE:
    209     LLVMPredicate = CmpInst::ICMP_ULE;
    210     return true;
    211   case naclbitc::ICMP_SGT:
    212     LLVMPredicate = CmpInst::ICMP_SGT;
    213     return true;
    214   case naclbitc::ICMP_SGE:
    215     LLVMPredicate = CmpInst::ICMP_SGE;
    216     return true;
    217   case naclbitc::ICMP_SLT:
    218     LLVMPredicate = CmpInst::ICMP_SLT;
    219     return true;
    220   case naclbitc::ICMP_SLE:
    221     LLVMPredicate = CmpInst::ICMP_SLE;
    222     return true;
    223   }
    224 }
    225 
    226 
    227 }
    228 }
    229