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