1 //===-- Execution.cpp - Implement code to simulate the program ------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains the actual instruction interpreter.
11 //===----------------------------------------------------------------------===//
13 #include "Interpreter.h"
14 #include "llvm/ADT/APInt.h"
15 #include "llvm/ADT/Statistic.h"
16 #include "llvm/CodeGen/IntrinsicLowering.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/DerivedTypes.h"
19 #include "llvm/IR/GetElementPtrTypeIterator.h"
20 #include "llvm/IR/Instructions.h"
21 #include "llvm/Support/CommandLine.h"
22 #include "llvm/Support/Debug.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/MathExtras.h"
25 #include "llvm/Support/raw_ostream.h"
30 #define DEBUG_TYPE "interpreter"
32 STATISTIC(NumDynamicInsts
, "Number of dynamic instructions executed");
34 static cl::opt
<bool> PrintVolatile("interpreter-print-volatile", cl::Hidden
,
35 cl::desc("make the interpreter print every volatile load and store"));
37 //===----------------------------------------------------------------------===//
38 // Various Helper Functions
39 //===----------------------------------------------------------------------===//
41 static void SetValue(Value
*V
, GenericValue Val
, ExecutionContext
&SF
) {
45 //===----------------------------------------------------------------------===//
46 // Unary Instruction Implementations
47 //===----------------------------------------------------------------------===//
49 static void executeFNegInst(GenericValue
&Dest
, GenericValue Src
, Type
*Ty
) {
50 switch (Ty
->getTypeID()) {
52 Dest
.FloatVal
= -Src
.FloatVal
;
54 case Type::DoubleTyID
:
55 Dest
.DoubleVal
= -Src
.DoubleVal
;
58 llvm_unreachable("Unhandled type for FNeg instruction");
62 void Interpreter::visitUnaryOperator(UnaryOperator
&I
) {
63 ExecutionContext
&SF
= ECStack
.back();
64 Type
*Ty
= I
.getOperand(0)->getType();
65 GenericValue Src
= getOperandValue(I
.getOperand(0), SF
);
66 GenericValue R
; // Result
68 // First process vector operation
69 if (Ty
->isVectorTy()) {
70 R
.AggregateVal
.resize(Src
.AggregateVal
.size());
72 switch(I
.getOpcode()) {
74 llvm_unreachable("Don't know how to handle this unary operator");
76 case Instruction::FNeg
:
77 if (cast
<VectorType
>(Ty
)->getElementType()->isFloatTy()) {
78 for (unsigned i
= 0; i
< R
.AggregateVal
.size(); ++i
)
79 R
.AggregateVal
[i
].FloatVal
= -Src
.AggregateVal
[i
].FloatVal
;
80 } else if (cast
<VectorType
>(Ty
)->getElementType()->isDoubleTy()) {
81 for (unsigned i
= 0; i
< R
.AggregateVal
.size(); ++i
)
82 R
.AggregateVal
[i
].DoubleVal
= -Src
.AggregateVal
[i
].DoubleVal
;
84 llvm_unreachable("Unhandled type for FNeg instruction");
89 switch (I
.getOpcode()) {
91 llvm_unreachable("Don't know how to handle this unary operator");
93 case Instruction::FNeg
: executeFNegInst(R
, Src
, Ty
); break;
99 //===----------------------------------------------------------------------===//
100 // Binary Instruction Implementations
101 //===----------------------------------------------------------------------===//
103 #define IMPLEMENT_BINARY_OPERATOR(OP, TY) \
104 case Type::TY##TyID: \
105 Dest.TY##Val = Src1.TY##Val OP Src2.TY##Val; \
108 static void executeFAddInst(GenericValue
&Dest
, GenericValue Src1
,
109 GenericValue Src2
, Type
*Ty
) {
110 switch (Ty
->getTypeID()) {
111 IMPLEMENT_BINARY_OPERATOR(+, Float
);
112 IMPLEMENT_BINARY_OPERATOR(+, Double
);
114 dbgs() << "Unhandled type for FAdd instruction: " << *Ty
<< "\n";
115 llvm_unreachable(nullptr);
119 static void executeFSubInst(GenericValue
&Dest
, GenericValue Src1
,
120 GenericValue Src2
, Type
*Ty
) {
121 switch (Ty
->getTypeID()) {
122 IMPLEMENT_BINARY_OPERATOR(-, Float
);
123 IMPLEMENT_BINARY_OPERATOR(-, Double
);
125 dbgs() << "Unhandled type for FSub instruction: " << *Ty
<< "\n";
126 llvm_unreachable(nullptr);
130 static void executeFMulInst(GenericValue
&Dest
, GenericValue Src1
,
131 GenericValue Src2
, Type
*Ty
) {
132 switch (Ty
->getTypeID()) {
133 IMPLEMENT_BINARY_OPERATOR(*, Float
);
134 IMPLEMENT_BINARY_OPERATOR(*, Double
);
136 dbgs() << "Unhandled type for FMul instruction: " << *Ty
<< "\n";
137 llvm_unreachable(nullptr);
141 static void executeFDivInst(GenericValue
&Dest
, GenericValue Src1
,
142 GenericValue Src2
, Type
*Ty
) {
143 switch (Ty
->getTypeID()) {
144 IMPLEMENT_BINARY_OPERATOR(/, Float
);
145 IMPLEMENT_BINARY_OPERATOR(/, Double
);
147 dbgs() << "Unhandled type for FDiv instruction: " << *Ty
<< "\n";
148 llvm_unreachable(nullptr);
152 static void executeFRemInst(GenericValue
&Dest
, GenericValue Src1
,
153 GenericValue Src2
, Type
*Ty
) {
154 switch (Ty
->getTypeID()) {
155 case Type::FloatTyID
:
156 Dest
.FloatVal
= fmod(Src1
.FloatVal
, Src2
.FloatVal
);
158 case Type::DoubleTyID
:
159 Dest
.DoubleVal
= fmod(Src1
.DoubleVal
, Src2
.DoubleVal
);
162 dbgs() << "Unhandled type for Rem instruction: " << *Ty
<< "\n";
163 llvm_unreachable(nullptr);
167 #define IMPLEMENT_INTEGER_ICMP(OP, TY) \
168 case Type::IntegerTyID: \
169 Dest.IntVal = APInt(1,Src1.IntVal.OP(Src2.IntVal)); \
172 #define IMPLEMENT_VECTOR_INTEGER_ICMP(OP, TY) \
173 case Type::FixedVectorTyID: \
174 case Type::ScalableVectorTyID: { \
175 assert(Src1.AggregateVal.size() == Src2.AggregateVal.size()); \
176 Dest.AggregateVal.resize(Src1.AggregateVal.size()); \
177 for (uint32_t _i = 0; _i < Src1.AggregateVal.size(); _i++) \
178 Dest.AggregateVal[_i].IntVal = APInt( \
179 1, Src1.AggregateVal[_i].IntVal.OP(Src2.AggregateVal[_i].IntVal)); \
182 // Handle pointers specially because they must be compared with only as much
183 // width as the host has. We _do not_ want to be comparing 64 bit values when
184 // running on a 32-bit target, otherwise the upper 32 bits might mess up
185 // comparisons if they contain garbage.
186 #define IMPLEMENT_POINTER_ICMP(OP) \
187 case Type::PointerTyID: \
188 Dest.IntVal = APInt(1,(void*)(intptr_t)Src1.PointerVal OP \
189 (void*)(intptr_t)Src2.PointerVal); \
192 static GenericValue
executeICMP_EQ(GenericValue Src1
, GenericValue Src2
,
195 switch (Ty
->getTypeID()) {
196 IMPLEMENT_INTEGER_ICMP(eq
,Ty
);
197 IMPLEMENT_VECTOR_INTEGER_ICMP(eq
,Ty
);
198 IMPLEMENT_POINTER_ICMP(==);
200 dbgs() << "Unhandled type for ICMP_EQ predicate: " << *Ty
<< "\n";
201 llvm_unreachable(nullptr);
206 static GenericValue
executeICMP_NE(GenericValue Src1
, GenericValue Src2
,
209 switch (Ty
->getTypeID()) {
210 IMPLEMENT_INTEGER_ICMP(ne
,Ty
);
211 IMPLEMENT_VECTOR_INTEGER_ICMP(ne
,Ty
);
212 IMPLEMENT_POINTER_ICMP(!=);
214 dbgs() << "Unhandled type for ICMP_NE predicate: " << *Ty
<< "\n";
215 llvm_unreachable(nullptr);
220 static GenericValue
executeICMP_ULT(GenericValue Src1
, GenericValue Src2
,
223 switch (Ty
->getTypeID()) {
224 IMPLEMENT_INTEGER_ICMP(ult
,Ty
);
225 IMPLEMENT_VECTOR_INTEGER_ICMP(ult
,Ty
);
226 IMPLEMENT_POINTER_ICMP(<);
228 dbgs() << "Unhandled type for ICMP_ULT predicate: " << *Ty
<< "\n";
229 llvm_unreachable(nullptr);
234 static GenericValue
executeICMP_SLT(GenericValue Src1
, GenericValue Src2
,
237 switch (Ty
->getTypeID()) {
238 IMPLEMENT_INTEGER_ICMP(slt
,Ty
);
239 IMPLEMENT_VECTOR_INTEGER_ICMP(slt
,Ty
);
240 IMPLEMENT_POINTER_ICMP(<);
242 dbgs() << "Unhandled type for ICMP_SLT predicate: " << *Ty
<< "\n";
243 llvm_unreachable(nullptr);
248 static GenericValue
executeICMP_UGT(GenericValue Src1
, GenericValue Src2
,
251 switch (Ty
->getTypeID()) {
252 IMPLEMENT_INTEGER_ICMP(ugt
,Ty
);
253 IMPLEMENT_VECTOR_INTEGER_ICMP(ugt
,Ty
);
254 IMPLEMENT_POINTER_ICMP(>);
256 dbgs() << "Unhandled type for ICMP_UGT predicate: " << *Ty
<< "\n";
257 llvm_unreachable(nullptr);
262 static GenericValue
executeICMP_SGT(GenericValue Src1
, GenericValue Src2
,
265 switch (Ty
->getTypeID()) {
266 IMPLEMENT_INTEGER_ICMP(sgt
,Ty
);
267 IMPLEMENT_VECTOR_INTEGER_ICMP(sgt
,Ty
);
268 IMPLEMENT_POINTER_ICMP(>);
270 dbgs() << "Unhandled type for ICMP_SGT predicate: " << *Ty
<< "\n";
271 llvm_unreachable(nullptr);
276 static GenericValue
executeICMP_ULE(GenericValue Src1
, GenericValue Src2
,
279 switch (Ty
->getTypeID()) {
280 IMPLEMENT_INTEGER_ICMP(ule
,Ty
);
281 IMPLEMENT_VECTOR_INTEGER_ICMP(ule
,Ty
);
282 IMPLEMENT_POINTER_ICMP(<=);
284 dbgs() << "Unhandled type for ICMP_ULE predicate: " << *Ty
<< "\n";
285 llvm_unreachable(nullptr);
290 static GenericValue
executeICMP_SLE(GenericValue Src1
, GenericValue Src2
,
293 switch (Ty
->getTypeID()) {
294 IMPLEMENT_INTEGER_ICMP(sle
,Ty
);
295 IMPLEMENT_VECTOR_INTEGER_ICMP(sle
,Ty
);
296 IMPLEMENT_POINTER_ICMP(<=);
298 dbgs() << "Unhandled type for ICMP_SLE predicate: " << *Ty
<< "\n";
299 llvm_unreachable(nullptr);
304 static GenericValue
executeICMP_UGE(GenericValue Src1
, GenericValue Src2
,
307 switch (Ty
->getTypeID()) {
308 IMPLEMENT_INTEGER_ICMP(uge
,Ty
);
309 IMPLEMENT_VECTOR_INTEGER_ICMP(uge
,Ty
);
310 IMPLEMENT_POINTER_ICMP(>=);
312 dbgs() << "Unhandled type for ICMP_UGE predicate: " << *Ty
<< "\n";
313 llvm_unreachable(nullptr);
318 static GenericValue
executeICMP_SGE(GenericValue Src1
, GenericValue Src2
,
321 switch (Ty
->getTypeID()) {
322 IMPLEMENT_INTEGER_ICMP(sge
,Ty
);
323 IMPLEMENT_VECTOR_INTEGER_ICMP(sge
,Ty
);
324 IMPLEMENT_POINTER_ICMP(>=);
326 dbgs() << "Unhandled type for ICMP_SGE predicate: " << *Ty
<< "\n";
327 llvm_unreachable(nullptr);
332 void Interpreter::visitICmpInst(ICmpInst
&I
) {
333 ExecutionContext
&SF
= ECStack
.back();
334 Type
*Ty
= I
.getOperand(0)->getType();
335 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
336 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
337 GenericValue R
; // Result
339 switch (I
.getPredicate()) {
340 case ICmpInst::ICMP_EQ
: R
= executeICMP_EQ(Src1
, Src2
, Ty
); break;
341 case ICmpInst::ICMP_NE
: R
= executeICMP_NE(Src1
, Src2
, Ty
); break;
342 case ICmpInst::ICMP_ULT
: R
= executeICMP_ULT(Src1
, Src2
, Ty
); break;
343 case ICmpInst::ICMP_SLT
: R
= executeICMP_SLT(Src1
, Src2
, Ty
); break;
344 case ICmpInst::ICMP_UGT
: R
= executeICMP_UGT(Src1
, Src2
, Ty
); break;
345 case ICmpInst::ICMP_SGT
: R
= executeICMP_SGT(Src1
, Src2
, Ty
); break;
346 case ICmpInst::ICMP_ULE
: R
= executeICMP_ULE(Src1
, Src2
, Ty
); break;
347 case ICmpInst::ICMP_SLE
: R
= executeICMP_SLE(Src1
, Src2
, Ty
); break;
348 case ICmpInst::ICMP_UGE
: R
= executeICMP_UGE(Src1
, Src2
, Ty
); break;
349 case ICmpInst::ICMP_SGE
: R
= executeICMP_SGE(Src1
, Src2
, Ty
); break;
351 dbgs() << "Don't know how to handle this ICmp predicate!\n-->" << I
;
352 llvm_unreachable(nullptr);
358 #define IMPLEMENT_FCMP(OP, TY) \
359 case Type::TY##TyID: \
360 Dest.IntVal = APInt(1,Src1.TY##Val OP Src2.TY##Val); \
363 #define IMPLEMENT_VECTOR_FCMP_T(OP, TY) \
364 assert(Src1.AggregateVal.size() == Src2.AggregateVal.size()); \
365 Dest.AggregateVal.resize( Src1.AggregateVal.size() ); \
366 for( uint32_t _i=0;_i<Src1.AggregateVal.size();_i++) \
367 Dest.AggregateVal[_i].IntVal = APInt(1, \
368 Src1.AggregateVal[_i].TY##Val OP Src2.AggregateVal[_i].TY##Val);\
371 #define IMPLEMENT_VECTOR_FCMP(OP) \
372 case Type::FixedVectorTyID: \
373 case Type::ScalableVectorTyID: \
374 if (cast<VectorType>(Ty)->getElementType()->isFloatTy()) { \
375 IMPLEMENT_VECTOR_FCMP_T(OP, Float); \
377 IMPLEMENT_VECTOR_FCMP_T(OP, Double); \
380 static GenericValue
executeFCMP_OEQ(GenericValue Src1
, GenericValue Src2
,
383 switch (Ty
->getTypeID()) {
384 IMPLEMENT_FCMP(==, Float
);
385 IMPLEMENT_FCMP(==, Double
);
386 IMPLEMENT_VECTOR_FCMP(==);
388 dbgs() << "Unhandled type for FCmp EQ instruction: " << *Ty
<< "\n";
389 llvm_unreachable(nullptr);
394 #define IMPLEMENT_SCALAR_NANS(TY, X,Y) \
395 if (TY->isFloatTy()) { \
396 if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) { \
397 Dest.IntVal = APInt(1,false); \
401 if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) { \
402 Dest.IntVal = APInt(1,false); \
407 #define MASK_VECTOR_NANS_T(X,Y, TZ, FLAG) \
408 assert(X.AggregateVal.size() == Y.AggregateVal.size()); \
409 Dest.AggregateVal.resize( X.AggregateVal.size() ); \
410 for( uint32_t _i=0;_i<X.AggregateVal.size();_i++) { \
411 if (X.AggregateVal[_i].TZ##Val != X.AggregateVal[_i].TZ##Val || \
412 Y.AggregateVal[_i].TZ##Val != Y.AggregateVal[_i].TZ##Val) \
413 Dest.AggregateVal[_i].IntVal = APInt(1,FLAG); \
415 Dest.AggregateVal[_i].IntVal = APInt(1,!FLAG); \
419 #define MASK_VECTOR_NANS(TY, X,Y, FLAG) \
420 if (TY->isVectorTy()) { \
421 if (cast<VectorType>(TY)->getElementType()->isFloatTy()) { \
422 MASK_VECTOR_NANS_T(X, Y, Float, FLAG) \
424 MASK_VECTOR_NANS_T(X, Y, Double, FLAG) \
430 static GenericValue executeFCMP_ONE(GenericValue Src1, GenericValue Src2,
434 // if input is scalar value and Src1 or Src2 is NaN return false
435 IMPLEMENT_SCALAR_NANS(Ty
, Src1
, Src2
)
436 // if vector input detect NaNs and fill mask
437 MASK_VECTOR_NANS(Ty
, Src1
, Src2
, false)
438 GenericValue DestMask
= Dest
;
439 switch (Ty
->getTypeID()) {
440 IMPLEMENT_FCMP(!=, Float
);
441 IMPLEMENT_FCMP(!=, Double
);
442 IMPLEMENT_VECTOR_FCMP(!=);
444 dbgs() << "Unhandled type for FCmp NE instruction: " << *Ty
<< "\n";
445 llvm_unreachable(nullptr);
447 // in vector case mask out NaN elements
448 if (Ty
->isVectorTy())
449 for( size_t _i
=0; _i
<Src1
.AggregateVal
.size(); _i
++)
450 if (DestMask
.AggregateVal
[_i
].IntVal
== false)
451 Dest
.AggregateVal
[_i
].IntVal
= APInt(1,false);
456 static GenericValue
executeFCMP_OLE(GenericValue Src1
, GenericValue Src2
,
459 switch (Ty
->getTypeID()) {
460 IMPLEMENT_FCMP(<=, Float
);
461 IMPLEMENT_FCMP(<=, Double
);
462 IMPLEMENT_VECTOR_FCMP(<=);
464 dbgs() << "Unhandled type for FCmp LE instruction: " << *Ty
<< "\n";
465 llvm_unreachable(nullptr);
470 static GenericValue
executeFCMP_OGE(GenericValue Src1
, GenericValue Src2
,
473 switch (Ty
->getTypeID()) {
474 IMPLEMENT_FCMP(>=, Float
);
475 IMPLEMENT_FCMP(>=, Double
);
476 IMPLEMENT_VECTOR_FCMP(>=);
478 dbgs() << "Unhandled type for FCmp GE instruction: " << *Ty
<< "\n";
479 llvm_unreachable(nullptr);
484 static GenericValue
executeFCMP_OLT(GenericValue Src1
, GenericValue Src2
,
487 switch (Ty
->getTypeID()) {
488 IMPLEMENT_FCMP(<, Float
);
489 IMPLEMENT_FCMP(<, Double
);
490 IMPLEMENT_VECTOR_FCMP(<);
492 dbgs() << "Unhandled type for FCmp LT instruction: " << *Ty
<< "\n";
493 llvm_unreachable(nullptr);
498 static GenericValue
executeFCMP_OGT(GenericValue Src1
, GenericValue Src2
,
501 switch (Ty
->getTypeID()) {
502 IMPLEMENT_FCMP(>, Float
);
503 IMPLEMENT_FCMP(>, Double
);
504 IMPLEMENT_VECTOR_FCMP(>);
506 dbgs() << "Unhandled type for FCmp GT instruction: " << *Ty
<< "\n";
507 llvm_unreachable(nullptr);
512 #define IMPLEMENT_UNORDERED(TY, X,Y) \
513 if (TY->isFloatTy()) { \
514 if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) { \
515 Dest.IntVal = APInt(1,true); \
518 } else if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) { \
519 Dest.IntVal = APInt(1,true); \
523 #define IMPLEMENT_VECTOR_UNORDERED(TY, X, Y, FUNC) \
524 if (TY->isVectorTy()) { \
525 GenericValue DestMask = Dest; \
526 Dest = FUNC(Src1, Src2, Ty); \
527 for (size_t _i = 0; _i < Src1.AggregateVal.size(); _i++) \
528 if (DestMask.AggregateVal[_i].IntVal == true) \
529 Dest.AggregateVal[_i].IntVal = APInt(1, true); \
533 static GenericValue
executeFCMP_UEQ(GenericValue Src1
, GenericValue Src2
,
536 IMPLEMENT_UNORDERED(Ty
, Src1
, Src2
)
537 MASK_VECTOR_NANS(Ty
, Src1
, Src2
, true)
538 IMPLEMENT_VECTOR_UNORDERED(Ty
, Src1
, Src2
, executeFCMP_OEQ
)
539 return executeFCMP_OEQ(Src1
, Src2
, Ty
);
543 static GenericValue
executeFCMP_UNE(GenericValue Src1
, GenericValue Src2
,
546 IMPLEMENT_UNORDERED(Ty
, Src1
, Src2
)
547 MASK_VECTOR_NANS(Ty
, Src1
, Src2
, true)
548 IMPLEMENT_VECTOR_UNORDERED(Ty
, Src1
, Src2
, executeFCMP_ONE
)
549 return executeFCMP_ONE(Src1
, Src2
, Ty
);
552 static GenericValue
executeFCMP_ULE(GenericValue Src1
, GenericValue Src2
,
555 IMPLEMENT_UNORDERED(Ty
, Src1
, Src2
)
556 MASK_VECTOR_NANS(Ty
, Src1
, Src2
, true)
557 IMPLEMENT_VECTOR_UNORDERED(Ty
, Src1
, Src2
, executeFCMP_OLE
)
558 return executeFCMP_OLE(Src1
, Src2
, Ty
);
561 static GenericValue
executeFCMP_UGE(GenericValue Src1
, GenericValue Src2
,
564 IMPLEMENT_UNORDERED(Ty
, Src1
, Src2
)
565 MASK_VECTOR_NANS(Ty
, Src1
, Src2
, true)
566 IMPLEMENT_VECTOR_UNORDERED(Ty
, Src1
, Src2
, executeFCMP_OGE
)
567 return executeFCMP_OGE(Src1
, Src2
, Ty
);
570 static GenericValue
executeFCMP_ULT(GenericValue Src1
, GenericValue Src2
,
573 IMPLEMENT_UNORDERED(Ty
, Src1
, Src2
)
574 MASK_VECTOR_NANS(Ty
, Src1
, Src2
, true)
575 IMPLEMENT_VECTOR_UNORDERED(Ty
, Src1
, Src2
, executeFCMP_OLT
)
576 return executeFCMP_OLT(Src1
, Src2
, Ty
);
579 static GenericValue
executeFCMP_UGT(GenericValue Src1
, GenericValue Src2
,
582 IMPLEMENT_UNORDERED(Ty
, Src1
, Src2
)
583 MASK_VECTOR_NANS(Ty
, Src1
, Src2
, true)
584 IMPLEMENT_VECTOR_UNORDERED(Ty
, Src1
, Src2
, executeFCMP_OGT
)
585 return executeFCMP_OGT(Src1
, Src2
, Ty
);
588 static GenericValue
executeFCMP_ORD(GenericValue Src1
, GenericValue Src2
,
591 if(Ty
->isVectorTy()) {
592 assert(Src1
.AggregateVal
.size() == Src2
.AggregateVal
.size());
593 Dest
.AggregateVal
.resize( Src1
.AggregateVal
.size() );
594 if (cast
<VectorType
>(Ty
)->getElementType()->isFloatTy()) {
595 for( size_t _i
=0;_i
<Src1
.AggregateVal
.size();_i
++)
596 Dest
.AggregateVal
[_i
].IntVal
= APInt(1,
597 ( (Src1
.AggregateVal
[_i
].FloatVal
==
598 Src1
.AggregateVal
[_i
].FloatVal
) &&
599 (Src2
.AggregateVal
[_i
].FloatVal
==
600 Src2
.AggregateVal
[_i
].FloatVal
)));
602 for( size_t _i
=0;_i
<Src1
.AggregateVal
.size();_i
++)
603 Dest
.AggregateVal
[_i
].IntVal
= APInt(1,
604 ( (Src1
.AggregateVal
[_i
].DoubleVal
==
605 Src1
.AggregateVal
[_i
].DoubleVal
) &&
606 (Src2
.AggregateVal
[_i
].DoubleVal
==
607 Src2
.AggregateVal
[_i
].DoubleVal
)));
609 } else if (Ty
->isFloatTy())
610 Dest
.IntVal
= APInt(1,(Src1
.FloatVal
== Src1
.FloatVal
&&
611 Src2
.FloatVal
== Src2
.FloatVal
));
613 Dest
.IntVal
= APInt(1,(Src1
.DoubleVal
== Src1
.DoubleVal
&&
614 Src2
.DoubleVal
== Src2
.DoubleVal
));
619 static GenericValue
executeFCMP_UNO(GenericValue Src1
, GenericValue Src2
,
622 if(Ty
->isVectorTy()) {
623 assert(Src1
.AggregateVal
.size() == Src2
.AggregateVal
.size());
624 Dest
.AggregateVal
.resize( Src1
.AggregateVal
.size() );
625 if (cast
<VectorType
>(Ty
)->getElementType()->isFloatTy()) {
626 for( size_t _i
=0;_i
<Src1
.AggregateVal
.size();_i
++)
627 Dest
.AggregateVal
[_i
].IntVal
= APInt(1,
628 ( (Src1
.AggregateVal
[_i
].FloatVal
!=
629 Src1
.AggregateVal
[_i
].FloatVal
) ||
630 (Src2
.AggregateVal
[_i
].FloatVal
!=
631 Src2
.AggregateVal
[_i
].FloatVal
)));
633 for( size_t _i
=0;_i
<Src1
.AggregateVal
.size();_i
++)
634 Dest
.AggregateVal
[_i
].IntVal
= APInt(1,
635 ( (Src1
.AggregateVal
[_i
].DoubleVal
!=
636 Src1
.AggregateVal
[_i
].DoubleVal
) ||
637 (Src2
.AggregateVal
[_i
].DoubleVal
!=
638 Src2
.AggregateVal
[_i
].DoubleVal
)));
640 } else if (Ty
->isFloatTy())
641 Dest
.IntVal
= APInt(1,(Src1
.FloatVal
!= Src1
.FloatVal
||
642 Src2
.FloatVal
!= Src2
.FloatVal
));
644 Dest
.IntVal
= APInt(1,(Src1
.DoubleVal
!= Src1
.DoubleVal
||
645 Src2
.DoubleVal
!= Src2
.DoubleVal
));
650 static GenericValue
executeFCMP_BOOL(GenericValue Src1
, GenericValue Src2
,
651 Type
*Ty
, const bool val
) {
653 if(Ty
->isVectorTy()) {
654 assert(Src1
.AggregateVal
.size() == Src2
.AggregateVal
.size());
655 Dest
.AggregateVal
.resize( Src1
.AggregateVal
.size() );
656 for( size_t _i
=0; _i
<Src1
.AggregateVal
.size(); _i
++)
657 Dest
.AggregateVal
[_i
].IntVal
= APInt(1,val
);
659 Dest
.IntVal
= APInt(1, val
);
665 void Interpreter::visitFCmpInst(FCmpInst
&I
) {
666 ExecutionContext
&SF
= ECStack
.back();
667 Type
*Ty
= I
.getOperand(0)->getType();
668 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
669 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
670 GenericValue R
; // Result
672 switch (I
.getPredicate()) {
674 dbgs() << "Don't know how to handle this FCmp predicate!\n-->" << I
;
675 llvm_unreachable(nullptr);
677 case FCmpInst::FCMP_FALSE
: R
= executeFCMP_BOOL(Src1
, Src2
, Ty
, false);
679 case FCmpInst::FCMP_TRUE
: R
= executeFCMP_BOOL(Src1
, Src2
, Ty
, true);
681 case FCmpInst::FCMP_ORD
: R
= executeFCMP_ORD(Src1
, Src2
, Ty
); break;
682 case FCmpInst::FCMP_UNO
: R
= executeFCMP_UNO(Src1
, Src2
, Ty
); break;
683 case FCmpInst::FCMP_UEQ
: R
= executeFCMP_UEQ(Src1
, Src2
, Ty
); break;
684 case FCmpInst::FCMP_OEQ
: R
= executeFCMP_OEQ(Src1
, Src2
, Ty
); break;
685 case FCmpInst::FCMP_UNE
: R
= executeFCMP_UNE(Src1
, Src2
, Ty
); break;
686 case FCmpInst::FCMP_ONE
: R
= executeFCMP_ONE(Src1
, Src2
, Ty
); break;
687 case FCmpInst::FCMP_ULT
: R
= executeFCMP_ULT(Src1
, Src2
, Ty
); break;
688 case FCmpInst::FCMP_OLT
: R
= executeFCMP_OLT(Src1
, Src2
, Ty
); break;
689 case FCmpInst::FCMP_UGT
: R
= executeFCMP_UGT(Src1
, Src2
, Ty
); break;
690 case FCmpInst::FCMP_OGT
: R
= executeFCMP_OGT(Src1
, Src2
, Ty
); break;
691 case FCmpInst::FCMP_ULE
: R
= executeFCMP_ULE(Src1
, Src2
, Ty
); break;
692 case FCmpInst::FCMP_OLE
: R
= executeFCMP_OLE(Src1
, Src2
, Ty
); break;
693 case FCmpInst::FCMP_UGE
: R
= executeFCMP_UGE(Src1
, Src2
, Ty
); break;
694 case FCmpInst::FCMP_OGE
: R
= executeFCMP_OGE(Src1
, Src2
, Ty
); break;
700 static GenericValue
executeCmpInst(unsigned predicate
, GenericValue Src1
,
701 GenericValue Src2
, Type
*Ty
) {
704 case ICmpInst::ICMP_EQ
: return executeICMP_EQ(Src1
, Src2
, Ty
);
705 case ICmpInst::ICMP_NE
: return executeICMP_NE(Src1
, Src2
, Ty
);
706 case ICmpInst::ICMP_UGT
: return executeICMP_UGT(Src1
, Src2
, Ty
);
707 case ICmpInst::ICMP_SGT
: return executeICMP_SGT(Src1
, Src2
, Ty
);
708 case ICmpInst::ICMP_ULT
: return executeICMP_ULT(Src1
, Src2
, Ty
);
709 case ICmpInst::ICMP_SLT
: return executeICMP_SLT(Src1
, Src2
, Ty
);
710 case ICmpInst::ICMP_UGE
: return executeICMP_UGE(Src1
, Src2
, Ty
);
711 case ICmpInst::ICMP_SGE
: return executeICMP_SGE(Src1
, Src2
, Ty
);
712 case ICmpInst::ICMP_ULE
: return executeICMP_ULE(Src1
, Src2
, Ty
);
713 case ICmpInst::ICMP_SLE
: return executeICMP_SLE(Src1
, Src2
, Ty
);
714 case FCmpInst::FCMP_ORD
: return executeFCMP_ORD(Src1
, Src2
, Ty
);
715 case FCmpInst::FCMP_UNO
: return executeFCMP_UNO(Src1
, Src2
, Ty
);
716 case FCmpInst::FCMP_OEQ
: return executeFCMP_OEQ(Src1
, Src2
, Ty
);
717 case FCmpInst::FCMP_UEQ
: return executeFCMP_UEQ(Src1
, Src2
, Ty
);
718 case FCmpInst::FCMP_ONE
: return executeFCMP_ONE(Src1
, Src2
, Ty
);
719 case FCmpInst::FCMP_UNE
: return executeFCMP_UNE(Src1
, Src2
, Ty
);
720 case FCmpInst::FCMP_OLT
: return executeFCMP_OLT(Src1
, Src2
, Ty
);
721 case FCmpInst::FCMP_ULT
: return executeFCMP_ULT(Src1
, Src2
, Ty
);
722 case FCmpInst::FCMP_OGT
: return executeFCMP_OGT(Src1
, Src2
, Ty
);
723 case FCmpInst::FCMP_UGT
: return executeFCMP_UGT(Src1
, Src2
, Ty
);
724 case FCmpInst::FCMP_OLE
: return executeFCMP_OLE(Src1
, Src2
, Ty
);
725 case FCmpInst::FCMP_ULE
: return executeFCMP_ULE(Src1
, Src2
, Ty
);
726 case FCmpInst::FCMP_OGE
: return executeFCMP_OGE(Src1
, Src2
, Ty
);
727 case FCmpInst::FCMP_UGE
: return executeFCMP_UGE(Src1
, Src2
, Ty
);
728 case FCmpInst::FCMP_FALSE
: return executeFCMP_BOOL(Src1
, Src2
, Ty
, false);
729 case FCmpInst::FCMP_TRUE
: return executeFCMP_BOOL(Src1
, Src2
, Ty
, true);
731 dbgs() << "Unhandled Cmp predicate\n";
732 llvm_unreachable(nullptr);
736 void Interpreter::visitBinaryOperator(BinaryOperator
&I
) {
737 ExecutionContext
&SF
= ECStack
.back();
738 Type
*Ty
= I
.getOperand(0)->getType();
739 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
740 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
741 GenericValue R
; // Result
743 // First process vector operation
744 if (Ty
->isVectorTy()) {
745 assert(Src1
.AggregateVal
.size() == Src2
.AggregateVal
.size());
746 R
.AggregateVal
.resize(Src1
.AggregateVal
.size());
748 // Macros to execute binary operation 'OP' over integer vectors
749 #define INTEGER_VECTOR_OPERATION(OP) \
750 for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
751 R.AggregateVal[i].IntVal = \
752 Src1.AggregateVal[i].IntVal OP Src2.AggregateVal[i].IntVal;
754 // Additional macros to execute binary operations udiv/sdiv/urem/srem since
755 // they have different notation.
756 #define INTEGER_VECTOR_FUNCTION(OP) \
757 for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
758 R.AggregateVal[i].IntVal = \
759 Src1.AggregateVal[i].IntVal.OP(Src2.AggregateVal[i].IntVal);
761 // Macros to execute binary operation 'OP' over floating point type TY
762 // (float or double) vectors
763 #define FLOAT_VECTOR_FUNCTION(OP, TY) \
764 for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
765 R.AggregateVal[i].TY = \
766 Src1.AggregateVal[i].TY OP Src2.AggregateVal[i].TY;
768 // Macros to choose appropriate TY: float or double and run operation
770 #define FLOAT_VECTOR_OP(OP) { \
771 if (cast<VectorType>(Ty)->getElementType()->isFloatTy()) \
772 FLOAT_VECTOR_FUNCTION(OP, FloatVal) \
774 if (cast<VectorType>(Ty)->getElementType()->isDoubleTy()) \
775 FLOAT_VECTOR_FUNCTION(OP, DoubleVal) \
777 dbgs() << "Unhandled type for OP instruction: " << *Ty << "\n"; \
778 llvm_unreachable(0); \
783 switch(I
.getOpcode()){
785 dbgs() << "Don't know how to handle this binary operator!\n-->" << I
;
786 llvm_unreachable(nullptr);
788 case Instruction::Add
: INTEGER_VECTOR_OPERATION(+) break;
789 case Instruction::Sub
: INTEGER_VECTOR_OPERATION(-) break;
790 case Instruction::Mul
: INTEGER_VECTOR_OPERATION(*) break;
791 case Instruction::UDiv
: INTEGER_VECTOR_FUNCTION(udiv
) break;
792 case Instruction::SDiv
: INTEGER_VECTOR_FUNCTION(sdiv
) break;
793 case Instruction::URem
: INTEGER_VECTOR_FUNCTION(urem
) break;
794 case Instruction::SRem
: INTEGER_VECTOR_FUNCTION(srem
) break;
795 case Instruction::And
: INTEGER_VECTOR_OPERATION(&) break;
796 case Instruction::Or
: INTEGER_VECTOR_OPERATION(|) break;
797 case Instruction::Xor
: INTEGER_VECTOR_OPERATION(^) break;
798 case Instruction::FAdd
: FLOAT_VECTOR_OP(+) break;
799 case Instruction::FSub
: FLOAT_VECTOR_OP(-) break;
800 case Instruction::FMul
: FLOAT_VECTOR_OP(*) break;
801 case Instruction::FDiv
: FLOAT_VECTOR_OP(/) break;
802 case Instruction::FRem
:
803 if (cast
<VectorType
>(Ty
)->getElementType()->isFloatTy())
804 for (unsigned i
= 0; i
< R
.AggregateVal
.size(); ++i
)
805 R
.AggregateVal
[i
].FloatVal
=
806 fmod(Src1
.AggregateVal
[i
].FloatVal
, Src2
.AggregateVal
[i
].FloatVal
);
808 if (cast
<VectorType
>(Ty
)->getElementType()->isDoubleTy())
809 for (unsigned i
= 0; i
< R
.AggregateVal
.size(); ++i
)
810 R
.AggregateVal
[i
].DoubleVal
=
811 fmod(Src1
.AggregateVal
[i
].DoubleVal
, Src2
.AggregateVal
[i
].DoubleVal
);
813 dbgs() << "Unhandled type for Rem instruction: " << *Ty
<< "\n";
814 llvm_unreachable(nullptr);
820 switch (I
.getOpcode()) {
822 dbgs() << "Don't know how to handle this binary operator!\n-->" << I
;
823 llvm_unreachable(nullptr);
825 case Instruction::Add
: R
.IntVal
= Src1
.IntVal
+ Src2
.IntVal
; break;
826 case Instruction::Sub
: R
.IntVal
= Src1
.IntVal
- Src2
.IntVal
; break;
827 case Instruction::Mul
: R
.IntVal
= Src1
.IntVal
* Src2
.IntVal
; break;
828 case Instruction::FAdd
: executeFAddInst(R
, Src1
, Src2
, Ty
); break;
829 case Instruction::FSub
: executeFSubInst(R
, Src1
, Src2
, Ty
); break;
830 case Instruction::FMul
: executeFMulInst(R
, Src1
, Src2
, Ty
); break;
831 case Instruction::FDiv
: executeFDivInst(R
, Src1
, Src2
, Ty
); break;
832 case Instruction::FRem
: executeFRemInst(R
, Src1
, Src2
, Ty
); break;
833 case Instruction::UDiv
: R
.IntVal
= Src1
.IntVal
.udiv(Src2
.IntVal
); break;
834 case Instruction::SDiv
: R
.IntVal
= Src1
.IntVal
.sdiv(Src2
.IntVal
); break;
835 case Instruction::URem
: R
.IntVal
= Src1
.IntVal
.urem(Src2
.IntVal
); break;
836 case Instruction::SRem
: R
.IntVal
= Src1
.IntVal
.srem(Src2
.IntVal
); break;
837 case Instruction::And
: R
.IntVal
= Src1
.IntVal
& Src2
.IntVal
; break;
838 case Instruction::Or
: R
.IntVal
= Src1
.IntVal
| Src2
.IntVal
; break;
839 case Instruction::Xor
: R
.IntVal
= Src1
.IntVal
^ Src2
.IntVal
; break;
845 static GenericValue
executeSelectInst(GenericValue Src1
, GenericValue Src2
,
846 GenericValue Src3
, Type
*Ty
) {
848 if(Ty
->isVectorTy()) {
849 assert(Src1
.AggregateVal
.size() == Src2
.AggregateVal
.size());
850 assert(Src2
.AggregateVal
.size() == Src3
.AggregateVal
.size());
851 Dest
.AggregateVal
.resize( Src1
.AggregateVal
.size() );
852 for (size_t i
= 0; i
< Src1
.AggregateVal
.size(); ++i
)
853 Dest
.AggregateVal
[i
] = (Src1
.AggregateVal
[i
].IntVal
== 0) ?
854 Src3
.AggregateVal
[i
] : Src2
.AggregateVal
[i
];
856 Dest
= (Src1
.IntVal
== 0) ? Src3
: Src2
;
861 void Interpreter::visitSelectInst(SelectInst
&I
) {
862 ExecutionContext
&SF
= ECStack
.back();
863 Type
* Ty
= I
.getOperand(0)->getType();
864 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
865 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
866 GenericValue Src3
= getOperandValue(I
.getOperand(2), SF
);
867 GenericValue R
= executeSelectInst(Src1
, Src2
, Src3
, Ty
);
871 //===----------------------------------------------------------------------===//
872 // Terminator Instruction Implementations
873 //===----------------------------------------------------------------------===//
875 void Interpreter::exitCalled(GenericValue GV
) {
876 // runAtExitHandlers() assumes there are no stack frames, but
877 // if exit() was called, then it had a stack frame. Blow away
878 // the stack before interpreting atexit handlers.
881 exit(GV
.IntVal
.zextOrTrunc(32).getZExtValue());
884 /// Pop the last stack frame off of ECStack and then copy the result
885 /// back into the result variable if we are not returning void. The
886 /// result variable may be the ExitValue, or the Value of the calling
887 /// CallInst if there was a previous stack frame. This method may
888 /// invalidate any ECStack iterators you have. This method also takes
889 /// care of switching to the normal destination BB, if we are returning
892 void Interpreter::popStackAndReturnValueToCaller(Type
*RetTy
,
893 GenericValue Result
) {
894 // Pop the current stack frame.
897 if (ECStack
.empty()) { // Finished main. Put result into exit code...
898 if (RetTy
&& !RetTy
->isVoidTy()) { // Nonvoid return type?
899 ExitValue
= Result
; // Capture the exit value of the program
901 memset(&ExitValue
.Untyped
, 0, sizeof(ExitValue
.Untyped
));
904 // If we have a previous stack frame, and we have a previous call,
905 // fill in the return value...
906 ExecutionContext
&CallingSF
= ECStack
.back();
907 if (CallingSF
.Caller
) {
909 if (!CallingSF
.Caller
->getType()->isVoidTy())
910 SetValue(CallingSF
.Caller
, Result
, CallingSF
);
911 if (InvokeInst
*II
= dyn_cast
<InvokeInst
>(CallingSF
.Caller
))
912 SwitchToNewBasicBlock (II
->getNormalDest (), CallingSF
);
913 CallingSF
.Caller
= nullptr; // We returned from the call...
918 void Interpreter::visitReturnInst(ReturnInst
&I
) {
919 ExecutionContext
&SF
= ECStack
.back();
920 Type
*RetTy
= Type::getVoidTy(I
.getContext());
923 // Save away the return value... (if we are not 'ret void')
924 if (I
.getNumOperands()) {
925 RetTy
= I
.getReturnValue()->getType();
926 Result
= getOperandValue(I
.getReturnValue(), SF
);
929 popStackAndReturnValueToCaller(RetTy
, Result
);
932 void Interpreter::visitUnreachableInst(UnreachableInst
&I
) {
933 report_fatal_error("Program executed an 'unreachable' instruction!");
936 void Interpreter::visitBranchInst(BranchInst
&I
) {
937 ExecutionContext
&SF
= ECStack
.back();
940 Dest
= I
.getSuccessor(0); // Uncond branches have a fixed dest...
941 if (!I
.isUnconditional()) {
942 Value
*Cond
= I
.getCondition();
943 if (getOperandValue(Cond
, SF
).IntVal
== 0) // If false cond...
944 Dest
= I
.getSuccessor(1);
946 SwitchToNewBasicBlock(Dest
, SF
);
949 void Interpreter::visitSwitchInst(SwitchInst
&I
) {
950 ExecutionContext
&SF
= ECStack
.back();
951 Value
* Cond
= I
.getCondition();
952 Type
*ElTy
= Cond
->getType();
953 GenericValue CondVal
= getOperandValue(Cond
, SF
);
955 // Check to see if any of the cases match...
956 BasicBlock
*Dest
= nullptr;
957 for (auto Case
: I
.cases()) {
958 GenericValue CaseVal
= getOperandValue(Case
.getCaseValue(), SF
);
959 if (executeICMP_EQ(CondVal
, CaseVal
, ElTy
).IntVal
!= 0) {
960 Dest
= cast
<BasicBlock
>(Case
.getCaseSuccessor());
964 if (!Dest
) Dest
= I
.getDefaultDest(); // No cases matched: use default
965 SwitchToNewBasicBlock(Dest
, SF
);
968 void Interpreter::visitIndirectBrInst(IndirectBrInst
&I
) {
969 ExecutionContext
&SF
= ECStack
.back();
970 void *Dest
= GVTOP(getOperandValue(I
.getAddress(), SF
));
971 SwitchToNewBasicBlock((BasicBlock
*)Dest
, SF
);
975 // SwitchToNewBasicBlock - This method is used to jump to a new basic block.
976 // This function handles the actual updating of block and instruction iterators
977 // as well as execution of all of the PHI nodes in the destination block.
979 // This method does this because all of the PHI nodes must be executed
980 // atomically, reading their inputs before any of the results are updated. Not
981 // doing this can cause problems if the PHI nodes depend on other PHI nodes for
982 // their inputs. If the input PHI node is updated before it is read, incorrect
983 // results can happen. Thus we use a two phase approach.
985 void Interpreter::SwitchToNewBasicBlock(BasicBlock
*Dest
, ExecutionContext
&SF
){
986 BasicBlock
*PrevBB
= SF
.CurBB
; // Remember where we came from...
987 SF
.CurBB
= Dest
; // Update CurBB to branch destination
988 SF
.CurInst
= SF
.CurBB
->begin(); // Update new instruction ptr...
990 if (!isa
<PHINode
>(SF
.CurInst
)) return; // Nothing fancy to do
992 // Loop over all of the PHI nodes in the current block, reading their inputs.
993 std::vector
<GenericValue
> ResultValues
;
995 for (; PHINode
*PN
= dyn_cast
<PHINode
>(SF
.CurInst
); ++SF
.CurInst
) {
996 // Search for the value corresponding to this previous bb...
997 int i
= PN
->getBasicBlockIndex(PrevBB
);
998 assert(i
!= -1 && "PHINode doesn't contain entry for predecessor??");
999 Value
*IncomingValue
= PN
->getIncomingValue(i
);
1001 // Save the incoming value for this PHI node...
1002 ResultValues
.push_back(getOperandValue(IncomingValue
, SF
));
1005 // Now loop over all of the PHI nodes setting their values...
1006 SF
.CurInst
= SF
.CurBB
->begin();
1007 for (unsigned i
= 0; isa
<PHINode
>(SF
.CurInst
); ++SF
.CurInst
, ++i
) {
1008 PHINode
*PN
= cast
<PHINode
>(SF
.CurInst
);
1009 SetValue(PN
, ResultValues
[i
], SF
);
1013 //===----------------------------------------------------------------------===//
1014 // Memory Instruction Implementations
1015 //===----------------------------------------------------------------------===//
1017 void Interpreter::visitAllocaInst(AllocaInst
&I
) {
1018 ExecutionContext
&SF
= ECStack
.back();
1020 Type
*Ty
= I
.getAllocatedType(); // Type to be allocated
1022 // Get the number of elements being allocated by the array...
1023 unsigned NumElements
=
1024 getOperandValue(I
.getOperand(0), SF
).IntVal
.getZExtValue();
1026 unsigned TypeSize
= (size_t)getDataLayout().getTypeAllocSize(Ty
);
1028 // Avoid malloc-ing zero bytes, use max()...
1029 unsigned MemToAlloc
= std::max(1U, NumElements
* TypeSize
);
1031 // Allocate enough memory to hold the type...
1032 void *Memory
= safe_malloc(MemToAlloc
);
1034 LLVM_DEBUG(dbgs() << "Allocated Type: " << *Ty
<< " (" << TypeSize
1035 << " bytes) x " << NumElements
<< " (Total: " << MemToAlloc
1036 << ") at " << uintptr_t(Memory
) << '\n');
1038 GenericValue Result
= PTOGV(Memory
);
1039 assert(Result
.PointerVal
&& "Null pointer returned by malloc!");
1040 SetValue(&I
, Result
, SF
);
1042 if (I
.getOpcode() == Instruction::Alloca
)
1043 ECStack
.back().Allocas
.add(Memory
);
1046 // getElementOffset - The workhorse for getelementptr.
1048 GenericValue
Interpreter::executeGEPOperation(Value
*Ptr
, gep_type_iterator I
,
1049 gep_type_iterator E
,
1050 ExecutionContext
&SF
) {
1051 assert(Ptr
->getType()->isPointerTy() &&
1052 "Cannot getElementOffset of a nonpointer type!");
1056 for (; I
!= E
; ++I
) {
1057 if (StructType
*STy
= I
.getStructTypeOrNull()) {
1058 const StructLayout
*SLO
= getDataLayout().getStructLayout(STy
);
1060 const ConstantInt
*CPU
= cast
<ConstantInt
>(I
.getOperand());
1061 unsigned Index
= unsigned(CPU
->getZExtValue());
1063 Total
+= SLO
->getElementOffset(Index
);
1065 // Get the index number for the array... which must be long type...
1066 GenericValue IdxGV
= getOperandValue(I
.getOperand(), SF
);
1070 cast
<IntegerType
>(I
.getOperand()->getType())->getBitWidth();
1072 Idx
= (int64_t)(int32_t)IdxGV
.IntVal
.getZExtValue();
1074 assert(BitWidth
== 64 && "Invalid index type for getelementptr");
1075 Idx
= (int64_t)IdxGV
.IntVal
.getZExtValue();
1077 Total
+= I
.getSequentialElementStride(getDataLayout()) * Idx
;
1081 GenericValue Result
;
1082 Result
.PointerVal
= ((char*)getOperandValue(Ptr
, SF
).PointerVal
) + Total
;
1083 LLVM_DEBUG(dbgs() << "GEP Index " << Total
<< " bytes.\n");
1087 void Interpreter::visitGetElementPtrInst(GetElementPtrInst
&I
) {
1088 ExecutionContext
&SF
= ECStack
.back();
1089 SetValue(&I
, executeGEPOperation(I
.getPointerOperand(),
1090 gep_type_begin(I
), gep_type_end(I
), SF
), SF
);
1093 void Interpreter::visitLoadInst(LoadInst
&I
) {
1094 ExecutionContext
&SF
= ECStack
.back();
1095 GenericValue SRC
= getOperandValue(I
.getPointerOperand(), SF
);
1096 GenericValue
*Ptr
= (GenericValue
*)GVTOP(SRC
);
1097 GenericValue Result
;
1098 LoadValueFromMemory(Result
, Ptr
, I
.getType());
1099 SetValue(&I
, Result
, SF
);
1100 if (I
.isVolatile() && PrintVolatile
)
1101 dbgs() << "Volatile load " << I
;
1104 void Interpreter::visitStoreInst(StoreInst
&I
) {
1105 ExecutionContext
&SF
= ECStack
.back();
1106 GenericValue Val
= getOperandValue(I
.getOperand(0), SF
);
1107 GenericValue SRC
= getOperandValue(I
.getPointerOperand(), SF
);
1108 StoreValueToMemory(Val
, (GenericValue
*)GVTOP(SRC
),
1109 I
.getOperand(0)->getType());
1110 if (I
.isVolatile() && PrintVolatile
)
1111 dbgs() << "Volatile store: " << I
;
1114 //===----------------------------------------------------------------------===//
1115 // Miscellaneous Instruction Implementations
1116 //===----------------------------------------------------------------------===//
1118 void Interpreter::visitVAStartInst(VAStartInst
&I
) {
1119 ExecutionContext
&SF
= ECStack
.back();
1120 GenericValue ArgIndex
;
1121 ArgIndex
.UIntPairVal
.first
= ECStack
.size() - 1;
1122 ArgIndex
.UIntPairVal
.second
= 0;
1123 SetValue(&I
, ArgIndex
, SF
);
1126 void Interpreter::visitVAEndInst(VAEndInst
&I
) {
1127 // va_end is a noop for the interpreter
1130 void Interpreter::visitVACopyInst(VACopyInst
&I
) {
1131 ExecutionContext
&SF
= ECStack
.back();
1132 SetValue(&I
, getOperandValue(*I
.arg_begin(), SF
), SF
);
1135 void Interpreter::visitIntrinsicInst(IntrinsicInst
&I
) {
1136 ExecutionContext
&SF
= ECStack
.back();
1138 // If it is an unknown intrinsic function, use the intrinsic lowering
1139 // class to transform it into hopefully tasty LLVM code.
1141 BasicBlock::iterator
Me(&I
);
1142 BasicBlock
*Parent
= I
.getParent();
1143 bool atBegin(Parent
->begin() == Me
);
1146 IL
->LowerIntrinsicCall(&I
);
1148 // Restore the CurInst pointer to the first instruction newly inserted, if
1151 SF
.CurInst
= Parent
->begin();
1158 void Interpreter::visitCallBase(CallBase
&I
) {
1159 ExecutionContext
&SF
= ECStack
.back();
1162 std::vector
<GenericValue
> ArgVals
;
1163 const unsigned NumArgs
= SF
.Caller
->arg_size();
1164 ArgVals
.reserve(NumArgs
);
1165 for (Value
*V
: SF
.Caller
->args())
1166 ArgVals
.push_back(getOperandValue(V
, SF
));
1168 // To handle indirect calls, we must get the pointer value from the argument
1169 // and treat it as a function pointer.
1170 GenericValue SRC
= getOperandValue(SF
.Caller
->getCalledOperand(), SF
);
1171 callFunction((Function
*)GVTOP(SRC
), ArgVals
);
1174 // auxiliary function for shift operations
1175 static unsigned getShiftAmount(uint64_t orgShiftAmount
,
1176 llvm::APInt valueToShift
) {
1177 unsigned valueWidth
= valueToShift
.getBitWidth();
1178 if (orgShiftAmount
< (uint64_t)valueWidth
)
1179 return orgShiftAmount
;
1180 // according to the llvm documentation, if orgShiftAmount > valueWidth,
1181 // the result is undfeined. but we do shift by this rule:
1182 return (NextPowerOf2(valueWidth
-1) - 1) & orgShiftAmount
;
1186 void Interpreter::visitShl(BinaryOperator
&I
) {
1187 ExecutionContext
&SF
= ECStack
.back();
1188 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
1189 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
1191 Type
*Ty
= I
.getType();
1193 if (Ty
->isVectorTy()) {
1194 uint32_t src1Size
= uint32_t(Src1
.AggregateVal
.size());
1195 assert(src1Size
== Src2
.AggregateVal
.size());
1196 for (unsigned i
= 0; i
< src1Size
; i
++) {
1197 GenericValue Result
;
1198 uint64_t shiftAmount
= Src2
.AggregateVal
[i
].IntVal
.getZExtValue();
1199 llvm::APInt valueToShift
= Src1
.AggregateVal
[i
].IntVal
;
1200 Result
.IntVal
= valueToShift
.shl(getShiftAmount(shiftAmount
, valueToShift
));
1201 Dest
.AggregateVal
.push_back(Result
);
1205 uint64_t shiftAmount
= Src2
.IntVal
.getZExtValue();
1206 llvm::APInt valueToShift
= Src1
.IntVal
;
1207 Dest
.IntVal
= valueToShift
.shl(getShiftAmount(shiftAmount
, valueToShift
));
1210 SetValue(&I
, Dest
, SF
);
1213 void Interpreter::visitLShr(BinaryOperator
&I
) {
1214 ExecutionContext
&SF
= ECStack
.back();
1215 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
1216 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
1218 Type
*Ty
= I
.getType();
1220 if (Ty
->isVectorTy()) {
1221 uint32_t src1Size
= uint32_t(Src1
.AggregateVal
.size());
1222 assert(src1Size
== Src2
.AggregateVal
.size());
1223 for (unsigned i
= 0; i
< src1Size
; i
++) {
1224 GenericValue Result
;
1225 uint64_t shiftAmount
= Src2
.AggregateVal
[i
].IntVal
.getZExtValue();
1226 llvm::APInt valueToShift
= Src1
.AggregateVal
[i
].IntVal
;
1227 Result
.IntVal
= valueToShift
.lshr(getShiftAmount(shiftAmount
, valueToShift
));
1228 Dest
.AggregateVal
.push_back(Result
);
1232 uint64_t shiftAmount
= Src2
.IntVal
.getZExtValue();
1233 llvm::APInt valueToShift
= Src1
.IntVal
;
1234 Dest
.IntVal
= valueToShift
.lshr(getShiftAmount(shiftAmount
, valueToShift
));
1237 SetValue(&I
, Dest
, SF
);
1240 void Interpreter::visitAShr(BinaryOperator
&I
) {
1241 ExecutionContext
&SF
= ECStack
.back();
1242 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
1243 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
1245 Type
*Ty
= I
.getType();
1247 if (Ty
->isVectorTy()) {
1248 size_t src1Size
= Src1
.AggregateVal
.size();
1249 assert(src1Size
== Src2
.AggregateVal
.size());
1250 for (unsigned i
= 0; i
< src1Size
; i
++) {
1251 GenericValue Result
;
1252 uint64_t shiftAmount
= Src2
.AggregateVal
[i
].IntVal
.getZExtValue();
1253 llvm::APInt valueToShift
= Src1
.AggregateVal
[i
].IntVal
;
1254 Result
.IntVal
= valueToShift
.ashr(getShiftAmount(shiftAmount
, valueToShift
));
1255 Dest
.AggregateVal
.push_back(Result
);
1259 uint64_t shiftAmount
= Src2
.IntVal
.getZExtValue();
1260 llvm::APInt valueToShift
= Src1
.IntVal
;
1261 Dest
.IntVal
= valueToShift
.ashr(getShiftAmount(shiftAmount
, valueToShift
));
1264 SetValue(&I
, Dest
, SF
);
1267 GenericValue
Interpreter::executeTruncInst(Value
*SrcVal
, Type
*DstTy
,
1268 ExecutionContext
&SF
) {
1269 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1270 Type
*SrcTy
= SrcVal
->getType();
1271 if (SrcTy
->isVectorTy()) {
1272 Type
*DstVecTy
= DstTy
->getScalarType();
1273 unsigned DBitWidth
= cast
<IntegerType
>(DstVecTy
)->getBitWidth();
1274 unsigned NumElts
= Src
.AggregateVal
.size();
1275 // the sizes of src and dst vectors must be equal
1276 Dest
.AggregateVal
.resize(NumElts
);
1277 for (unsigned i
= 0; i
< NumElts
; i
++)
1278 Dest
.AggregateVal
[i
].IntVal
= Src
.AggregateVal
[i
].IntVal
.trunc(DBitWidth
);
1280 IntegerType
*DITy
= cast
<IntegerType
>(DstTy
);
1281 unsigned DBitWidth
= DITy
->getBitWidth();
1282 Dest
.IntVal
= Src
.IntVal
.trunc(DBitWidth
);
1287 GenericValue
Interpreter::executeSExtInst(Value
*SrcVal
, Type
*DstTy
,
1288 ExecutionContext
&SF
) {
1289 Type
*SrcTy
= SrcVal
->getType();
1290 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1291 if (SrcTy
->isVectorTy()) {
1292 Type
*DstVecTy
= DstTy
->getScalarType();
1293 unsigned DBitWidth
= cast
<IntegerType
>(DstVecTy
)->getBitWidth();
1294 unsigned size
= Src
.AggregateVal
.size();
1295 // the sizes of src and dst vectors must be equal.
1296 Dest
.AggregateVal
.resize(size
);
1297 for (unsigned i
= 0; i
< size
; i
++)
1298 Dest
.AggregateVal
[i
].IntVal
= Src
.AggregateVal
[i
].IntVal
.sext(DBitWidth
);
1300 auto *DITy
= cast
<IntegerType
>(DstTy
);
1301 unsigned DBitWidth
= DITy
->getBitWidth();
1302 Dest
.IntVal
= Src
.IntVal
.sext(DBitWidth
);
1307 GenericValue
Interpreter::executeZExtInst(Value
*SrcVal
, Type
*DstTy
,
1308 ExecutionContext
&SF
) {
1309 Type
*SrcTy
= SrcVal
->getType();
1310 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1311 if (SrcTy
->isVectorTy()) {
1312 Type
*DstVecTy
= DstTy
->getScalarType();
1313 unsigned DBitWidth
= cast
<IntegerType
>(DstVecTy
)->getBitWidth();
1315 unsigned size
= Src
.AggregateVal
.size();
1316 // the sizes of src and dst vectors must be equal.
1317 Dest
.AggregateVal
.resize(size
);
1318 for (unsigned i
= 0; i
< size
; i
++)
1319 Dest
.AggregateVal
[i
].IntVal
= Src
.AggregateVal
[i
].IntVal
.zext(DBitWidth
);
1321 auto *DITy
= cast
<IntegerType
>(DstTy
);
1322 unsigned DBitWidth
= DITy
->getBitWidth();
1323 Dest
.IntVal
= Src
.IntVal
.zext(DBitWidth
);
1328 GenericValue
Interpreter::executeFPTruncInst(Value
*SrcVal
, Type
*DstTy
,
1329 ExecutionContext
&SF
) {
1330 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1332 if (isa
<VectorType
>(SrcVal
->getType())) {
1333 assert(SrcVal
->getType()->getScalarType()->isDoubleTy() &&
1334 DstTy
->getScalarType()->isFloatTy() &&
1335 "Invalid FPTrunc instruction");
1337 unsigned size
= Src
.AggregateVal
.size();
1338 // the sizes of src and dst vectors must be equal.
1339 Dest
.AggregateVal
.resize(size
);
1340 for (unsigned i
= 0; i
< size
; i
++)
1341 Dest
.AggregateVal
[i
].FloatVal
= (float)Src
.AggregateVal
[i
].DoubleVal
;
1343 assert(SrcVal
->getType()->isDoubleTy() && DstTy
->isFloatTy() &&
1344 "Invalid FPTrunc instruction");
1345 Dest
.FloatVal
= (float)Src
.DoubleVal
;
1351 GenericValue
Interpreter::executeFPExtInst(Value
*SrcVal
, Type
*DstTy
,
1352 ExecutionContext
&SF
) {
1353 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1355 if (isa
<VectorType
>(SrcVal
->getType())) {
1356 assert(SrcVal
->getType()->getScalarType()->isFloatTy() &&
1357 DstTy
->getScalarType()->isDoubleTy() && "Invalid FPExt instruction");
1359 unsigned size
= Src
.AggregateVal
.size();
1360 // the sizes of src and dst vectors must be equal.
1361 Dest
.AggregateVal
.resize(size
);
1362 for (unsigned i
= 0; i
< size
; i
++)
1363 Dest
.AggregateVal
[i
].DoubleVal
= (double)Src
.AggregateVal
[i
].FloatVal
;
1365 assert(SrcVal
->getType()->isFloatTy() && DstTy
->isDoubleTy() &&
1366 "Invalid FPExt instruction");
1367 Dest
.DoubleVal
= (double)Src
.FloatVal
;
1373 GenericValue
Interpreter::executeFPToUIInst(Value
*SrcVal
, Type
*DstTy
,
1374 ExecutionContext
&SF
) {
1375 Type
*SrcTy
= SrcVal
->getType();
1376 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1378 if (isa
<VectorType
>(SrcTy
)) {
1379 Type
*DstVecTy
= DstTy
->getScalarType();
1380 Type
*SrcVecTy
= SrcTy
->getScalarType();
1381 uint32_t DBitWidth
= cast
<IntegerType
>(DstVecTy
)->getBitWidth();
1382 unsigned size
= Src
.AggregateVal
.size();
1383 // the sizes of src and dst vectors must be equal.
1384 Dest
.AggregateVal
.resize(size
);
1386 if (SrcVecTy
->getTypeID() == Type::FloatTyID
) {
1387 assert(SrcVecTy
->isFloatingPointTy() && "Invalid FPToUI instruction");
1388 for (unsigned i
= 0; i
< size
; i
++)
1389 Dest
.AggregateVal
[i
].IntVal
= APIntOps::RoundFloatToAPInt(
1390 Src
.AggregateVal
[i
].FloatVal
, DBitWidth
);
1392 for (unsigned i
= 0; i
< size
; i
++)
1393 Dest
.AggregateVal
[i
].IntVal
= APIntOps::RoundDoubleToAPInt(
1394 Src
.AggregateVal
[i
].DoubleVal
, DBitWidth
);
1398 uint32_t DBitWidth
= cast
<IntegerType
>(DstTy
)->getBitWidth();
1399 assert(SrcTy
->isFloatingPointTy() && "Invalid FPToUI instruction");
1401 if (SrcTy
->getTypeID() == Type::FloatTyID
)
1402 Dest
.IntVal
= APIntOps::RoundFloatToAPInt(Src
.FloatVal
, DBitWidth
);
1404 Dest
.IntVal
= APIntOps::RoundDoubleToAPInt(Src
.DoubleVal
, DBitWidth
);
1411 GenericValue
Interpreter::executeFPToSIInst(Value
*SrcVal
, Type
*DstTy
,
1412 ExecutionContext
&SF
) {
1413 Type
*SrcTy
= SrcVal
->getType();
1414 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1416 if (isa
<VectorType
>(SrcTy
)) {
1417 Type
*DstVecTy
= DstTy
->getScalarType();
1418 Type
*SrcVecTy
= SrcTy
->getScalarType();
1419 uint32_t DBitWidth
= cast
<IntegerType
>(DstVecTy
)->getBitWidth();
1420 unsigned size
= Src
.AggregateVal
.size();
1421 // the sizes of src and dst vectors must be equal
1422 Dest
.AggregateVal
.resize(size
);
1424 if (SrcVecTy
->getTypeID() == Type::FloatTyID
) {
1425 assert(SrcVecTy
->isFloatingPointTy() && "Invalid FPToSI instruction");
1426 for (unsigned i
= 0; i
< size
; i
++)
1427 Dest
.AggregateVal
[i
].IntVal
= APIntOps::RoundFloatToAPInt(
1428 Src
.AggregateVal
[i
].FloatVal
, DBitWidth
);
1430 for (unsigned i
= 0; i
< size
; i
++)
1431 Dest
.AggregateVal
[i
].IntVal
= APIntOps::RoundDoubleToAPInt(
1432 Src
.AggregateVal
[i
].DoubleVal
, DBitWidth
);
1436 unsigned DBitWidth
= cast
<IntegerType
>(DstTy
)->getBitWidth();
1437 assert(SrcTy
->isFloatingPointTy() && "Invalid FPToSI instruction");
1439 if (SrcTy
->getTypeID() == Type::FloatTyID
)
1440 Dest
.IntVal
= APIntOps::RoundFloatToAPInt(Src
.FloatVal
, DBitWidth
);
1442 Dest
.IntVal
= APIntOps::RoundDoubleToAPInt(Src
.DoubleVal
, DBitWidth
);
1448 GenericValue
Interpreter::executeUIToFPInst(Value
*SrcVal
, Type
*DstTy
,
1449 ExecutionContext
&SF
) {
1450 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1452 if (isa
<VectorType
>(SrcVal
->getType())) {
1453 Type
*DstVecTy
= DstTy
->getScalarType();
1454 unsigned size
= Src
.AggregateVal
.size();
1455 // the sizes of src and dst vectors must be equal
1456 Dest
.AggregateVal
.resize(size
);
1458 if (DstVecTy
->getTypeID() == Type::FloatTyID
) {
1459 assert(DstVecTy
->isFloatingPointTy() && "Invalid UIToFP instruction");
1460 for (unsigned i
= 0; i
< size
; i
++)
1461 Dest
.AggregateVal
[i
].FloatVal
=
1462 APIntOps::RoundAPIntToFloat(Src
.AggregateVal
[i
].IntVal
);
1464 for (unsigned i
= 0; i
< size
; i
++)
1465 Dest
.AggregateVal
[i
].DoubleVal
=
1466 APIntOps::RoundAPIntToDouble(Src
.AggregateVal
[i
].IntVal
);
1470 assert(DstTy
->isFloatingPointTy() && "Invalid UIToFP instruction");
1471 if (DstTy
->getTypeID() == Type::FloatTyID
)
1472 Dest
.FloatVal
= APIntOps::RoundAPIntToFloat(Src
.IntVal
);
1474 Dest
.DoubleVal
= APIntOps::RoundAPIntToDouble(Src
.IntVal
);
1480 GenericValue
Interpreter::executeSIToFPInst(Value
*SrcVal
, Type
*DstTy
,
1481 ExecutionContext
&SF
) {
1482 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1484 if (isa
<VectorType
>(SrcVal
->getType())) {
1485 Type
*DstVecTy
= DstTy
->getScalarType();
1486 unsigned size
= Src
.AggregateVal
.size();
1487 // the sizes of src and dst vectors must be equal
1488 Dest
.AggregateVal
.resize(size
);
1490 if (DstVecTy
->getTypeID() == Type::FloatTyID
) {
1491 assert(DstVecTy
->isFloatingPointTy() && "Invalid SIToFP instruction");
1492 for (unsigned i
= 0; i
< size
; i
++)
1493 Dest
.AggregateVal
[i
].FloatVal
=
1494 APIntOps::RoundSignedAPIntToFloat(Src
.AggregateVal
[i
].IntVal
);
1496 for (unsigned i
= 0; i
< size
; i
++)
1497 Dest
.AggregateVal
[i
].DoubleVal
=
1498 APIntOps::RoundSignedAPIntToDouble(Src
.AggregateVal
[i
].IntVal
);
1502 assert(DstTy
->isFloatingPointTy() && "Invalid SIToFP instruction");
1504 if (DstTy
->getTypeID() == Type::FloatTyID
)
1505 Dest
.FloatVal
= APIntOps::RoundSignedAPIntToFloat(Src
.IntVal
);
1507 Dest
.DoubleVal
= APIntOps::RoundSignedAPIntToDouble(Src
.IntVal
);
1514 GenericValue
Interpreter::executePtrToIntInst(Value
*SrcVal
, Type
*DstTy
,
1515 ExecutionContext
&SF
) {
1516 uint32_t DBitWidth
= cast
<IntegerType
>(DstTy
)->getBitWidth();
1517 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1518 assert(SrcVal
->getType()->isPointerTy() && "Invalid PtrToInt instruction");
1520 Dest
.IntVal
= APInt(DBitWidth
, (intptr_t) Src
.PointerVal
);
1524 GenericValue
Interpreter::executeIntToPtrInst(Value
*SrcVal
, Type
*DstTy
,
1525 ExecutionContext
&SF
) {
1526 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1527 assert(DstTy
->isPointerTy() && "Invalid PtrToInt instruction");
1529 uint32_t PtrSize
= getDataLayout().getPointerSizeInBits();
1530 if (PtrSize
!= Src
.IntVal
.getBitWidth())
1531 Src
.IntVal
= Src
.IntVal
.zextOrTrunc(PtrSize
);
1533 Dest
.PointerVal
= PointerTy(intptr_t(Src
.IntVal
.getZExtValue()));
1537 GenericValue
Interpreter::executeBitCastInst(Value
*SrcVal
, Type
*DstTy
,
1538 ExecutionContext
&SF
) {
1540 // This instruction supports bitwise conversion of vectors to integers and
1541 // to vectors of other types (as long as they have the same size)
1542 Type
*SrcTy
= SrcVal
->getType();
1543 GenericValue Dest
, Src
= getOperandValue(SrcVal
, SF
);
1545 if (isa
<VectorType
>(SrcTy
) || isa
<VectorType
>(DstTy
)) {
1546 // vector src bitcast to vector dst or vector src bitcast to scalar dst or
1547 // scalar src bitcast to vector dst
1548 bool isLittleEndian
= getDataLayout().isLittleEndian();
1549 GenericValue TempDst
, TempSrc
, SrcVec
;
1552 unsigned SrcBitSize
;
1553 unsigned DstBitSize
;
1557 if (isa
<VectorType
>(SrcTy
)) {
1558 SrcElemTy
= SrcTy
->getScalarType();
1559 SrcBitSize
= SrcTy
->getScalarSizeInBits();
1560 SrcNum
= Src
.AggregateVal
.size();
1563 // if src is scalar value, make it vector <1 x type>
1565 SrcBitSize
= SrcTy
->getPrimitiveSizeInBits();
1567 SrcVec
.AggregateVal
.push_back(Src
);
1570 if (isa
<VectorType
>(DstTy
)) {
1571 DstElemTy
= DstTy
->getScalarType();
1572 DstBitSize
= DstTy
->getScalarSizeInBits();
1573 DstNum
= (SrcNum
* SrcBitSize
) / DstBitSize
;
1576 DstBitSize
= DstTy
->getPrimitiveSizeInBits();
1580 if (SrcNum
* SrcBitSize
!= DstNum
* DstBitSize
)
1581 llvm_unreachable("Invalid BitCast");
1583 // If src is floating point, cast to integer first.
1584 TempSrc
.AggregateVal
.resize(SrcNum
);
1585 if (SrcElemTy
->isFloatTy()) {
1586 for (unsigned i
= 0; i
< SrcNum
; i
++)
1587 TempSrc
.AggregateVal
[i
].IntVal
=
1588 APInt::floatToBits(SrcVec
.AggregateVal
[i
].FloatVal
);
1590 } else if (SrcElemTy
->isDoubleTy()) {
1591 for (unsigned i
= 0; i
< SrcNum
; i
++)
1592 TempSrc
.AggregateVal
[i
].IntVal
=
1593 APInt::doubleToBits(SrcVec
.AggregateVal
[i
].DoubleVal
);
1594 } else if (SrcElemTy
->isIntegerTy()) {
1595 for (unsigned i
= 0; i
< SrcNum
; i
++)
1596 TempSrc
.AggregateVal
[i
].IntVal
= SrcVec
.AggregateVal
[i
].IntVal
;
1598 // Pointers are not allowed as the element type of vector.
1599 llvm_unreachable("Invalid Bitcast");
1602 // now TempSrc is integer type vector
1603 if (DstNum
< SrcNum
) {
1604 // Example: bitcast <4 x i32> <i32 0, i32 1, i32 2, i32 3> to <2 x i64>
1605 unsigned Ratio
= SrcNum
/ DstNum
;
1606 unsigned SrcElt
= 0;
1607 for (unsigned i
= 0; i
< DstNum
; i
++) {
1610 Elt
.IntVal
= Elt
.IntVal
.zext(DstBitSize
);
1611 unsigned ShiftAmt
= isLittleEndian
? 0 : SrcBitSize
* (Ratio
- 1);
1612 for (unsigned j
= 0; j
< Ratio
; j
++) {
1614 Tmp
= Tmp
.zext(SrcBitSize
);
1615 Tmp
= TempSrc
.AggregateVal
[SrcElt
++].IntVal
;
1616 Tmp
= Tmp
.zext(DstBitSize
);
1618 ShiftAmt
+= isLittleEndian
? SrcBitSize
: -SrcBitSize
;
1621 TempDst
.AggregateVal
.push_back(Elt
);
1624 // Example: bitcast <2 x i64> <i64 0, i64 1> to <4 x i32>
1625 unsigned Ratio
= DstNum
/ SrcNum
;
1626 for (unsigned i
= 0; i
< SrcNum
; i
++) {
1627 unsigned ShiftAmt
= isLittleEndian
? 0 : DstBitSize
* (Ratio
- 1);
1628 for (unsigned j
= 0; j
< Ratio
; j
++) {
1630 Elt
.IntVal
= Elt
.IntVal
.zext(SrcBitSize
);
1631 Elt
.IntVal
= TempSrc
.AggregateVal
[i
].IntVal
;
1632 Elt
.IntVal
.lshrInPlace(ShiftAmt
);
1633 // it could be DstBitSize == SrcBitSize, so check it
1634 if (DstBitSize
< SrcBitSize
)
1635 Elt
.IntVal
= Elt
.IntVal
.trunc(DstBitSize
);
1636 ShiftAmt
+= isLittleEndian
? DstBitSize
: -DstBitSize
;
1637 TempDst
.AggregateVal
.push_back(Elt
);
1642 // convert result from integer to specified type
1643 if (isa
<VectorType
>(DstTy
)) {
1644 if (DstElemTy
->isDoubleTy()) {
1645 Dest
.AggregateVal
.resize(DstNum
);
1646 for (unsigned i
= 0; i
< DstNum
; i
++)
1647 Dest
.AggregateVal
[i
].DoubleVal
=
1648 TempDst
.AggregateVal
[i
].IntVal
.bitsToDouble();
1649 } else if (DstElemTy
->isFloatTy()) {
1650 Dest
.AggregateVal
.resize(DstNum
);
1651 for (unsigned i
= 0; i
< DstNum
; i
++)
1652 Dest
.AggregateVal
[i
].FloatVal
=
1653 TempDst
.AggregateVal
[i
].IntVal
.bitsToFloat();
1658 if (DstElemTy
->isDoubleTy())
1659 Dest
.DoubleVal
= TempDst
.AggregateVal
[0].IntVal
.bitsToDouble();
1660 else if (DstElemTy
->isFloatTy()) {
1661 Dest
.FloatVal
= TempDst
.AggregateVal
[0].IntVal
.bitsToFloat();
1663 Dest
.IntVal
= TempDst
.AggregateVal
[0].IntVal
;
1666 } else { // if (isa<VectorType>(SrcTy)) || isa<VectorType>(DstTy))
1668 // scalar src bitcast to scalar dst
1669 if (DstTy
->isPointerTy()) {
1670 assert(SrcTy
->isPointerTy() && "Invalid BitCast");
1671 Dest
.PointerVal
= Src
.PointerVal
;
1672 } else if (DstTy
->isIntegerTy()) {
1673 if (SrcTy
->isFloatTy())
1674 Dest
.IntVal
= APInt::floatToBits(Src
.FloatVal
);
1675 else if (SrcTy
->isDoubleTy()) {
1676 Dest
.IntVal
= APInt::doubleToBits(Src
.DoubleVal
);
1677 } else if (SrcTy
->isIntegerTy()) {
1678 Dest
.IntVal
= Src
.IntVal
;
1680 llvm_unreachable("Invalid BitCast");
1682 } else if (DstTy
->isFloatTy()) {
1683 if (SrcTy
->isIntegerTy())
1684 Dest
.FloatVal
= Src
.IntVal
.bitsToFloat();
1686 Dest
.FloatVal
= Src
.FloatVal
;
1688 } else if (DstTy
->isDoubleTy()) {
1689 if (SrcTy
->isIntegerTy())
1690 Dest
.DoubleVal
= Src
.IntVal
.bitsToDouble();
1692 Dest
.DoubleVal
= Src
.DoubleVal
;
1695 llvm_unreachable("Invalid Bitcast");
1702 void Interpreter::visitTruncInst(TruncInst
&I
) {
1703 ExecutionContext
&SF
= ECStack
.back();
1704 SetValue(&I
, executeTruncInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1707 void Interpreter::visitSExtInst(SExtInst
&I
) {
1708 ExecutionContext
&SF
= ECStack
.back();
1709 SetValue(&I
, executeSExtInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1712 void Interpreter::visitZExtInst(ZExtInst
&I
) {
1713 ExecutionContext
&SF
= ECStack
.back();
1714 SetValue(&I
, executeZExtInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1717 void Interpreter::visitFPTruncInst(FPTruncInst
&I
) {
1718 ExecutionContext
&SF
= ECStack
.back();
1719 SetValue(&I
, executeFPTruncInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1722 void Interpreter::visitFPExtInst(FPExtInst
&I
) {
1723 ExecutionContext
&SF
= ECStack
.back();
1724 SetValue(&I
, executeFPExtInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1727 void Interpreter::visitUIToFPInst(UIToFPInst
&I
) {
1728 ExecutionContext
&SF
= ECStack
.back();
1729 SetValue(&I
, executeUIToFPInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1732 void Interpreter::visitSIToFPInst(SIToFPInst
&I
) {
1733 ExecutionContext
&SF
= ECStack
.back();
1734 SetValue(&I
, executeSIToFPInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1737 void Interpreter::visitFPToUIInst(FPToUIInst
&I
) {
1738 ExecutionContext
&SF
= ECStack
.back();
1739 SetValue(&I
, executeFPToUIInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1742 void Interpreter::visitFPToSIInst(FPToSIInst
&I
) {
1743 ExecutionContext
&SF
= ECStack
.back();
1744 SetValue(&I
, executeFPToSIInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1747 void Interpreter::visitPtrToIntInst(PtrToIntInst
&I
) {
1748 ExecutionContext
&SF
= ECStack
.back();
1749 SetValue(&I
, executePtrToIntInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1752 void Interpreter::visitIntToPtrInst(IntToPtrInst
&I
) {
1753 ExecutionContext
&SF
= ECStack
.back();
1754 SetValue(&I
, executeIntToPtrInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1757 void Interpreter::visitBitCastInst(BitCastInst
&I
) {
1758 ExecutionContext
&SF
= ECStack
.back();
1759 SetValue(&I
, executeBitCastInst(I
.getOperand(0), I
.getType(), SF
), SF
);
1762 #define IMPLEMENT_VAARG(TY) \
1763 case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break
1765 void Interpreter::visitVAArgInst(VAArgInst
&I
) {
1766 ExecutionContext
&SF
= ECStack
.back();
1768 // Get the incoming valist parameter. LLI treats the valist as a
1769 // (ec-stack-depth var-arg-index) pair.
1770 GenericValue VAList
= getOperandValue(I
.getOperand(0), SF
);
1772 GenericValue Src
= ECStack
[VAList
.UIntPairVal
.first
]
1773 .VarArgs
[VAList
.UIntPairVal
.second
];
1774 Type
*Ty
= I
.getType();
1775 switch (Ty
->getTypeID()) {
1776 case Type::IntegerTyID
:
1777 Dest
.IntVal
= Src
.IntVal
;
1779 IMPLEMENT_VAARG(Pointer
);
1780 IMPLEMENT_VAARG(Float
);
1781 IMPLEMENT_VAARG(Double
);
1783 dbgs() << "Unhandled dest type for vaarg instruction: " << *Ty
<< "\n";
1784 llvm_unreachable(nullptr);
1787 // Set the Value of this Instruction.
1788 SetValue(&I
, Dest
, SF
);
1790 // Move the pointer to the next vararg.
1791 ++VAList
.UIntPairVal
.second
;
1794 void Interpreter::visitExtractElementInst(ExtractElementInst
&I
) {
1795 ExecutionContext
&SF
= ECStack
.back();
1796 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
1797 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
1800 Type
*Ty
= I
.getType();
1801 const unsigned indx
= unsigned(Src2
.IntVal
.getZExtValue());
1803 if(Src1
.AggregateVal
.size() > indx
) {
1804 switch (Ty
->getTypeID()) {
1806 dbgs() << "Unhandled destination type for extractelement instruction: "
1808 llvm_unreachable(nullptr);
1810 case Type::IntegerTyID
:
1811 Dest
.IntVal
= Src1
.AggregateVal
[indx
].IntVal
;
1813 case Type::FloatTyID
:
1814 Dest
.FloatVal
= Src1
.AggregateVal
[indx
].FloatVal
;
1816 case Type::DoubleTyID
:
1817 Dest
.DoubleVal
= Src1
.AggregateVal
[indx
].DoubleVal
;
1821 dbgs() << "Invalid index in extractelement instruction\n";
1824 SetValue(&I
, Dest
, SF
);
1827 void Interpreter::visitInsertElementInst(InsertElementInst
&I
) {
1828 ExecutionContext
&SF
= ECStack
.back();
1829 VectorType
*Ty
= cast
<VectorType
>(I
.getType());
1831 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
1832 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
1833 GenericValue Src3
= getOperandValue(I
.getOperand(2), SF
);
1836 Type
*TyContained
= Ty
->getElementType();
1838 const unsigned indx
= unsigned(Src3
.IntVal
.getZExtValue());
1839 Dest
.AggregateVal
= Src1
.AggregateVal
;
1841 if(Src1
.AggregateVal
.size() <= indx
)
1842 llvm_unreachable("Invalid index in insertelement instruction");
1843 switch (TyContained
->getTypeID()) {
1845 llvm_unreachable("Unhandled dest type for insertelement instruction");
1846 case Type::IntegerTyID
:
1847 Dest
.AggregateVal
[indx
].IntVal
= Src2
.IntVal
;
1849 case Type::FloatTyID
:
1850 Dest
.AggregateVal
[indx
].FloatVal
= Src2
.FloatVal
;
1852 case Type::DoubleTyID
:
1853 Dest
.AggregateVal
[indx
].DoubleVal
= Src2
.DoubleVal
;
1856 SetValue(&I
, Dest
, SF
);
1859 void Interpreter::visitShuffleVectorInst(ShuffleVectorInst
&I
){
1860 ExecutionContext
&SF
= ECStack
.back();
1862 VectorType
*Ty
= cast
<VectorType
>(I
.getType());
1864 GenericValue Src1
= getOperandValue(I
.getOperand(0), SF
);
1865 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
1868 // There is no need to check types of src1 and src2, because the compiled
1869 // bytecode can't contain different types for src1 and src2 for a
1870 // shufflevector instruction.
1872 Type
*TyContained
= Ty
->getElementType();
1873 unsigned src1Size
= (unsigned)Src1
.AggregateVal
.size();
1874 unsigned src2Size
= (unsigned)Src2
.AggregateVal
.size();
1875 unsigned src3Size
= I
.getShuffleMask().size();
1877 Dest
.AggregateVal
.resize(src3Size
);
1879 switch (TyContained
->getTypeID()) {
1881 llvm_unreachable("Unhandled dest type for insertelement instruction");
1883 case Type::IntegerTyID
:
1884 for( unsigned i
=0; i
<src3Size
; i
++) {
1885 unsigned j
= std::max(0, I
.getMaskValue(i
));
1887 Dest
.AggregateVal
[i
].IntVal
= Src1
.AggregateVal
[j
].IntVal
;
1888 else if(j
< src1Size
+ src2Size
)
1889 Dest
.AggregateVal
[i
].IntVal
= Src2
.AggregateVal
[j
-src1Size
].IntVal
;
1891 // The selector may not be greater than sum of lengths of first and
1892 // second operands and llasm should not allow situation like
1893 // %tmp = shufflevector <2 x i32> <i32 3, i32 4>, <2 x i32> undef,
1894 // <2 x i32> < i32 0, i32 5 >,
1895 // where i32 5 is invalid, but let it be additional check here:
1896 llvm_unreachable("Invalid mask in shufflevector instruction");
1899 case Type::FloatTyID
:
1900 for( unsigned i
=0; i
<src3Size
; i
++) {
1901 unsigned j
= std::max(0, I
.getMaskValue(i
));
1903 Dest
.AggregateVal
[i
].FloatVal
= Src1
.AggregateVal
[j
].FloatVal
;
1904 else if(j
< src1Size
+ src2Size
)
1905 Dest
.AggregateVal
[i
].FloatVal
= Src2
.AggregateVal
[j
-src1Size
].FloatVal
;
1907 llvm_unreachable("Invalid mask in shufflevector instruction");
1910 case Type::DoubleTyID
:
1911 for( unsigned i
=0; i
<src3Size
; i
++) {
1912 unsigned j
= std::max(0, I
.getMaskValue(i
));
1914 Dest
.AggregateVal
[i
].DoubleVal
= Src1
.AggregateVal
[j
].DoubleVal
;
1915 else if(j
< src1Size
+ src2Size
)
1916 Dest
.AggregateVal
[i
].DoubleVal
=
1917 Src2
.AggregateVal
[j
-src1Size
].DoubleVal
;
1919 llvm_unreachable("Invalid mask in shufflevector instruction");
1923 SetValue(&I
, Dest
, SF
);
1926 void Interpreter::visitExtractValueInst(ExtractValueInst
&I
) {
1927 ExecutionContext
&SF
= ECStack
.back();
1928 Value
*Agg
= I
.getAggregateOperand();
1930 GenericValue Src
= getOperandValue(Agg
, SF
);
1932 ExtractValueInst::idx_iterator IdxBegin
= I
.idx_begin();
1933 unsigned Num
= I
.getNumIndices();
1934 GenericValue
*pSrc
= &Src
;
1936 for (unsigned i
= 0 ; i
< Num
; ++i
) {
1937 pSrc
= &pSrc
->AggregateVal
[*IdxBegin
];
1941 Type
*IndexedType
= ExtractValueInst::getIndexedType(Agg
->getType(), I
.getIndices());
1942 switch (IndexedType
->getTypeID()) {
1944 llvm_unreachable("Unhandled dest type for extractelement instruction");
1946 case Type::IntegerTyID
:
1947 Dest
.IntVal
= pSrc
->IntVal
;
1949 case Type::FloatTyID
:
1950 Dest
.FloatVal
= pSrc
->FloatVal
;
1952 case Type::DoubleTyID
:
1953 Dest
.DoubleVal
= pSrc
->DoubleVal
;
1955 case Type::ArrayTyID
:
1956 case Type::StructTyID
:
1957 case Type::FixedVectorTyID
:
1958 case Type::ScalableVectorTyID
:
1959 Dest
.AggregateVal
= pSrc
->AggregateVal
;
1961 case Type::PointerTyID
:
1962 Dest
.PointerVal
= pSrc
->PointerVal
;
1966 SetValue(&I
, Dest
, SF
);
1969 void Interpreter::visitInsertValueInst(InsertValueInst
&I
) {
1971 ExecutionContext
&SF
= ECStack
.back();
1972 Value
*Agg
= I
.getAggregateOperand();
1974 GenericValue Src1
= getOperandValue(Agg
, SF
);
1975 GenericValue Src2
= getOperandValue(I
.getOperand(1), SF
);
1976 GenericValue Dest
= Src1
; // Dest is a slightly changed Src1
1978 ExtractValueInst::idx_iterator IdxBegin
= I
.idx_begin();
1979 unsigned Num
= I
.getNumIndices();
1981 GenericValue
*pDest
= &Dest
;
1982 for (unsigned i
= 0 ; i
< Num
; ++i
) {
1983 pDest
= &pDest
->AggregateVal
[*IdxBegin
];
1986 // pDest points to the target value in the Dest now
1988 Type
*IndexedType
= ExtractValueInst::getIndexedType(Agg
->getType(), I
.getIndices());
1990 switch (IndexedType
->getTypeID()) {
1992 llvm_unreachable("Unhandled dest type for insertelement instruction");
1994 case Type::IntegerTyID
:
1995 pDest
->IntVal
= Src2
.IntVal
;
1997 case Type::FloatTyID
:
1998 pDest
->FloatVal
= Src2
.FloatVal
;
2000 case Type::DoubleTyID
:
2001 pDest
->DoubleVal
= Src2
.DoubleVal
;
2003 case Type::ArrayTyID
:
2004 case Type::StructTyID
:
2005 case Type::FixedVectorTyID
:
2006 case Type::ScalableVectorTyID
:
2007 pDest
->AggregateVal
= Src2
.AggregateVal
;
2009 case Type::PointerTyID
:
2010 pDest
->PointerVal
= Src2
.PointerVal
;
2014 SetValue(&I
, Dest
, SF
);
2017 GenericValue
Interpreter::getConstantExprValue (ConstantExpr
*CE
,
2018 ExecutionContext
&SF
) {
2019 switch (CE
->getOpcode()) {
2020 case Instruction::Trunc
:
2021 return executeTruncInst(CE
->getOperand(0), CE
->getType(), SF
);
2022 case Instruction::ZExt
:
2023 return executeZExtInst(CE
->getOperand(0), CE
->getType(), SF
);
2024 case Instruction::SExt
:
2025 return executeSExtInst(CE
->getOperand(0), CE
->getType(), SF
);
2026 case Instruction::FPTrunc
:
2027 return executeFPTruncInst(CE
->getOperand(0), CE
->getType(), SF
);
2028 case Instruction::FPExt
:
2029 return executeFPExtInst(CE
->getOperand(0), CE
->getType(), SF
);
2030 case Instruction::UIToFP
:
2031 return executeUIToFPInst(CE
->getOperand(0), CE
->getType(), SF
);
2032 case Instruction::SIToFP
:
2033 return executeSIToFPInst(CE
->getOperand(0), CE
->getType(), SF
);
2034 case Instruction::FPToUI
:
2035 return executeFPToUIInst(CE
->getOperand(0), CE
->getType(), SF
);
2036 case Instruction::FPToSI
:
2037 return executeFPToSIInst(CE
->getOperand(0), CE
->getType(), SF
);
2038 case Instruction::PtrToInt
:
2039 return executePtrToIntInst(CE
->getOperand(0), CE
->getType(), SF
);
2040 case Instruction::IntToPtr
:
2041 return executeIntToPtrInst(CE
->getOperand(0), CE
->getType(), SF
);
2042 case Instruction::BitCast
:
2043 return executeBitCastInst(CE
->getOperand(0), CE
->getType(), SF
);
2044 case Instruction::GetElementPtr
:
2045 return executeGEPOperation(CE
->getOperand(0), gep_type_begin(CE
),
2046 gep_type_end(CE
), SF
);
2047 case Instruction::FCmp
:
2048 case Instruction::ICmp
:
2049 return executeCmpInst(CE
->getPredicate(),
2050 getOperandValue(CE
->getOperand(0), SF
),
2051 getOperandValue(CE
->getOperand(1), SF
),
2052 CE
->getOperand(0)->getType());
2053 case Instruction::Select
:
2054 return executeSelectInst(getOperandValue(CE
->getOperand(0), SF
),
2055 getOperandValue(CE
->getOperand(1), SF
),
2056 getOperandValue(CE
->getOperand(2), SF
),
2057 CE
->getOperand(0)->getType());
2062 // The cases below here require a GenericValue parameter for the result
2063 // so we initialize one, compute it and then return it.
2064 GenericValue Op0
= getOperandValue(CE
->getOperand(0), SF
);
2065 GenericValue Op1
= getOperandValue(CE
->getOperand(1), SF
);
2067 Type
* Ty
= CE
->getOperand(0)->getType();
2068 switch (CE
->getOpcode()) {
2069 case Instruction::Add
: Dest
.IntVal
= Op0
.IntVal
+ Op1
.IntVal
; break;
2070 case Instruction::Sub
: Dest
.IntVal
= Op0
.IntVal
- Op1
.IntVal
; break;
2071 case Instruction::Mul
: Dest
.IntVal
= Op0
.IntVal
* Op1
.IntVal
; break;
2072 case Instruction::FAdd
: executeFAddInst(Dest
, Op0
, Op1
, Ty
); break;
2073 case Instruction::FSub
: executeFSubInst(Dest
, Op0
, Op1
, Ty
); break;
2074 case Instruction::FMul
: executeFMulInst(Dest
, Op0
, Op1
, Ty
); break;
2075 case Instruction::FDiv
: executeFDivInst(Dest
, Op0
, Op1
, Ty
); break;
2076 case Instruction::FRem
: executeFRemInst(Dest
, Op0
, Op1
, Ty
); break;
2077 case Instruction::SDiv
: Dest
.IntVal
= Op0
.IntVal
.sdiv(Op1
.IntVal
); break;
2078 case Instruction::UDiv
: Dest
.IntVal
= Op0
.IntVal
.udiv(Op1
.IntVal
); break;
2079 case Instruction::URem
: Dest
.IntVal
= Op0
.IntVal
.urem(Op1
.IntVal
); break;
2080 case Instruction::SRem
: Dest
.IntVal
= Op0
.IntVal
.srem(Op1
.IntVal
); break;
2081 case Instruction::And
: Dest
.IntVal
= Op0
.IntVal
& Op1
.IntVal
; break;
2082 case Instruction::Or
: Dest
.IntVal
= Op0
.IntVal
| Op1
.IntVal
; break;
2083 case Instruction::Xor
: Dest
.IntVal
= Op0
.IntVal
^ Op1
.IntVal
; break;
2084 case Instruction::Shl
:
2085 Dest
.IntVal
= Op0
.IntVal
.shl(Op1
.IntVal
.getZExtValue());
2087 case Instruction::LShr
:
2088 Dest
.IntVal
= Op0
.IntVal
.lshr(Op1
.IntVal
.getZExtValue());
2090 case Instruction::AShr
:
2091 Dest
.IntVal
= Op0
.IntVal
.ashr(Op1
.IntVal
.getZExtValue());
2094 dbgs() << "Unhandled ConstantExpr: " << *CE
<< "\n";
2095 llvm_unreachable("Unhandled ConstantExpr");
2100 GenericValue
Interpreter::getOperandValue(Value
*V
, ExecutionContext
&SF
) {
2101 if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(V
)) {
2102 return getConstantExprValue(CE
, SF
);
2103 } else if (Constant
*CPV
= dyn_cast
<Constant
>(V
)) {
2104 return getConstantValue(CPV
);
2105 } else if (GlobalValue
*GV
= dyn_cast
<GlobalValue
>(V
)) {
2106 return PTOGV(getPointerToGlobal(GV
));
2108 return SF
.Values
[V
];
2112 //===----------------------------------------------------------------------===//
2113 // Dispatch and Execution Code
2114 //===----------------------------------------------------------------------===//
2116 //===----------------------------------------------------------------------===//
2117 // callFunction - Execute the specified function...
2119 void Interpreter::callFunction(Function
*F
, ArrayRef
<GenericValue
> ArgVals
) {
2120 assert((ECStack
.empty() || !ECStack
.back().Caller
||
2121 ECStack
.back().Caller
->arg_size() == ArgVals
.size()) &&
2122 "Incorrect number of arguments passed into function call!");
2123 // Make a new stack frame... and fill it in.
2124 ECStack
.emplace_back();
2125 ExecutionContext
&StackFrame
= ECStack
.back();
2126 StackFrame
.CurFunction
= F
;
2128 // Special handling for external functions.
2129 if (F
->isDeclaration()) {
2130 GenericValue Result
= callExternalFunction (F
, ArgVals
);
2131 // Simulate a 'ret' instruction of the appropriate type.
2132 popStackAndReturnValueToCaller (F
->getReturnType (), Result
);
2136 // Get pointers to first LLVM BB & Instruction in function.
2137 StackFrame
.CurBB
= &F
->front();
2138 StackFrame
.CurInst
= StackFrame
.CurBB
->begin();
2140 // Run through the function arguments and initialize their values...
2141 assert((ArgVals
.size() == F
->arg_size() ||
2142 (ArgVals
.size() > F
->arg_size() && F
->getFunctionType()->isVarArg()))&&
2143 "Invalid number of values passed to function invocation!");
2145 // Handle non-varargs arguments...
2147 for (Function::arg_iterator AI
= F
->arg_begin(), E
= F
->arg_end();
2149 SetValue(&*AI
, ArgVals
[i
], StackFrame
);
2151 // Handle varargs arguments...
2152 StackFrame
.VarArgs
.assign(ArgVals
.begin()+i
, ArgVals
.end());
2156 void Interpreter::run() {
2157 while (!ECStack
.empty()) {
2158 // Interpret a single instruction & increment the "PC".
2159 ExecutionContext
&SF
= ECStack
.back(); // Current stack frame
2160 Instruction
&I
= *SF
.CurInst
++; // Increment before execute
2162 // Track the number of dynamic instructions executed.
2165 LLVM_DEBUG(dbgs() << "About to interpret: " << I
<< "\n");
2166 visit(I
); // Dispatch to one of the visit* methods...