blob: 383e809b18a2c3f8e9df6ae549d914639023b14b [file] [log] [blame]
Chris Lattner92101ac2001-08-23 17:05:04 +00001//===-- Execution.cpp - Implement code to simulate the program ------------===//
Misha Brukmand1c881a2005-04-21 22:43:08 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
Misha Brukmand1c881a2005-04-21 22:43:08 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Misha Brukmand1c881a2005-04-21 22:43:08 +00009//
Chris Lattner92101ac2001-08-23 17:05:04 +000010// This file contains the actual instruction interpreter.
11//
12//===----------------------------------------------------------------------===//
13
Brian Gaeke63438cc2003-12-11 00:22:59 +000014#define DEBUG_TYPE "interpreter"
Chris Lattner92101ac2001-08-23 17:05:04 +000015#include "Interpreter.h"
Chris Lattner31bcdb82002-04-28 19:55:58 +000016#include "llvm/Constants.h"
Chris Lattner73011782003-12-28 09:44:37 +000017#include "llvm/DerivedTypes.h"
18#include "llvm/Instructions.h"
Chris Lattner30483732004-06-20 07:49:54 +000019#include "llvm/CodeGen/IntrinsicLowering.h"
Chris Lattner4af6de82003-11-25 20:44:56 +000020#include "llvm/Support/GetElementPtrTypeIterator.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000021#include "llvm/ADT/Statistic.h"
22#include "llvm/Support/Debug.h"
Reid Spencera54b7cb2007-01-12 07:05:14 +000023#include "llvm/Support/MathExtras.h"
Jeff Cohen97af7512006-12-02 02:22:01 +000024#include <cmath>
Chris Lattner4af6de82003-11-25 20:44:56 +000025using namespace llvm;
Chris Lattnerfe11a972002-12-23 23:59:41 +000026
Chris Lattnercecf56b2006-12-19 22:56:53 +000027STATISTIC(NumDynamicInsts, "Number of dynamic instructions executed");
28static Interpreter *TheEE = 0;
Brian Gaeked0fde302003-11-11 22:41:34 +000029
Chris Lattner73011782003-12-28 09:44:37 +000030
Chris Lattner2e42d3a2001-10-15 05:51:48 +000031//===----------------------------------------------------------------------===//
Chris Lattner39bb5b42001-10-15 13:25:40 +000032// Value Manipulation code
33//===----------------------------------------------------------------------===//
Chris Lattner73011782003-12-28 09:44:37 +000034
Misha Brukmand1c881a2005-04-21 22:43:08 +000035static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2,
36 const Type *Ty);
37static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2,
38 const Type *Ty);
39static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2,
40 const Type *Ty);
Reid Spencer1628cec2006-10-26 06:15:43 +000041static GenericValue executeUDivInst(GenericValue Src1, GenericValue Src2,
42 const Type *Ty);
43static GenericValue executeSDivInst(GenericValue Src1, GenericValue Src2,
44 const Type *Ty);
45static GenericValue executeFDivInst(GenericValue Src1, GenericValue Src2,
46 const Type *Ty);
Reid Spencer0a783f72006-11-02 01:53:59 +000047static GenericValue executeURemInst(GenericValue Src1, GenericValue Src2,
48 const Type *Ty);
49static GenericValue executeSRemInst(GenericValue Src1, GenericValue Src2,
50 const Type *Ty);
51static GenericValue executeFRemInst(GenericValue Src1, GenericValue Src2,
52 const Type *Ty);
Misha Brukmand1c881a2005-04-21 22:43:08 +000053static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2,
54 const Type *Ty);
55static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2,
56 const Type *Ty);
57static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2,
58 const Type *Ty);
Reid Spencere4d87aa2006-12-23 06:05:41 +000059static GenericValue executeCmpInst(unsigned predicate, GenericValue Src1,
60 GenericValue Src2, const Type *Ty);
Misha Brukmand1c881a2005-04-21 22:43:08 +000061static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2,
62 const Type *Ty);
Reid Spencer3822ff52006-11-08 06:47:33 +000063static GenericValue executeLShrInst(GenericValue Src1, GenericValue Src2,
64 const Type *Ty);
65static GenericValue executeAShrInst(GenericValue Src1, GenericValue Src2,
66 const Type *Ty);
Misha Brukmand1c881a2005-04-21 22:43:08 +000067static GenericValue executeSelectInst(GenericValue Src1, GenericValue Src2,
Chris Lattner759d34f2004-04-20 16:43:21 +000068 GenericValue Src3);
69
Brian Gaeke63438cc2003-12-11 00:22:59 +000070GenericValue Interpreter::getConstantExprValue (ConstantExpr *CE,
71 ExecutionContext &SF) {
72 switch (CE->getOpcode()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +000073 case Instruction::Trunc:
74 return executeTruncInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000075 case Instruction::ZExt:
Reid Spencera54b7cb2007-01-12 07:05:14 +000076 return executeZExtInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000077 case Instruction::SExt:
Reid Spencera54b7cb2007-01-12 07:05:14 +000078 return executeSExtInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000079 case Instruction::FPTrunc:
Reid Spencera54b7cb2007-01-12 07:05:14 +000080 return executeFPTruncInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000081 case Instruction::FPExt:
Reid Spencera54b7cb2007-01-12 07:05:14 +000082 return executeFPExtInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000083 case Instruction::UIToFP:
Reid Spencera54b7cb2007-01-12 07:05:14 +000084 return executeUIToFPInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000085 case Instruction::SIToFP:
Reid Spencera54b7cb2007-01-12 07:05:14 +000086 return executeSIToFPInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000087 case Instruction::FPToUI:
Reid Spencera54b7cb2007-01-12 07:05:14 +000088 return executeFPToUIInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000089 case Instruction::FPToSI:
Reid Spencera54b7cb2007-01-12 07:05:14 +000090 return executeFPToSIInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000091 case Instruction::PtrToInt:
Reid Spencera54b7cb2007-01-12 07:05:14 +000092 return executePtrToIntInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000093 case Instruction::IntToPtr:
Reid Spencera54b7cb2007-01-12 07:05:14 +000094 return executeIntToPtrInst(CE->getOperand(0), CE->getType(), SF);
Reid Spencer3da59db2006-11-27 01:05:10 +000095 case Instruction::BitCast:
Reid Spencera54b7cb2007-01-12 07:05:14 +000096 return executeBitCastInst(CE->getOperand(0), CE->getType(), SF);
Brian Gaeke63438cc2003-12-11 00:22:59 +000097 case Instruction::GetElementPtr:
98 return executeGEPOperation(CE->getOperand(0), gep_type_begin(CE),
99 gep_type_end(CE), SF);
100 case Instruction::Add:
101 return executeAddInst(getOperandValue(CE->getOperand(0), SF),
102 getOperandValue(CE->getOperand(1), SF),
103 CE->getOperand(0)->getType());
104 case Instruction::Sub:
105 return executeSubInst(getOperandValue(CE->getOperand(0), SF),
106 getOperandValue(CE->getOperand(1), SF),
107 CE->getOperand(0)->getType());
108 case Instruction::Mul:
109 return executeMulInst(getOperandValue(CE->getOperand(0), SF),
110 getOperandValue(CE->getOperand(1), SF),
111 CE->getOperand(0)->getType());
Reid Spencer1628cec2006-10-26 06:15:43 +0000112 case Instruction::SDiv:
113 return executeSDivInst(getOperandValue(CE->getOperand(0), SF),
114 getOperandValue(CE->getOperand(1), SF),
115 CE->getOperand(0)->getType());
116 case Instruction::UDiv:
117 return executeUDivInst(getOperandValue(CE->getOperand(0), SF),
118 getOperandValue(CE->getOperand(1), SF),
119 CE->getOperand(0)->getType());
120 case Instruction::FDiv:
121 return executeFDivInst(getOperandValue(CE->getOperand(0), SF),
122 getOperandValue(CE->getOperand(1), SF),
123 CE->getOperand(0)->getType());
Reid Spencer0a783f72006-11-02 01:53:59 +0000124 case Instruction::URem:
125 return executeURemInst(getOperandValue(CE->getOperand(0), SF),
Brian Gaeke63438cc2003-12-11 00:22:59 +0000126 getOperandValue(CE->getOperand(1), SF),
127 CE->getOperand(0)->getType());
Reid Spencer0a783f72006-11-02 01:53:59 +0000128 case Instruction::SRem:
129 return executeSRemInst(getOperandValue(CE->getOperand(0), SF),
130 getOperandValue(CE->getOperand(1), SF),
131 CE->getOperand(0)->getType());
132 case Instruction::FRem:
133 return executeFRemInst(getOperandValue(CE->getOperand(0), SF),
134 getOperandValue(CE->getOperand(1), SF),
135 CE->getOperand(0)->getType());
Brian Gaeke63438cc2003-12-11 00:22:59 +0000136 case Instruction::And:
137 return executeAndInst(getOperandValue(CE->getOperand(0), SF),
138 getOperandValue(CE->getOperand(1), SF),
139 CE->getOperand(0)->getType());
140 case Instruction::Or:
141 return executeOrInst(getOperandValue(CE->getOperand(0), SF),
142 getOperandValue(CE->getOperand(1), SF),
143 CE->getOperand(0)->getType());
144 case Instruction::Xor:
145 return executeXorInst(getOperandValue(CE->getOperand(0), SF),
146 getOperandValue(CE->getOperand(1), SF),
147 CE->getOperand(0)->getType());
Reid Spencere4d87aa2006-12-23 06:05:41 +0000148 case Instruction::FCmp:
149 case Instruction::ICmp:
150 return executeCmpInst(CE->getPredicate(),
151 getOperandValue(CE->getOperand(0), SF),
152 getOperandValue(CE->getOperand(1), SF),
153 CE->getOperand(0)->getType());
Brian Gaeke63438cc2003-12-11 00:22:59 +0000154 case Instruction::Shl:
155 return executeShlInst(getOperandValue(CE->getOperand(0), SF),
156 getOperandValue(CE->getOperand(1), SF),
157 CE->getOperand(0)->getType());
Reid Spencer3822ff52006-11-08 06:47:33 +0000158 case Instruction::LShr:
159 return executeLShrInst(getOperandValue(CE->getOperand(0), SF),
160 getOperandValue(CE->getOperand(1), SF),
161 CE->getOperand(0)->getType());
162 case Instruction::AShr:
163 return executeAShrInst(getOperandValue(CE->getOperand(0), SF),
164 getOperandValue(CE->getOperand(1), SF),
165 CE->getOperand(0)->getType());
Chris Lattner759d34f2004-04-20 16:43:21 +0000166 case Instruction::Select:
167 return executeSelectInst(getOperandValue(CE->getOperand(0), SF),
168 getOperandValue(CE->getOperand(1), SF),
169 getOperandValue(CE->getOperand(2), SF));
Brian Gaeke63438cc2003-12-11 00:22:59 +0000170 default:
Bill Wendlinge8156192006-12-07 01:30:32 +0000171 cerr << "Unhandled ConstantExpr: " << *CE << "\n";
Brian Gaeke63438cc2003-12-11 00:22:59 +0000172 abort();
173 return GenericValue();
174 }
175}
Chris Lattnera34c5682002-08-27 22:33:45 +0000176
Brian Gaeke29794cb2003-09-05 18:55:03 +0000177GenericValue Interpreter::getOperandValue(Value *V, ExecutionContext &SF) {
Chris Lattnera34c5682002-08-27 22:33:45 +0000178 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
Brian Gaeke63438cc2003-12-11 00:22:59 +0000179 return getConstantExprValue(CE, SF);
Chris Lattnera34c5682002-08-27 22:33:45 +0000180 } else if (Constant *CPV = dyn_cast<Constant>(V)) {
Brian Gaeke63438cc2003-12-11 00:22:59 +0000181 return getConstantValue(CPV);
Chris Lattner39bb5b42001-10-15 13:25:40 +0000182 } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
Brian Gaeke63438cc2003-12-11 00:22:59 +0000183 return PTOGV(getPointerToGlobal(GV));
Chris Lattner39bb5b42001-10-15 13:25:40 +0000184 } else {
Brian Gaeke03e43dc2003-10-24 19:59:01 +0000185 return SF.Values[V];
Chris Lattner39bb5b42001-10-15 13:25:40 +0000186 }
187}
188
Chris Lattner39bb5b42001-10-15 13:25:40 +0000189static void SetValue(Value *V, GenericValue Val, ExecutionContext &SF) {
Brian Gaeke03e43dc2003-10-24 19:59:01 +0000190 SF.Values[V] = Val;
Chris Lattner39bb5b42001-10-15 13:25:40 +0000191}
192
Chris Lattner2e42d3a2001-10-15 05:51:48 +0000193void Interpreter::initializeExecutionEngine() {
Chris Lattnerfe11a972002-12-23 23:59:41 +0000194 TheEE = this;
Chris Lattner2e42d3a2001-10-15 05:51:48 +0000195}
196
Chris Lattner2adcd832002-05-03 19:52:30 +0000197//===----------------------------------------------------------------------===//
Chris Lattner92101ac2001-08-23 17:05:04 +0000198// Binary Instruction Implementations
199//===----------------------------------------------------------------------===//
200
201#define IMPLEMENT_BINARY_OPERATOR(OP, TY) \
202 case Type::TY##TyID: Dest.TY##Val = Src1.TY##Val OP Src2.TY##Val; break
203
Reid Spencera54b7cb2007-01-12 07:05:14 +0000204#define IMPLEMENT_INTEGER_BINOP(OP, TY) \
205 case Type::IntegerTyID: { \
206 unsigned BitWidth = cast<IntegerType>(TY)->getBitWidth(); \
207 if (BitWidth == 1) \
208 Dest.Int1Val = Src1.Int1Val OP Src2.Int1Val; \
209 else if (BitWidth <= 8) \
210 Dest.Int8Val = Src1.Int8Val OP Src2.Int8Val; \
211 else if (BitWidth <= 16) \
212 Dest.Int16Val = Src1.Int16Val OP Src2.Int16Val; \
213 else if (BitWidth <= 32) \
214 Dest.Int32Val = Src1.Int32Val OP Src2.Int32Val; \
215 else if (BitWidth <= 64) \
216 Dest.Int64Val = Src1.Int64Val OP Src2.Int64Val; \
217 else \
218 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n"; \
219 break; \
220 }
221
222#define IMPLEMENT_SIGNED_BINOP(OP, TY) \
223 if (const IntegerType *ITy = dyn_cast<IntegerType>(TY)) { \
224 unsigned BitWidth = ITy->getBitWidth(); \
225 if (BitWidth <= 8) \
226 Dest.Int8Val = ((int8_t)Src1.Int8Val) OP ((int8_t)Src2.Int8Val); \
227 else if (BitWidth <= 16) \
228 Dest.Int16Val = ((int16_t)Src1.Int16Val) OP ((int16_t)Src2.Int16Val); \
229 else if (BitWidth <= 32) \
230 Dest.Int32Val = ((int32_t)Src1.Int32Val) OP ((int32_t)Src2.Int32Val); \
231 else if (BitWidth <= 64) \
232 Dest.Int64Val = ((int64_t)Src1.Int64Val) OP ((int64_t)Src2.Int64Val); \
233 else { \
234 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n"; \
235 abort(); \
236 } \
237 } else { \
238 cerr << "Unhandled type for " #OP " operator: " << *Ty << "\n"; \
239 abort(); \
240 }
241
242#define IMPLEMENT_UNSIGNED_BINOP(OP, TY) \
243 if (const IntegerType *ITy = dyn_cast<IntegerType>(TY)) { \
244 unsigned BitWidth = ITy->getBitWidth(); \
245 if (BitWidth <= 8) \
246 Dest.Int8Val = ((uint8_t)Src1.Int8Val) OP ((uint8_t)Src2.Int8Val); \
247 else if (BitWidth <= 16) \
248 Dest.Int16Val = ((uint16_t)Src1.Int16Val) OP ((uint16_t)Src2.Int16Val); \
249 else if (BitWidth <= 32) \
250 Dest.Int32Val = ((uint32_t)Src1.Int32Val) OP ((uint32_t)Src2.Int32Val); \
251 else if (BitWidth <= 64) \
252 Dest.Int64Val = ((uint64_t)Src1.Int64Val) OP ((uint64_t)Src2.Int64Val); \
253 else { \
254 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n"; \
255 abort(); \
256 } \
257 } else { \
258 cerr << "Unhandled type for " #OP " operator: " << *Ty << "\n"; \
259 abort(); \
260 }
261
Misha Brukmand1c881a2005-04-21 22:43:08 +0000262static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2,
263 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000264 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000265 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000266 IMPLEMENT_INTEGER_BINOP(+, Ty);
Chris Lattner92101ac2001-08-23 17:05:04 +0000267 IMPLEMENT_BINARY_OPERATOR(+, Float);
268 IMPLEMENT_BINARY_OPERATOR(+, Double);
Chris Lattner92101ac2001-08-23 17:05:04 +0000269 default:
Bill Wendlinge8156192006-12-07 01:30:32 +0000270 cerr << "Unhandled type for Add instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000271 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000272 }
273 return Dest;
274}
275
Misha Brukmand1c881a2005-04-21 22:43:08 +0000276static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2,
277 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000278 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000279 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000280 IMPLEMENT_INTEGER_BINOP(-, Ty);
Chris Lattner92101ac2001-08-23 17:05:04 +0000281 IMPLEMENT_BINARY_OPERATOR(-, Float);
282 IMPLEMENT_BINARY_OPERATOR(-, Double);
Chris Lattner92101ac2001-08-23 17:05:04 +0000283 default:
Bill Wendlinge8156192006-12-07 01:30:32 +0000284 cerr << "Unhandled type for Sub instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000285 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000286 }
287 return Dest;
288}
289
Misha Brukmand1c881a2005-04-21 22:43:08 +0000290static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2,
291 const Type *Ty) {
Chris Lattnerc2593162001-10-27 08:28:11 +0000292 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000293 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000294 IMPLEMENT_INTEGER_BINOP(*, Ty);
Chris Lattnerc2593162001-10-27 08:28:11 +0000295 IMPLEMENT_BINARY_OPERATOR(*, Float);
296 IMPLEMENT_BINARY_OPERATOR(*, Double);
Chris Lattnerc2593162001-10-27 08:28:11 +0000297 default:
Bill Wendlinge8156192006-12-07 01:30:32 +0000298 cerr << "Unhandled type for Mul instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000299 abort();
Chris Lattnerc2593162001-10-27 08:28:11 +0000300 }
301 return Dest;
302}
303
Reid Spencer1628cec2006-10-26 06:15:43 +0000304static GenericValue executeUDivInst(GenericValue Src1, GenericValue Src2,
305 const Type *Ty) {
306 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +0000307 IMPLEMENT_UNSIGNED_BINOP(/,Ty)
Reid Spencer1628cec2006-10-26 06:15:43 +0000308 return Dest;
309}
310
311static GenericValue executeSDivInst(GenericValue Src1, GenericValue Src2,
312 const Type *Ty) {
313 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +0000314 IMPLEMENT_SIGNED_BINOP(/,Ty)
Reid Spencer1628cec2006-10-26 06:15:43 +0000315 return Dest;
316}
317
318static GenericValue executeFDivInst(GenericValue Src1, GenericValue Src2,
Misha Brukmand1c881a2005-04-21 22:43:08 +0000319 const Type *Ty) {
Chris Lattnerc2593162001-10-27 08:28:11 +0000320 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000321 switch (Ty->getTypeID()) {
Chris Lattnerc2593162001-10-27 08:28:11 +0000322 IMPLEMENT_BINARY_OPERATOR(/, Float);
323 IMPLEMENT_BINARY_OPERATOR(/, Double);
Chris Lattnerc2593162001-10-27 08:28:11 +0000324 default:
Reid Spencera54b7cb2007-01-12 07:05:14 +0000325 cerr << "Unhandled type for FDiv instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000326 abort();
Chris Lattnerbb76f022001-10-30 20:27:31 +0000327 }
328 return Dest;
329}
330
Reid Spencer0a783f72006-11-02 01:53:59 +0000331static GenericValue executeURemInst(GenericValue Src1, GenericValue Src2,
Misha Brukmand1c881a2005-04-21 22:43:08 +0000332 const Type *Ty) {
Chris Lattnerbb76f022001-10-30 20:27:31 +0000333 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +0000334 IMPLEMENT_UNSIGNED_BINOP(%, Ty)
Reid Spencer0a783f72006-11-02 01:53:59 +0000335 return Dest;
336}
337
338static GenericValue executeSRemInst(GenericValue Src1, GenericValue Src2,
339 const Type *Ty) {
340 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +0000341 IMPLEMENT_SIGNED_BINOP(%, Ty)
Reid Spencer0a783f72006-11-02 01:53:59 +0000342 return Dest;
343}
344
345static GenericValue executeFRemInst(GenericValue Src1, GenericValue Src2,
346 const Type *Ty) {
347 GenericValue Dest;
348 switch (Ty->getTypeID()) {
Chris Lattnerbb76f022001-10-30 20:27:31 +0000349 case Type::FloatTyID:
350 Dest.FloatVal = fmod(Src1.FloatVal, Src2.FloatVal);
351 break;
352 case Type::DoubleTyID:
353 Dest.DoubleVal = fmod(Src1.DoubleVal, Src2.DoubleVal);
354 break;
355 default:
Bill Wendlinge8156192006-12-07 01:30:32 +0000356 cerr << "Unhandled type for Rem instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000357 abort();
Chris Lattnerc2593162001-10-27 08:28:11 +0000358 }
359 return Dest;
360}
361
Misha Brukmand1c881a2005-04-21 22:43:08 +0000362static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2,
363 const Type *Ty) {
Chris Lattner4d0e1f92001-10-30 20:54:36 +0000364 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +0000365 IMPLEMENT_UNSIGNED_BINOP(&, Ty)
Chris Lattnerea38c0e2001-11-07 19:46:27 +0000366 return Dest;
367}
368
Misha Brukmand1c881a2005-04-21 22:43:08 +0000369static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2,
Chris Lattnerb945e4d2003-04-22 20:37:39 +0000370 const Type *Ty) {
Chris Lattnerea38c0e2001-11-07 19:46:27 +0000371 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +0000372 IMPLEMENT_UNSIGNED_BINOP(|, Ty)
Chris Lattnerea38c0e2001-11-07 19:46:27 +0000373 return Dest;
374}
375
Misha Brukmand1c881a2005-04-21 22:43:08 +0000376static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2,
Chris Lattnerb945e4d2003-04-22 20:37:39 +0000377 const Type *Ty) {
Chris Lattnerea38c0e2001-11-07 19:46:27 +0000378 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +0000379 IMPLEMENT_UNSIGNED_BINOP(^, Ty)
Chris Lattner4d0e1f92001-10-30 20:54:36 +0000380 return Dest;
381}
382
Reid Spencera54b7cb2007-01-12 07:05:14 +0000383#define IMPLEMENT_SIGNED_ICMP(OP, TY) \
384 case Type::IntegerTyID: { \
385 unsigned BitWidth = cast<IntegerType>(TY)->getBitWidth(); \
386 if (BitWidth == 1) \
387 Dest.Int1Val = ((int8_t)Src1.Int1Val) OP ((int8_t)Src2.Int1Val); \
388 else if (BitWidth <= 8) \
389 Dest.Int1Val = ((int8_t)Src1.Int8Val) OP ((int8_t)Src2.Int8Val); \
390 else if (BitWidth <= 16) \
391 Dest.Int1Val = ((int16_t)Src1.Int16Val) OP ((int16_t)Src2.Int16Val); \
392 else if (BitWidth <= 32) \
393 Dest.Int1Val = ((int32_t)Src1.Int32Val) OP ((int32_t)Src2.Int32Val); \
394 else if (BitWidth <= 64) \
395 Dest.Int1Val = ((int64_t)Src1.Int64Val) OP ((int64_t)Src2.Int64Val); \
396 else { \
397 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n"; \
398 abort(); \
399 } \
400 break; \
401 }
402
403#define IMPLEMENT_UNSIGNED_ICMP(OP, TY) \
404 case Type::IntegerTyID: { \
405 unsigned BitWidth = cast<IntegerType>(TY)->getBitWidth(); \
406 if (BitWidth == 1) \
407 Dest.Int1Val = ((uint8_t)Src1.Int1Val) OP ((uint8_t)Src2.Int1Val); \
408 else if (BitWidth <= 8) \
409 Dest.Int1Val = ((uint8_t)Src1.Int8Val) OP ((uint8_t)Src2.Int8Val); \
410 else if (BitWidth <= 16) \
411 Dest.Int1Val = ((uint16_t)Src1.Int16Val) OP ((uint16_t)Src2.Int16Val); \
412 else if (BitWidth <= 32) \
413 Dest.Int1Val = ((uint32_t)Src1.Int32Val) OP ((uint32_t)Src2.Int32Val); \
414 else if (BitWidth <= 64) \
415 Dest.Int1Val = ((uint64_t)Src1.Int64Val) OP ((uint64_t)Src2.Int64Val); \
416 else { \
417 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n"; \
418 abort(); \
419 } \
420 break; \
421 }
Chris Lattner92101ac2001-08-23 17:05:04 +0000422
Chris Lattnerfd506f52003-04-23 19:55:35 +0000423// Handle pointers specially because they must be compared with only as much
424// width as the host has. We _do not_ want to be comparing 64 bit values when
425// running on a 32-bit target, otherwise the upper 32 bits might mess up
426// comparisons if they contain garbage.
Reid Spencera54b7cb2007-01-12 07:05:14 +0000427#define IMPLEMENT_POINTER_ICMP(OP) \
Chris Lattnerfd506f52003-04-23 19:55:35 +0000428 case Type::PointerTyID: \
Reid Spencer4fe16d62007-01-11 18:21:29 +0000429 Dest.Int1Val = (void*)(intptr_t)Src1.PointerVal OP \
Chris Lattnerfd506f52003-04-23 19:55:35 +0000430 (void*)(intptr_t)Src2.PointerVal; break
431
Reid Spencere4d87aa2006-12-23 06:05:41 +0000432static GenericValue executeICMP_EQ(GenericValue Src1, GenericValue Src2,
433 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000434 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000435 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000436 IMPLEMENT_UNSIGNED_ICMP(==, Ty);
437 IMPLEMENT_POINTER_ICMP(==);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000438 default:
439 cerr << "Unhandled type for ICMP_EQ predicate: " << *Ty << "\n";
440 abort();
441 }
442 return Dest;
443}
444
445static GenericValue executeICMP_NE(GenericValue Src1, GenericValue Src2,
446 const Type *Ty) {
447 GenericValue Dest;
448 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000449 IMPLEMENT_UNSIGNED_ICMP(!=, Ty);
450 IMPLEMENT_POINTER_ICMP(!=);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000451 default:
452 cerr << "Unhandled type for ICMP_NE predicate: " << *Ty << "\n";
453 abort();
454 }
455 return Dest;
456}
457
458static GenericValue executeICMP_ULT(GenericValue Src1, GenericValue Src2,
459 const Type *Ty) {
460 GenericValue Dest;
461 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000462 IMPLEMENT_UNSIGNED_ICMP(<, Ty);
463 IMPLEMENT_POINTER_ICMP(<);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000464 default:
465 cerr << "Unhandled type for ICMP_ULT predicate: " << *Ty << "\n";
466 abort();
467 }
468 return Dest;
469}
470
471static GenericValue executeICMP_SLT(GenericValue Src1, GenericValue Src2,
472 const Type *Ty) {
473 GenericValue Dest;
474 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000475 IMPLEMENT_SIGNED_ICMP(<, Ty);
476 IMPLEMENT_POINTER_ICMP(<);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000477 default:
478 cerr << "Unhandled type for ICMP_SLT predicate: " << *Ty << "\n";
479 abort();
480 }
481 return Dest;
482}
483
484static GenericValue executeICMP_UGT(GenericValue Src1, GenericValue Src2,
485 const Type *Ty) {
486 GenericValue Dest;
487 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000488 IMPLEMENT_UNSIGNED_ICMP(>, Ty);
489 IMPLEMENT_POINTER_ICMP(>);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000490 default:
491 cerr << "Unhandled type for ICMP_UGT predicate: " << *Ty << "\n";
492 abort();
493 }
494 return Dest;
495}
496
497static GenericValue executeICMP_SGT(GenericValue Src1, GenericValue Src2,
498 const Type *Ty) {
499 GenericValue Dest;
500 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000501 IMPLEMENT_SIGNED_ICMP(>, Ty);
502 IMPLEMENT_POINTER_ICMP(>);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000503 default:
504 cerr << "Unhandled type for ICMP_SGT predicate: " << *Ty << "\n";
505 abort();
506 }
507 return Dest;
508}
509
510static GenericValue executeICMP_ULE(GenericValue Src1, GenericValue Src2,
511 const Type *Ty) {
512 GenericValue Dest;
513 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000514 IMPLEMENT_UNSIGNED_ICMP(<=, Ty);
515 IMPLEMENT_POINTER_ICMP(<=);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000516 default:
517 cerr << "Unhandled type for ICMP_ULE predicate: " << *Ty << "\n";
518 abort();
519 }
520 return Dest;
521}
522
523static GenericValue executeICMP_SLE(GenericValue Src1, GenericValue Src2,
524 const Type *Ty) {
525 GenericValue Dest;
526 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000527 IMPLEMENT_SIGNED_ICMP(<=, Ty);
528 IMPLEMENT_POINTER_ICMP(<=);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000529 default:
530 cerr << "Unhandled type for ICMP_SLE predicate: " << *Ty << "\n";
531 abort();
532 }
533 return Dest;
534}
535
536static GenericValue executeICMP_UGE(GenericValue Src1, GenericValue Src2,
537 const Type *Ty) {
538 GenericValue Dest;
539 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000540 IMPLEMENT_UNSIGNED_ICMP(>=,Ty);
541 IMPLEMENT_POINTER_ICMP(>=);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000542 default:
543 cerr << "Unhandled type for ICMP_UGE predicate: " << *Ty << "\n";
544 abort();
545 }
546 return Dest;
547}
548
549static GenericValue executeICMP_SGE(GenericValue Src1, GenericValue Src2,
550 const Type *Ty) {
551 GenericValue Dest;
552 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000553 IMPLEMENT_SIGNED_ICMP(>=, Ty);
554 IMPLEMENT_POINTER_ICMP(>=);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000555 default:
556 cerr << "Unhandled type for ICMP_SGE predicate: " << *Ty << "\n";
557 abort();
558 }
559 return Dest;
560}
561
Reid Spencere49661b2006-12-31 05:51:36 +0000562void Interpreter::visitICmpInst(ICmpInst &I) {
563 ExecutionContext &SF = ECStack.back();
564 const Type *Ty = I.getOperand(0)->getType();
565 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
566 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
567 GenericValue R; // Result
568
569 switch (I.getPredicate()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000570 case ICmpInst::ICMP_EQ: R = executeICMP_EQ(Src1, Src2, Ty); break;
571 case ICmpInst::ICMP_NE: R = executeICMP_NE(Src1, Src2, Ty); break;
Reid Spencere49661b2006-12-31 05:51:36 +0000572 case ICmpInst::ICMP_ULT: R = executeICMP_ULT(Src1, Src2, Ty); break;
573 case ICmpInst::ICMP_SLT: R = executeICMP_SLT(Src1, Src2, Ty); break;
574 case ICmpInst::ICMP_UGT: R = executeICMP_UGT(Src1, Src2, Ty); break;
575 case ICmpInst::ICMP_SGT: R = executeICMP_SGT(Src1, Src2, Ty); break;
576 case ICmpInst::ICMP_ULE: R = executeICMP_ULE(Src1, Src2, Ty); break;
577 case ICmpInst::ICMP_SLE: R = executeICMP_SLE(Src1, Src2, Ty); break;
578 case ICmpInst::ICMP_UGE: R = executeICMP_UGE(Src1, Src2, Ty); break;
579 case ICmpInst::ICMP_SGE: R = executeICMP_SGE(Src1, Src2, Ty); break;
580 default:
581 cerr << "Don't know how to handle this ICmp predicate!\n-->" << I;
582 abort();
583 }
584
585 SetValue(&I, R, SF);
586}
587
588#define IMPLEMENT_FCMP(OP, TY) \
Reid Spencer4fe16d62007-01-11 18:21:29 +0000589 case Type::TY##TyID: Dest.Int1Val = Src1.TY##Val OP Src2.TY##Val; break
Reid Spencere4d87aa2006-12-23 06:05:41 +0000590
Reid Spencera54b7cb2007-01-12 07:05:14 +0000591static GenericValue executeFCMP_OEQ(GenericValue Src1, GenericValue Src2,
Reid Spencere4d87aa2006-12-23 06:05:41 +0000592 const Type *Ty) {
593 GenericValue Dest;
594 switch (Ty->getTypeID()) {
Reid Spencere49661b2006-12-31 05:51:36 +0000595 IMPLEMENT_FCMP(==, Float);
596 IMPLEMENT_FCMP(==, Double);
Chris Lattner92101ac2001-08-23 17:05:04 +0000597 default:
Reid Spencera54b7cb2007-01-12 07:05:14 +0000598 cerr << "Unhandled type for FCmp EQ instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000599 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000600 }
601 return Dest;
602}
603
Reid Spencera54b7cb2007-01-12 07:05:14 +0000604static GenericValue executeFCMP_ONE(GenericValue Src1, GenericValue Src2,
Reid Spencere4d87aa2006-12-23 06:05:41 +0000605 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000606 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000607 switch (Ty->getTypeID()) {
Reid Spencere49661b2006-12-31 05:51:36 +0000608 IMPLEMENT_FCMP(!=, Float);
609 IMPLEMENT_FCMP(!=, Double);
Chris Lattnerea38c0e2001-11-07 19:46:27 +0000610
Chris Lattner92101ac2001-08-23 17:05:04 +0000611 default:
Reid Spencera54b7cb2007-01-12 07:05:14 +0000612 cerr << "Unhandled type for FCmp NE instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000613 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000614 }
615 return Dest;
616}
617
Reid Spencera54b7cb2007-01-12 07:05:14 +0000618static GenericValue executeFCMP_OLE(GenericValue Src1, GenericValue Src2,
Reid Spencere4d87aa2006-12-23 06:05:41 +0000619 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000620 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000621 switch (Ty->getTypeID()) {
Reid Spencere49661b2006-12-31 05:51:36 +0000622 IMPLEMENT_FCMP(<=, Float);
623 IMPLEMENT_FCMP(<=, Double);
Chris Lattner92101ac2001-08-23 17:05:04 +0000624 default:
Reid Spencera54b7cb2007-01-12 07:05:14 +0000625 cerr << "Unhandled type for FCmp LE instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000626 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000627 }
628 return Dest;
629}
630
Reid Spencera54b7cb2007-01-12 07:05:14 +0000631static GenericValue executeFCMP_OGE(GenericValue Src1, GenericValue Src2,
Reid Spencere4d87aa2006-12-23 06:05:41 +0000632 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000633 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000634 switch (Ty->getTypeID()) {
Reid Spencere49661b2006-12-31 05:51:36 +0000635 IMPLEMENT_FCMP(>=, Float);
636 IMPLEMENT_FCMP(>=, Double);
Chris Lattner92101ac2001-08-23 17:05:04 +0000637 default:
Reid Spencera54b7cb2007-01-12 07:05:14 +0000638 cerr << "Unhandled type for FCmp GE instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000639 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000640 }
641 return Dest;
642}
643
Reid Spencera54b7cb2007-01-12 07:05:14 +0000644static GenericValue executeFCMP_OLT(GenericValue Src1, GenericValue Src2,
Reid Spencere4d87aa2006-12-23 06:05:41 +0000645 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000646 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000647 switch (Ty->getTypeID()) {
Reid Spencere49661b2006-12-31 05:51:36 +0000648 IMPLEMENT_FCMP(<, Float);
649 IMPLEMENT_FCMP(<, Double);
Chris Lattner92101ac2001-08-23 17:05:04 +0000650 default:
Reid Spencera54b7cb2007-01-12 07:05:14 +0000651 cerr << "Unhandled type for FCmp LT instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000652 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000653 }
654 return Dest;
655}
656
Reid Spencera54b7cb2007-01-12 07:05:14 +0000657static GenericValue executeFCMP_OGT(GenericValue Src1, GenericValue Src2,
Misha Brukmand1c881a2005-04-21 22:43:08 +0000658 const Type *Ty) {
Chris Lattner92101ac2001-08-23 17:05:04 +0000659 GenericValue Dest;
Chris Lattnerf70c22b2004-06-17 18:19:28 +0000660 switch (Ty->getTypeID()) {
Reid Spencere49661b2006-12-31 05:51:36 +0000661 IMPLEMENT_FCMP(>, Float);
662 IMPLEMENT_FCMP(>, Double);
Chris Lattner92101ac2001-08-23 17:05:04 +0000663 default:
Reid Spencera54b7cb2007-01-12 07:05:14 +0000664 cerr << "Unhandled type for FCmp GT instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +0000665 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000666 }
667 return Dest;
668}
669
Reid Spencera54b7cb2007-01-12 07:05:14 +0000670#define IMPLEMENT_UNORDERED(TY, X,Y) \
671 if (TY == Type::FloatTy) \
672 if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) { \
673 Dest.Int1Val = true; \
674 return Dest; \
675 } \
676 else if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) { \
677 Dest.Int1Val = true; \
678 return Dest; \
679 }
680
681
682static GenericValue executeFCMP_UEQ(GenericValue Src1, GenericValue Src2,
683 const Type *Ty) {
684 GenericValue Dest;
685 IMPLEMENT_UNORDERED(Ty, Src1, Src2)
686 return executeFCMP_OEQ(Src1, Src2, Ty);
687}
688
689static GenericValue executeFCMP_UNE(GenericValue Src1, GenericValue Src2,
690 const Type *Ty) {
691 GenericValue Dest;
692 IMPLEMENT_UNORDERED(Ty, Src1, Src2)
693 return executeFCMP_ONE(Src1, Src2, Ty);
694}
695
696static GenericValue executeFCMP_ULE(GenericValue Src1, GenericValue Src2,
697 const Type *Ty) {
698 GenericValue Dest;
699 IMPLEMENT_UNORDERED(Ty, Src1, Src2)
700 return executeFCMP_OLE(Src1, Src2, Ty);
701}
702
703static GenericValue executeFCMP_UGE(GenericValue Src1, GenericValue Src2,
704 const Type *Ty) {
705 GenericValue Dest;
706 IMPLEMENT_UNORDERED(Ty, Src1, Src2)
707 return executeFCMP_OGE(Src1, Src2, Ty);
708}
709
710static GenericValue executeFCMP_ULT(GenericValue Src1, GenericValue Src2,
711 const Type *Ty) {
712 GenericValue Dest;
713 IMPLEMENT_UNORDERED(Ty, Src1, Src2)
714 return executeFCMP_OLT(Src1, Src2, Ty);
715}
716
717static GenericValue executeFCMP_UGT(GenericValue Src1, GenericValue Src2,
718 const Type *Ty) {
719 GenericValue Dest;
720 IMPLEMENT_UNORDERED(Ty, Src1, Src2)
721 return executeFCMP_OGT(Src1, Src2, Ty);
722}
723
724static GenericValue executeFCMP_ORD(GenericValue Src1, GenericValue Src2,
725 const Type *Ty) {
726 GenericValue Dest;
727 if (Ty == Type::FloatTy)
728 Dest.Int1Val = (Src1.FloatVal == Src1.FloatVal &&
729 Src2.FloatVal == Src2.FloatVal);
730 else
731 Dest.Int1Val = (Src1.DoubleVal == Src1.DoubleVal &&
732 Src2.DoubleVal == Src2.DoubleVal);
733 return Dest;
734}
735
736static GenericValue executeFCMP_UNO(GenericValue Src1, GenericValue Src2,
737 const Type *Ty) {
738 GenericValue Dest;
739 if (Ty == Type::FloatTy)
740 Dest.Int1Val = (Src1.FloatVal != Src1.FloatVal ||
741 Src2.FloatVal != Src2.FloatVal);
742 else
743 Dest.Int1Val = (Src1.DoubleVal != Src1.DoubleVal ||
744 Src2.DoubleVal != Src2.DoubleVal);
745 return Dest;
746}
747
Reid Spencere4d87aa2006-12-23 06:05:41 +0000748void Interpreter::visitFCmpInst(FCmpInst &I) {
749 ExecutionContext &SF = ECStack.back();
750 const Type *Ty = I.getOperand(0)->getType();
751 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
752 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
753 GenericValue R; // Result
754
755 switch (I.getPredicate()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +0000756 case FCmpInst::FCMP_FALSE: R.Int1Val = false; break;
757 case FCmpInst::FCMP_TRUE: R.Int1Val = true; break;
758 case FCmpInst::FCMP_ORD: R = executeFCMP_ORD(Src1, Src2, Ty); break;
759 case FCmpInst::FCMP_UNO: R = executeFCMP_UNO(Src1, Src2, Ty); break;
760 case FCmpInst::FCMP_UEQ: R = executeFCMP_UEQ(Src1, Src2, Ty); break;
761 case FCmpInst::FCMP_OEQ: R = executeFCMP_OEQ(Src1, Src2, Ty); break;
762 case FCmpInst::FCMP_UNE: R = executeFCMP_UNE(Src1, Src2, Ty); break;
763 case FCmpInst::FCMP_ONE: R = executeFCMP_ONE(Src1, Src2, Ty); break;
764 case FCmpInst::FCMP_ULT: R = executeFCMP_ULT(Src1, Src2, Ty); break;
765 case FCmpInst::FCMP_OLT: R = executeFCMP_OLT(Src1, Src2, Ty); break;
766 case FCmpInst::FCMP_UGT: R = executeFCMP_UGT(Src1, Src2, Ty); break;
767 case FCmpInst::FCMP_OGT: R = executeFCMP_OGT(Src1, Src2, Ty); break;
768 case FCmpInst::FCMP_ULE: R = executeFCMP_ULE(Src1, Src2, Ty); break;
769 case FCmpInst::FCMP_OLE: R = executeFCMP_OLE(Src1, Src2, Ty); break;
770 case FCmpInst::FCMP_UGE: R = executeFCMP_UGE(Src1, Src2, Ty); break;
771 case FCmpInst::FCMP_OGE: R = executeFCMP_OGE(Src1, Src2, Ty); break;
Reid Spencere4d87aa2006-12-23 06:05:41 +0000772 default:
773 cerr << "Don't know how to handle this FCmp predicate!\n-->" << I;
774 abort();
775 }
776
777 SetValue(&I, R, SF);
778}
779
Reid Spencere4d87aa2006-12-23 06:05:41 +0000780static GenericValue executeCmpInst(unsigned predicate, GenericValue Src1,
781 GenericValue Src2, const Type *Ty) {
782 GenericValue Result;
783 switch (predicate) {
784 case ICmpInst::ICMP_EQ: return executeICMP_EQ(Src1, Src2, Ty);
785 case ICmpInst::ICMP_NE: return executeICMP_NE(Src1, Src2, Ty);
786 case ICmpInst::ICMP_UGT: return executeICMP_UGT(Src1, Src2, Ty);
787 case ICmpInst::ICMP_SGT: return executeICMP_SGT(Src1, Src2, Ty);
788 case ICmpInst::ICMP_ULT: return executeICMP_ULT(Src1, Src2, Ty);
789 case ICmpInst::ICMP_SLT: return executeICMP_SLT(Src1, Src2, Ty);
790 case ICmpInst::ICMP_UGE: return executeICMP_UGE(Src1, Src2, Ty);
791 case ICmpInst::ICMP_SGE: return executeICMP_SGE(Src1, Src2, Ty);
792 case ICmpInst::ICMP_ULE: return executeICMP_ULE(Src1, Src2, Ty);
793 case ICmpInst::ICMP_SLE: return executeICMP_SLE(Src1, Src2, Ty);
Reid Spencera54b7cb2007-01-12 07:05:14 +0000794 case FCmpInst::FCMP_ORD: return executeFCMP_ORD(Src1, Src2, Ty);
795 case FCmpInst::FCMP_UNO: return executeFCMP_UNO(Src1, Src2, Ty);
796 case FCmpInst::FCMP_OEQ: return executeFCMP_OEQ(Src1, Src2, Ty);
797 case FCmpInst::FCMP_UEQ: return executeFCMP_UEQ(Src1, Src2, Ty);
798 case FCmpInst::FCMP_ONE: return executeFCMP_ONE(Src1, Src2, Ty);
799 case FCmpInst::FCMP_UNE: return executeFCMP_UNE(Src1, Src2, Ty);
800 case FCmpInst::FCMP_OLT: return executeFCMP_OLT(Src1, Src2, Ty);
801 case FCmpInst::FCMP_ULT: return executeFCMP_ULT(Src1, Src2, Ty);
802 case FCmpInst::FCMP_OGT: return executeFCMP_OGT(Src1, Src2, Ty);
803 case FCmpInst::FCMP_UGT: return executeFCMP_UGT(Src1, Src2, Ty);
804 case FCmpInst::FCMP_OLE: return executeFCMP_OLE(Src1, Src2, Ty);
805 case FCmpInst::FCMP_ULE: return executeFCMP_ULE(Src1, Src2, Ty);
806 case FCmpInst::FCMP_OGE: return executeFCMP_OGE(Src1, Src2, Ty);
807 case FCmpInst::FCMP_UGE: return executeFCMP_UGE(Src1, Src2, Ty);
Reid Spencere4d87aa2006-12-23 06:05:41 +0000808 case FCmpInst::FCMP_FALSE: {
809 GenericValue Result;
Reid Spencer4fe16d62007-01-11 18:21:29 +0000810 Result.Int1Val = false;
Reid Spencere4d87aa2006-12-23 06:05:41 +0000811 return Result;
812 }
813 case FCmpInst::FCMP_TRUE: {
814 GenericValue Result;
Reid Spencer4fe16d62007-01-11 18:21:29 +0000815 Result.Int1Val = true;
Reid Spencere4d87aa2006-12-23 06:05:41 +0000816 return Result;
817 }
818 default:
819 cerr << "Unhandled Cmp predicate\n";
820 abort();
821 }
822}
823
Chris Lattnerd7916e92003-05-10 21:22:39 +0000824void Interpreter::visitBinaryOperator(BinaryOperator &I) {
825 ExecutionContext &SF = ECStack.back();
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000826 const Type *Ty = I.getOperand(0)->getType();
827 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
828 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
Chris Lattner92101ac2001-08-23 17:05:04 +0000829 GenericValue R; // Result
830
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000831 switch (I.getOpcode()) {
Chris Lattnerb945e4d2003-04-22 20:37:39 +0000832 case Instruction::Add: R = executeAddInst (Src1, Src2, Ty); break;
833 case Instruction::Sub: R = executeSubInst (Src1, Src2, Ty); break;
834 case Instruction::Mul: R = executeMulInst (Src1, Src2, Ty); break;
Reid Spencer1628cec2006-10-26 06:15:43 +0000835 case Instruction::UDiv: R = executeUDivInst (Src1, Src2, Ty); break;
836 case Instruction::SDiv: R = executeSDivInst (Src1, Src2, Ty); break;
837 case Instruction::FDiv: R = executeFDivInst (Src1, Src2, Ty); break;
Reid Spencer0a783f72006-11-02 01:53:59 +0000838 case Instruction::URem: R = executeURemInst (Src1, Src2, Ty); break;
839 case Instruction::SRem: R = executeSRemInst (Src1, Src2, Ty); break;
840 case Instruction::FRem: R = executeFRemInst (Src1, Src2, Ty); break;
Chris Lattnerb945e4d2003-04-22 20:37:39 +0000841 case Instruction::And: R = executeAndInst (Src1, Src2, Ty); break;
842 case Instruction::Or: R = executeOrInst (Src1, Src2, Ty); break;
843 case Instruction::Xor: R = executeXorInst (Src1, Src2, Ty); break;
Chris Lattner92101ac2001-08-23 17:05:04 +0000844 default:
Bill Wendlinge8156192006-12-07 01:30:32 +0000845 cerr << "Don't know how to handle this binary operator!\n-->" << I;
Chris Lattner02868352003-04-22 21:22:33 +0000846 abort();
Chris Lattner92101ac2001-08-23 17:05:04 +0000847 }
848
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000849 SetValue(&I, R, SF);
Chris Lattner92101ac2001-08-23 17:05:04 +0000850}
851
Misha Brukmand1c881a2005-04-21 22:43:08 +0000852static GenericValue executeSelectInst(GenericValue Src1, GenericValue Src2,
Chris Lattner759d34f2004-04-20 16:43:21 +0000853 GenericValue Src3) {
Reid Spencer4fe16d62007-01-11 18:21:29 +0000854 return Src1.Int1Val ? Src2 : Src3;
Chris Lattner759d34f2004-04-20 16:43:21 +0000855}
856
857void Interpreter::visitSelectInst(SelectInst &I) {
858 ExecutionContext &SF = ECStack.back();
859 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
860 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
861 GenericValue Src3 = getOperandValue(I.getOperand(2), SF);
862 GenericValue R = executeSelectInst(Src1, Src2, Src3);
863 SetValue(&I, R, SF);
864}
865
866
Chris Lattner92101ac2001-08-23 17:05:04 +0000867//===----------------------------------------------------------------------===//
868// Terminator Instruction Implementations
869//===----------------------------------------------------------------------===//
870
Chris Lattnere43db882001-10-27 04:15:57 +0000871void Interpreter::exitCalled(GenericValue GV) {
Brian Gaeked8400d82004-02-13 05:48:00 +0000872 // runAtExitHandlers() assumes there are no stack frames, but
873 // if exit() was called, then it had a stack frame. Blow away
874 // the stack before interpreting atexit handlers.
875 ECStack.clear ();
Brian Gaeke63438cc2003-12-11 00:22:59 +0000876 runAtExitHandlers ();
Reid Spencere49661b2006-12-31 05:51:36 +0000877 exit (GV.Int32Val);
Chris Lattnere43db882001-10-27 04:15:57 +0000878}
879
Brian Gaekeaf955ba2003-11-07 05:22:49 +0000880/// Pop the last stack frame off of ECStack and then copy the result
881/// back into the result variable if we are not returning void. The
Jeff Cohen8c9191c2006-02-07 05:29:44 +0000882/// result variable may be the ExitValue, or the Value of the calling
Brian Gaekedbde1ae2003-11-07 20:44:58 +0000883/// CallInst if there was a previous stack frame. This method may
884/// invalidate any ECStack iterators you have. This method also takes
885/// care of switching to the normal destination BB, if we are returning
886/// from an invoke.
Brian Gaekeaf955ba2003-11-07 05:22:49 +0000887///
888void Interpreter::popStackAndReturnValueToCaller (const Type *RetTy,
889 GenericValue Result) {
890 // Pop the current stack frame.
891 ECStack.pop_back();
892
Misha Brukmand1c881a2005-04-21 22:43:08 +0000893 if (ECStack.empty()) { // Finished main. Put result into exit code...
Chris Lattner42a75512007-01-15 02:27:26 +0000894 if (RetTy && RetTy->isInteger()) { // Nonvoid return type?
Jeff Cohen8c9191c2006-02-07 05:29:44 +0000895 ExitValue = Result; // Capture the exit value of the program
Misha Brukmand1c881a2005-04-21 22:43:08 +0000896 } else {
Jeff Cohen8c9191c2006-02-07 05:29:44 +0000897 memset(&ExitValue, 0, sizeof(ExitValue));
Misha Brukmand1c881a2005-04-21 22:43:08 +0000898 }
899 } else {
900 // If we have a previous stack frame, and we have a previous call,
901 // fill in the return value...
Brian Gaekeaf955ba2003-11-07 05:22:49 +0000902 ExecutionContext &CallingSF = ECStack.back();
Brian Gaekedbde1ae2003-11-07 20:44:58 +0000903 if (Instruction *I = CallingSF.Caller.getInstruction()) {
Brian Gaeke2cb474c2003-11-07 19:26:23 +0000904 if (CallingSF.Caller.getType() != Type::VoidTy) // Save result...
Brian Gaekedbde1ae2003-11-07 20:44:58 +0000905 SetValue(I, Result, CallingSF);
906 if (InvokeInst *II = dyn_cast<InvokeInst> (I))
907 SwitchToNewBasicBlock (II->getNormalDest (), CallingSF);
Brian Gaeke2cb474c2003-11-07 19:26:23 +0000908 CallingSF.Caller = CallSite(); // We returned from the call...
Brian Gaekeaf955ba2003-11-07 05:22:49 +0000909 }
910 }
911}
912
Chris Lattnerd7916e92003-05-10 21:22:39 +0000913void Interpreter::visitReturnInst(ReturnInst &I) {
914 ExecutionContext &SF = ECStack.back();
Brian Gaekeaf955ba2003-11-07 05:22:49 +0000915 const Type *RetTy = Type::VoidTy;
Chris Lattner92101ac2001-08-23 17:05:04 +0000916 GenericValue Result;
917
918 // Save away the return value... (if we are not 'ret void')
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000919 if (I.getNumOperands()) {
920 RetTy = I.getReturnValue()->getType();
921 Result = getOperandValue(I.getReturnValue(), SF);
Chris Lattner92101ac2001-08-23 17:05:04 +0000922 }
923
Brian Gaekeaf955ba2003-11-07 05:22:49 +0000924 popStackAndReturnValueToCaller(RetTy, Result);
Chris Lattner92101ac2001-08-23 17:05:04 +0000925}
926
Brian Gaeke9bf06b12003-11-07 20:07:06 +0000927void Interpreter::visitUnwindInst(UnwindInst &I) {
Brian Gaekedbde1ae2003-11-07 20:44:58 +0000928 // Unwind stack
929 Instruction *Inst;
930 do {
931 ECStack.pop_back ();
932 if (ECStack.empty ())
933 abort ();
934 Inst = ECStack.back ().Caller.getInstruction ();
935 } while (!(Inst && isa<InvokeInst> (Inst)));
936
937 // Return from invoke
938 ExecutionContext &InvokingSF = ECStack.back ();
939 InvokingSF.Caller = CallSite ();
940
941 // Go to exceptional destination BB of invoke instruction
Chris Lattneraeb2a1d2004-02-08 21:44:31 +0000942 SwitchToNewBasicBlock(cast<InvokeInst>(Inst)->getUnwindDest(), InvokingSF);
Brian Gaeke9bf06b12003-11-07 20:07:06 +0000943}
944
Chris Lattnerec7c1ab2004-10-16 18:21:33 +0000945void Interpreter::visitUnreachableInst(UnreachableInst &I) {
Bill Wendlinge8156192006-12-07 01:30:32 +0000946 cerr << "ERROR: Program executed an 'unreachable' instruction!\n";
Chris Lattnerec7c1ab2004-10-16 18:21:33 +0000947 abort();
948}
949
Chris Lattnerd7916e92003-05-10 21:22:39 +0000950void Interpreter::visitBranchInst(BranchInst &I) {
951 ExecutionContext &SF = ECStack.back();
Chris Lattner92101ac2001-08-23 17:05:04 +0000952 BasicBlock *Dest;
953
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000954 Dest = I.getSuccessor(0); // Uncond branches have a fixed dest...
955 if (!I.isUnconditional()) {
956 Value *Cond = I.getCondition();
Reid Spencer4fe16d62007-01-11 18:21:29 +0000957 if (getOperandValue(Cond, SF).Int1Val == 0) // If false cond...
Misha Brukmand1c881a2005-04-21 22:43:08 +0000958 Dest = I.getSuccessor(1);
Chris Lattner92101ac2001-08-23 17:05:04 +0000959 }
Chris Lattner77113b62003-05-10 20:21:16 +0000960 SwitchToNewBasicBlock(Dest, SF);
Chris Lattner92101ac2001-08-23 17:05:04 +0000961}
962
Chris Lattnerd7916e92003-05-10 21:22:39 +0000963void Interpreter::visitSwitchInst(SwitchInst &I) {
964 ExecutionContext &SF = ECStack.back();
Chris Lattner09e93922003-04-22 20:34:47 +0000965 GenericValue CondVal = getOperandValue(I.getOperand(0), SF);
966 const Type *ElTy = I.getOperand(0)->getType();
Chris Lattner09e93922003-04-22 20:34:47 +0000967
968 // Check to see if any of the cases match...
Chris Lattner77113b62003-05-10 20:21:16 +0000969 BasicBlock *Dest = 0;
970 for (unsigned i = 2, e = I.getNumOperands(); i != e; i += 2)
Reid Spencere4d87aa2006-12-23 06:05:41 +0000971 if (executeICMP_EQ(CondVal,
Reid Spencer4fe16d62007-01-11 18:21:29 +0000972 getOperandValue(I.getOperand(i), SF), ElTy).Int1Val) {
Chris Lattner09e93922003-04-22 20:34:47 +0000973 Dest = cast<BasicBlock>(I.getOperand(i+1));
974 break;
975 }
Misha Brukmand1c881a2005-04-21 22:43:08 +0000976
Chris Lattner09e93922003-04-22 20:34:47 +0000977 if (!Dest) Dest = I.getDefaultDest(); // No cases matched: use default
Chris Lattner77113b62003-05-10 20:21:16 +0000978 SwitchToNewBasicBlock(Dest, SF);
979}
980
981// SwitchToNewBasicBlock - This method is used to jump to a new basic block.
982// This function handles the actual updating of block and instruction iterators
983// as well as execution of all of the PHI nodes in the destination block.
984//
985// This method does this because all of the PHI nodes must be executed
986// atomically, reading their inputs before any of the results are updated. Not
987// doing this can cause problems if the PHI nodes depend on other PHI nodes for
988// their inputs. If the input PHI node is updated before it is read, incorrect
989// results can happen. Thus we use a two phase approach.
990//
991void Interpreter::SwitchToNewBasicBlock(BasicBlock *Dest, ExecutionContext &SF){
992 BasicBlock *PrevBB = SF.CurBB; // Remember where we came from...
993 SF.CurBB = Dest; // Update CurBB to branch destination
994 SF.CurInst = SF.CurBB->begin(); // Update new instruction ptr...
995
996 if (!isa<PHINode>(SF.CurInst)) return; // Nothing fancy to do
997
998 // Loop over all of the PHI nodes in the current block, reading their inputs.
999 std::vector<GenericValue> ResultValues;
1000
1001 for (; PHINode *PN = dyn_cast<PHINode>(SF.CurInst); ++SF.CurInst) {
1002 // Search for the value corresponding to this previous bb...
1003 int i = PN->getBasicBlockIndex(PrevBB);
1004 assert(i != -1 && "PHINode doesn't contain entry for predecessor??");
1005 Value *IncomingValue = PN->getIncomingValue(i);
Misha Brukmand1c881a2005-04-21 22:43:08 +00001006
Chris Lattner77113b62003-05-10 20:21:16 +00001007 // Save the incoming value for this PHI node...
1008 ResultValues.push_back(getOperandValue(IncomingValue, SF));
1009 }
1010
1011 // Now loop over all of the PHI nodes setting their values...
1012 SF.CurInst = SF.CurBB->begin();
Reid Spencer2da5c3d2004-09-15 17:06:42 +00001013 for (unsigned i = 0; isa<PHINode>(SF.CurInst); ++SF.CurInst, ++i) {
1014 PHINode *PN = cast<PHINode>(SF.CurInst);
Chris Lattner77113b62003-05-10 20:21:16 +00001015 SetValue(PN, ResultValues[i], SF);
Reid Spencer2da5c3d2004-09-15 17:06:42 +00001016 }
Chris Lattner09e93922003-04-22 20:34:47 +00001017}
1018
Chris Lattner92101ac2001-08-23 17:05:04 +00001019//===----------------------------------------------------------------------===//
Chris Lattner86660982001-08-27 05:16:50 +00001020// Memory Instruction Implementations
1021//===----------------------------------------------------------------------===//
1022
Chris Lattnerd7916e92003-05-10 21:22:39 +00001023void Interpreter::visitAllocationInst(AllocationInst &I) {
1024 ExecutionContext &SF = ECStack.back();
1025
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001026 const Type *Ty = I.getType()->getElementType(); // Type to be allocated
Chris Lattner86660982001-08-27 05:16:50 +00001027
Chris Lattnercc82cc12002-04-28 21:57:33 +00001028 // Get the number of elements being allocated by the array...
Reid Spencere49661b2006-12-31 05:51:36 +00001029 unsigned NumElements = getOperandValue(I.getOperand(0), SF).Int32Val;
Chris Lattner86660982001-08-27 05:16:50 +00001030
1031 // Allocate enough memory to hold the type...
Chris Lattnerd5644962005-01-08 20:05:34 +00001032 void *Memory = malloc(NumElements * (size_t)TD.getTypeSize(Ty));
Chris Lattner9bffa732002-02-19 18:50:09 +00001033
Chris Lattnerfe11a972002-12-23 23:59:41 +00001034 GenericValue Result = PTOGV(Memory);
Chris Lattnerea38c0e2001-11-07 19:46:27 +00001035 assert(Result.PointerVal != 0 && "Null pointer returned by malloc!");
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001036 SetValue(&I, Result, SF);
Chris Lattner86660982001-08-27 05:16:50 +00001037
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001038 if (I.getOpcode() == Instruction::Alloca)
Chris Lattner9bffa732002-02-19 18:50:09 +00001039 ECStack.back().Allocas.add(Memory);
Chris Lattner86660982001-08-27 05:16:50 +00001040}
1041
Chris Lattnerd7916e92003-05-10 21:22:39 +00001042void Interpreter::visitFreeInst(FreeInst &I) {
1043 ExecutionContext &SF = ECStack.back();
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001044 assert(isa<PointerType>(I.getOperand(0)->getType()) && "Freeing nonptr?");
1045 GenericValue Value = getOperandValue(I.getOperand(0), SF);
Chris Lattner86660982001-08-27 05:16:50 +00001046 // TODO: Check to make sure memory is allocated
Chris Lattnerfe11a972002-12-23 23:59:41 +00001047 free(GVTOP(Value)); // Free memory
Chris Lattner86660982001-08-27 05:16:50 +00001048}
1049
Chris Lattnera34c5682002-08-27 22:33:45 +00001050// getElementOffset - The workhorse for getelementptr.
Chris Lattner95c3af52001-10-29 19:32:19 +00001051//
Chris Lattner4af6de82003-11-25 20:44:56 +00001052GenericValue Interpreter::executeGEPOperation(Value *Ptr, gep_type_iterator I,
Misha Brukmand1c881a2005-04-21 22:43:08 +00001053 gep_type_iterator E,
1054 ExecutionContext &SF) {
Chris Lattnera34c5682002-08-27 22:33:45 +00001055 assert(isa<PointerType>(Ptr->getType()) &&
Chris Lattner95c3af52001-10-29 19:32:19 +00001056 "Cannot getElementOffset of a nonpointer type!");
1057
Chris Lattnerea38c0e2001-11-07 19:46:27 +00001058 PointerTy Total = 0;
Chris Lattnera34c5682002-08-27 22:33:45 +00001059
1060 for (; I != E; ++I) {
Chris Lattner4af6de82003-11-25 20:44:56 +00001061 if (const StructType *STy = dyn_cast<StructType>(*I)) {
Chris Lattner782b9392001-11-26 18:18:18 +00001062 const StructLayout *SLO = TD.getStructLayout(STy);
Misha Brukmand1c881a2005-04-21 22:43:08 +00001063
Reid Spencerb83eb642006-10-20 07:07:24 +00001064 const ConstantInt *CPU = cast<ConstantInt>(I.getOperand());
1065 unsigned Index = unsigned(CPU->getZExtValue());
Misha Brukmand1c881a2005-04-21 22:43:08 +00001066
Chris Lattnerd5644962005-01-08 20:05:34 +00001067 Total += (PointerTy)SLO->MemberOffsets[Index];
Chris Lattner4af6de82003-11-25 20:44:56 +00001068 } else {
1069 const SequentialType *ST = cast<SequentialType>(*I);
Chris Lattner006a4a52003-02-25 21:14:59 +00001070 // Get the index number for the array... which must be long type...
Chris Lattner4af6de82003-11-25 20:44:56 +00001071 GenericValue IdxGV = getOperandValue(I.getOperand(), SF);
1072
Reid Spencera54b7cb2007-01-12 07:05:14 +00001073 int64_t Idx;
1074 unsigned BitWidth =
1075 cast<IntegerType>(I.getOperand()->getType())->getBitWidth();
Reid Spencer23e28832007-01-18 01:25:42 +00001076 if (BitWidth == 32)
Reid Spencera54b7cb2007-01-12 07:05:14 +00001077 Idx = (int64_t)(int32_t)IdxGV.Int32Val;
Reid Spencer23e28832007-01-18 01:25:42 +00001078 else if (BitWidth == 64)
Reid Spencera54b7cb2007-01-12 07:05:14 +00001079 Idx = (int64_t)IdxGV.Int64Val;
1080 else
Reid Spencer23e28832007-01-18 01:25:42 +00001081 assert(0 && "Invalid index type for getelementptr");
Chris Lattnerd5644962005-01-08 20:05:34 +00001082 Total += PointerTy(TD.getTypeSize(ST->getElementType())*Idx);
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001083 }
Chris Lattner95c3af52001-10-29 19:32:19 +00001084 }
1085
Chris Lattnera34c5682002-08-27 22:33:45 +00001086 GenericValue Result;
1087 Result.PointerVal = getOperandValue(Ptr, SF).PointerVal + Total;
1088 return Result;
Chris Lattner95c3af52001-10-29 19:32:19 +00001089}
1090
Chris Lattnerd7916e92003-05-10 21:22:39 +00001091void Interpreter::visitGetElementPtrInst(GetElementPtrInst &I) {
1092 ExecutionContext &SF = ECStack.back();
Chris Lattnerfe11a972002-12-23 23:59:41 +00001093 SetValue(&I, TheEE->executeGEPOperation(I.getPointerOperand(),
Chris Lattner4af6de82003-11-25 20:44:56 +00001094 gep_type_begin(I), gep_type_end(I), SF), SF);
Chris Lattner95c3af52001-10-29 19:32:19 +00001095}
1096
Chris Lattnerd7916e92003-05-10 21:22:39 +00001097void Interpreter::visitLoadInst(LoadInst &I) {
1098 ExecutionContext &SF = ECStack.back();
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001099 GenericValue SRC = getOperandValue(I.getPointerOperand(), SF);
Chris Lattnerfe11a972002-12-23 23:59:41 +00001100 GenericValue *Ptr = (GenericValue*)GVTOP(SRC);
Chris Lattner374344c2003-05-08 16:52:43 +00001101 GenericValue Result = LoadValueFromMemory(Ptr, I.getType());
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001102 SetValue(&I, Result, SF);
Chris Lattner86660982001-08-27 05:16:50 +00001103}
1104
Chris Lattnerd7916e92003-05-10 21:22:39 +00001105void Interpreter::visitStoreInst(StoreInst &I) {
1106 ExecutionContext &SF = ECStack.back();
Chris Lattnerfddc7552002-10-15 20:34:05 +00001107 GenericValue Val = getOperandValue(I.getOperand(0), SF);
1108 GenericValue SRC = getOperandValue(I.getPointerOperand(), SF);
Chris Lattnerfe11a972002-12-23 23:59:41 +00001109 StoreValueToMemory(Val, (GenericValue *)GVTOP(SRC),
Chris Lattner683d5da92002-10-26 01:57:15 +00001110 I.getOperand(0)->getType());
Chris Lattnerfddc7552002-10-15 20:34:05 +00001111}
1112
Chris Lattner86660982001-08-27 05:16:50 +00001113//===----------------------------------------------------------------------===//
Chris Lattner92101ac2001-08-23 17:05:04 +00001114// Miscellaneous Instruction Implementations
1115//===----------------------------------------------------------------------===//
1116
Brian Gaekefea483d2003-11-07 20:04:22 +00001117void Interpreter::visitCallSite(CallSite CS) {
Chris Lattnerd7916e92003-05-10 21:22:39 +00001118 ExecutionContext &SF = ECStack.back();
Chris Lattner73011782003-12-28 09:44:37 +00001119
1120 // Check to see if this is an intrinsic function call...
1121 if (Function *F = CS.getCalledFunction())
Brian Gaeke34562ba2004-01-14 06:02:53 +00001122 if (F->isExternal ())
Chris Lattner73011782003-12-28 09:44:37 +00001123 switch (F->getIntrinsicID()) {
Brian Gaeke34562ba2004-01-14 06:02:53 +00001124 case Intrinsic::not_intrinsic:
1125 break;
Chris Lattner317201d2004-03-13 00:24:00 +00001126 case Intrinsic::vastart: { // va_start
Brian Gaeke9d20b712004-02-25 23:01:48 +00001127 GenericValue ArgIndex;
1128 ArgIndex.UIntPairVal.first = ECStack.size() - 1;
1129 ArgIndex.UIntPairVal.second = 0;
1130 SetValue(CS.getInstruction(), ArgIndex, SF);
Chris Lattner73011782003-12-28 09:44:37 +00001131 return;
Brian Gaeke9d20b712004-02-25 23:01:48 +00001132 }
Chris Lattner317201d2004-03-13 00:24:00 +00001133 case Intrinsic::vaend: // va_end is a noop for the interpreter
Chris Lattner73011782003-12-28 09:44:37 +00001134 return;
Chris Lattner317201d2004-03-13 00:24:00 +00001135 case Intrinsic::vacopy: // va_copy: dest = src
Chris Lattner73011782003-12-28 09:44:37 +00001136 SetValue(CS.getInstruction(), getOperandValue(*CS.arg_begin(), SF), SF);
1137 return;
1138 default:
Brian Gaeke34562ba2004-01-14 06:02:53 +00001139 // If it is an unknown intrinsic function, use the intrinsic lowering
Chris Lattner73011782003-12-28 09:44:37 +00001140 // class to transform it into hopefully tasty LLVM code.
1141 //
1142 Instruction *Prev = CS.getInstruction()->getPrev();
1143 BasicBlock *Parent = CS.getInstruction()->getParent();
1144 IL->LowerIntrinsicCall(cast<CallInst>(CS.getInstruction()));
1145
1146 // Restore the CurInst pointer to the first instruction newly inserted, if
1147 // any.
1148 if (!Prev) {
1149 SF.CurInst = Parent->begin();
1150 } else {
1151 SF.CurInst = Prev;
1152 ++SF.CurInst;
1153 }
Brian Gaekeb440dea2004-04-23 18:05:28 +00001154 return;
Chris Lattner73011782003-12-28 09:44:37 +00001155 }
1156
Brian Gaekefea483d2003-11-07 20:04:22 +00001157 SF.Caller = CS;
Chris Lattner02868352003-04-22 21:22:33 +00001158 std::vector<GenericValue> ArgVals;
Brian Gaekeae2495a2003-11-07 19:59:08 +00001159 const unsigned NumArgs = SF.Caller.arg_size();
1160 ArgVals.reserve(NumArgs);
1161 for (CallSite::arg_iterator i = SF.Caller.arg_begin(),
1162 e = SF.Caller.arg_end(); i != e; ++i) {
1163 Value *V = *i;
1164 ArgVals.push_back(getOperandValue(V, SF));
Chris Lattner93780132003-01-13 00:58:52 +00001165 // Promote all integral types whose size is < sizeof(int) into ints. We do
1166 // this by zero or sign extending the value as appropriate according to the
1167 // source type.
Brian Gaekeae2495a2003-11-07 19:59:08 +00001168 const Type *Ty = V->getType();
Chris Lattner42a75512007-01-15 02:27:26 +00001169 if (Ty->isInteger()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001170 if (Ty->getPrimitiveSizeInBits() == 1)
Reid Spencer4fe16d62007-01-11 18:21:29 +00001171 ArgVals.back().Int32Val = ArgVals.back().Int1Val;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001172 else if (Ty->getPrimitiveSizeInBits() <= 8)
1173 ArgVals.back().Int32Val = ArgVals.back().Int8Val;
1174 else if (Ty->getPrimitiveSizeInBits() <= 16)
1175 ArgVals.back().Int32Val = ArgVals.back().Int16Val;
Chris Lattner93780132003-01-13 00:58:52 +00001176 }
1177 }
Chris Lattner365a76e2001-09-10 04:49:44 +00001178
Misha Brukmand1c881a2005-04-21 22:43:08 +00001179 // To handle indirect calls, we must get the pointer value from the argument
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00001180 // and treat it as a function pointer.
Misha Brukmand1c881a2005-04-21 22:43:08 +00001181 GenericValue SRC = getOperandValue(SF.Caller.getCalledValue(), SF);
Chris Lattnerda82ed52003-05-08 16:18:31 +00001182 callFunction((Function*)GVTOP(SRC), ArgVals);
Chris Lattner92101ac2001-08-23 17:05:04 +00001183}
1184
Brian Gaeke63438cc2003-12-11 00:22:59 +00001185static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2,
1186 const Type *Ty) {
Chris Lattner86660982001-08-27 05:16:50 +00001187 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001188 if (const IntegerType *ITy = cast<IntegerType>(Ty)) {
1189 unsigned BitWidth = ITy->getBitWidth();
1190 if (BitWidth <= 8)
1191 Dest.Int8Val = ((uint8_t)Src1.Int8Val) << ((uint32_t)Src2.Int8Val);
1192 else if (BitWidth <= 16)
1193 Dest.Int16Val = ((uint16_t)Src1.Int16Val) << ((uint32_t)Src2.Int8Val);
1194 else if (BitWidth <= 32)
1195 Dest.Int32Val = ((uint32_t)Src1.Int32Val) << ((uint32_t)Src2.Int8Val);
1196 else if (BitWidth <= 64)
1197 Dest.Int64Val = ((uint64_t)Src1.Int64Val) << ((uint32_t)Src2.Int8Val);
1198 else {
1199 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n";
1200 abort();
1201 }
1202 } else {
Bill Wendlinge8156192006-12-07 01:30:32 +00001203 cerr << "Unhandled type for Shl instruction: " << *Ty << "\n";
Reid Spencera54b7cb2007-01-12 07:05:14 +00001204 abort();
Chris Lattner86660982001-08-27 05:16:50 +00001205 }
Brian Gaeke63438cc2003-12-11 00:22:59 +00001206 return Dest;
Chris Lattner86660982001-08-27 05:16:50 +00001207}
1208
Reid Spencer3822ff52006-11-08 06:47:33 +00001209static GenericValue executeLShrInst(GenericValue Src1, GenericValue Src2,
1210 const Type *Ty) {
Chris Lattner86660982001-08-27 05:16:50 +00001211 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001212 if (const IntegerType *ITy = cast<IntegerType>(Ty)) {
1213 unsigned BitWidth = ITy->getBitWidth();
1214 if (BitWidth <= 8)
1215 Dest.Int8Val = ((uint8_t)Src1.Int8Val) >> ((uint32_t)Src2.Int8Val);
1216 else if (BitWidth <= 16)
1217 Dest.Int16Val = ((uint16_t)Src1.Int16Val) >> ((uint32_t)Src2.Int8Val);
1218 else if (BitWidth <= 32)
1219 Dest.Int32Val = ((uint32_t)Src1.Int32Val) >> ((uint32_t)Src2.Int8Val);
1220 else if (BitWidth <= 64)
1221 Dest.Int64Val = ((uint64_t)Src1.Int64Val) >> ((uint32_t)Src2.Int8Val);
1222 else {
1223 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n";
1224 abort();
1225 }
1226 } else {
Bill Wendlinge8156192006-12-07 01:30:32 +00001227 cerr << "Unhandled type for LShr instruction: " << *Ty << "\n";
Reid Spencer3822ff52006-11-08 06:47:33 +00001228 abort();
1229 }
1230 return Dest;
1231}
1232
1233static GenericValue executeAShrInst(GenericValue Src1, GenericValue Src2,
1234 const Type *Ty) {
1235 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001236 if (const IntegerType *ITy = cast<IntegerType>(Ty)) {
1237 unsigned BitWidth = ITy->getBitWidth();
1238 if (BitWidth <= 8)
1239 Dest.Int8Val = ((int8_t)Src1.Int8Val) >> ((int32_t)Src2.Int8Val);
1240 else if (BitWidth <= 16)
1241 Dest.Int16Val = ((int16_t)Src1.Int16Val) >> ((int32_t)Src2.Int8Val);
1242 else if (BitWidth <= 32)
1243 Dest.Int32Val = ((int32_t)Src1.Int32Val) >> ((int32_t)Src2.Int8Val);
1244 else if (BitWidth <= 64)
1245 Dest.Int64Val = ((int64_t)Src1.Int64Val) >> ((int32_t)Src2.Int8Val);
1246 else {
1247 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n"; \
1248 abort();
1249 }
1250 } else {
Bill Wendlinge8156192006-12-07 01:30:32 +00001251 cerr << "Unhandled type for AShr instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +00001252 abort();
Chris Lattner86660982001-08-27 05:16:50 +00001253 }
Brian Gaeke63438cc2003-12-11 00:22:59 +00001254 return Dest;
1255}
1256
1257void Interpreter::visitShl(ShiftInst &I) {
1258 ExecutionContext &SF = ECStack.back();
1259 const Type *Ty = I.getOperand(0)->getType();
1260 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
1261 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
1262 GenericValue Dest;
1263 Dest = executeShlInst (Src1, Src2, Ty);
1264 SetValue(&I, Dest, SF);
1265}
1266
Reid Spencer3822ff52006-11-08 06:47:33 +00001267void Interpreter::visitLShr(ShiftInst &I) {
Brian Gaeke63438cc2003-12-11 00:22:59 +00001268 ExecutionContext &SF = ECStack.back();
1269 const Type *Ty = I.getOperand(0)->getType();
1270 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
1271 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
1272 GenericValue Dest;
Reid Spencer3822ff52006-11-08 06:47:33 +00001273 Dest = executeLShrInst (Src1, Src2, Ty);
1274 SetValue(&I, Dest, SF);
1275}
1276
1277void Interpreter::visitAShr(ShiftInst &I) {
1278 ExecutionContext &SF = ECStack.back();
1279 const Type *Ty = I.getOperand(0)->getType();
1280 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
1281 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
1282 GenericValue Dest;
1283 Dest = executeAShrInst (Src1, Src2, Ty);
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001284 SetValue(&I, Dest, SF);
Chris Lattner86660982001-08-27 05:16:50 +00001285}
1286
Reid Spencer23e28832007-01-18 01:25:42 +00001287#define INTEGER_ASSIGN(DEST, BITWIDTH, VAL) \
1288 { \
1289 uint64_t Mask = (1ull << BITWIDTH) - 1; \
1290 if (BITWIDTH == 1) { \
1291 Dest.Int1Val = (bool) (VAL & Mask); \
1292 } else if (BITWIDTH <= 8) { \
1293 Dest.Int8Val = (uint8_t) (VAL & Mask); \
1294 } else if (BITWIDTH <= 16) { \
1295 Dest.Int16Val = (uint16_t) (VAL & Mask); \
1296 } else if (BITWIDTH <= 32) { \
1297 Dest.Int32Val = (uint32_t) (VAL & Mask); \
1298 } else \
1299 Dest.Int64Val = (uint64_t) (VAL & Mask); \
1300 }
Chris Lattner86660982001-08-27 05:16:50 +00001301
Reid Spencera54b7cb2007-01-12 07:05:14 +00001302GenericValue Interpreter::executeTruncInst(Value *SrcVal, const Type *DstTy,
1303 ExecutionContext &SF) {
Chris Lattnera34c5682002-08-27 22:33:45 +00001304 const Type *SrcTy = SrcVal->getType();
1305 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
Reid Spencera54b7cb2007-01-12 07:05:14 +00001306 const IntegerType *DITy = cast<IntegerType>(DstTy);
1307 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1308 unsigned DBitWidth = DITy->getBitWidth();
1309 unsigned SBitWidth = SITy->getBitWidth();
1310 assert(SBitWidth <= 64 && DBitWidth <= 64 &&
1311 "Integer types > 64 bits not supported");
1312 assert(SBitWidth > DBitWidth && "Invalid truncate");
Chris Lattner86660982001-08-27 05:16:50 +00001313
Reid Spencera54b7cb2007-01-12 07:05:14 +00001314 // Mask the source value to its actual bit width. This ensures that any
1315 // high order bits are cleared.
1316 uint64_t Mask = (1ULL << DBitWidth) - 1;
1317 uint64_t MaskedVal = 0;
1318 if (SBitWidth <= 8)
1319 MaskedVal = Src.Int8Val & Mask;
1320 else if (SBitWidth <= 16)
1321 MaskedVal = Src.Int16Val & Mask;
1322 else if (SBitWidth <= 32)
1323 MaskedVal = Src.Int32Val & Mask;
1324 else
1325 MaskedVal = Src.Int64Val & Mask;
Chris Lattnera34c5682002-08-27 22:33:45 +00001326
Reid Spencera54b7cb2007-01-12 07:05:14 +00001327 INTEGER_ASSIGN(Dest, DBitWidth, MaskedVal);
Chris Lattnera34c5682002-08-27 22:33:45 +00001328 return Dest;
Chris Lattner86660982001-08-27 05:16:50 +00001329}
Chris Lattner92101ac2001-08-23 17:05:04 +00001330
Reid Spencera54b7cb2007-01-12 07:05:14 +00001331GenericValue Interpreter::executeSExtInst(Value *SrcVal, const Type *DstTy,
1332 ExecutionContext &SF) {
1333 const Type *SrcTy = SrcVal->getType();
1334 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1335 const IntegerType *DITy = cast<IntegerType>(DstTy);
1336 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1337 unsigned DBitWidth = DITy->getBitWidth();
1338 unsigned SBitWidth = SITy->getBitWidth();
1339 assert(SBitWidth <= 64 && DBitWidth <= 64 &&
1340 "Integer types > 64 bits not supported");
1341 assert(SBitWidth < DBitWidth && "Invalid sign extend");
1342 int64_t Extended = 0;
1343 if (SBitWidth == 1)
1344 // For sign extension from bool, we must extend the source bits.
1345 Extended = 0 - (Src.Int1Val & 1);
1346 else if (SBitWidth <= 8)
1347 Extended = (int64_t) (int8_t)Src.Int8Val;
1348 else if (SBitWidth <= 16)
1349 Extended = (int64_t) (int16_t)Src.Int16Val;
1350 else if (SBitWidth <= 32)
1351 Extended = (int64_t) (int32_t)Src.Int32Val;
1352 else
1353 Extended = (int64_t) Src.Int64Val;
1354
1355 // Now that we have a sign extended value, assign it to the destination
1356 INTEGER_ASSIGN(Dest, DBitWidth, Extended);
1357 return Dest;
1358}
1359
1360GenericValue Interpreter::executeZExtInst(Value *SrcVal, const Type *DstTy,
1361 ExecutionContext &SF) {
1362 const Type *SrcTy = SrcVal->getType();
1363 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1364 const IntegerType *DITy = cast<IntegerType>(DstTy);
1365 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1366 unsigned DBitWidth = DITy->getBitWidth();
1367 unsigned SBitWidth = SITy->getBitWidth();
1368 assert(SBitWidth <= 64 && DBitWidth <= 64 &&
1369 "Integer types > 64 bits not supported");
1370 assert(SBitWidth < DBitWidth && "Invalid sign extend");
1371 uint64_t Extended = 0;
1372 if (SBitWidth == 1)
1373 // For sign extension from bool, we must extend the source bits.
1374 Extended = (uint64_t) (Src.Int1Val & 1);
1375 else if (SBitWidth <= 8)
1376 Extended = (uint64_t) (uint8_t)Src.Int8Val;
1377 else if (SBitWidth <= 16)
1378 Extended = (uint64_t) (uint16_t)Src.Int16Val;
1379 else if (SBitWidth <= 32)
1380 Extended = (uint64_t) (uint32_t)Src.Int32Val;
1381 else
1382 Extended = (uint64_t) Src.Int64Val;
1383
1384 // Now that we have a sign extended value, assign it to the destination
1385 INTEGER_ASSIGN(Dest, DBitWidth, Extended);
1386 return Dest;
1387}
1388
1389GenericValue Interpreter::executeFPTruncInst(Value *SrcVal, const Type *DstTy,
1390 ExecutionContext &SF) {
1391 const Type *SrcTy = SrcVal->getType();
1392 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1393 assert(SrcTy == Type::DoubleTy && DstTy == Type::FloatTy &&
1394 "Invalid FPTrunc instruction");
1395 Dest.FloatVal = (float) Src.DoubleVal;
1396 return Dest;
1397}
1398
1399GenericValue Interpreter::executeFPExtInst(Value *SrcVal, const Type *DstTy,
1400 ExecutionContext &SF) {
1401 const Type *SrcTy = SrcVal->getType();
1402 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1403 assert(SrcTy == Type::FloatTy && DstTy == Type::DoubleTy &&
1404 "Invalid FPTrunc instruction");
1405 Dest.DoubleVal = (double) Src.FloatVal;
1406 return Dest;
1407}
1408
1409GenericValue Interpreter::executeFPToUIInst(Value *SrcVal, const Type *DstTy,
1410 ExecutionContext &SF) {
1411 const Type *SrcTy = SrcVal->getType();
1412 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1413 const IntegerType *DITy = cast<IntegerType>(DstTy);
1414 unsigned DBitWidth = DITy->getBitWidth();
1415 assert(DBitWidth <= 64 && "Integer types > 64 bits not supported");
1416 assert(SrcTy->isFloatingPoint() && "Invalid FPToUI instruction");
1417 uint64_t Converted = 0;
1418 if (SrcTy->getTypeID() == Type::FloatTyID)
1419 Converted = (uint64_t) Src.FloatVal;
1420 else
1421 Converted = (uint64_t) Src.DoubleVal;
1422
1423 INTEGER_ASSIGN(Dest, DBitWidth, Converted);
1424 return Dest;
1425}
1426
1427GenericValue Interpreter::executeFPToSIInst(Value *SrcVal, const Type *DstTy,
1428 ExecutionContext &SF) {
1429 const Type *SrcTy = SrcVal->getType();
1430 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1431 const IntegerType *DITy = cast<IntegerType>(DstTy);
1432 unsigned DBitWidth = DITy->getBitWidth();
1433 assert(DBitWidth <= 64 && "Integer types > 64 bits not supported");
1434 assert(SrcTy->isFloatingPoint() && "Invalid FPToSI instruction");
1435 int64_t Converted = 0;
1436 if (SrcTy->getTypeID() == Type::FloatTyID)
1437 Converted = (int64_t) Src.FloatVal;
1438 else
1439 Converted = (int64_t) Src.DoubleVal;
1440
1441 INTEGER_ASSIGN(Dest, DBitWidth, Converted);
1442 return Dest;
1443}
1444
1445GenericValue Interpreter::executeUIToFPInst(Value *SrcVal, const Type *DstTy,
1446 ExecutionContext &SF) {
1447 const Type *SrcTy = SrcVal->getType();
1448 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1449 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1450 unsigned SBitWidth = SITy->getBitWidth();
1451 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1452 assert(DstTy->isFloatingPoint() && "Invalid UIToFP instruction");
1453 uint64_t Converted = 0;
1454 if (SBitWidth == 1)
1455 Converted = (uint64_t) Src.Int1Val;
1456 else if (SBitWidth <= 8)
1457 Converted = (uint64_t) Src.Int8Val;
1458 else if (SBitWidth <= 16)
1459 Converted = (uint64_t) Src.Int16Val;
1460 else if (SBitWidth <= 32)
1461 Converted = (uint64_t) Src.Int32Val;
1462 else
1463 Converted = (uint64_t) Src.Int64Val;
1464
1465 if (DstTy->getTypeID() == Type::FloatTyID)
1466 Dest.FloatVal = (float) Converted;
1467 else
1468 Dest.DoubleVal = (double) Converted;
1469 return Dest;
1470}
1471
1472GenericValue Interpreter::executeSIToFPInst(Value *SrcVal, const Type *DstTy,
1473 ExecutionContext &SF) {
1474 const Type *SrcTy = SrcVal->getType();
1475 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1476 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1477 unsigned SBitWidth = SITy->getBitWidth();
1478 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1479 assert(DstTy->isFloatingPoint() && "Invalid UIToFP instruction");
1480 int64_t Converted = 0;
1481 if (SBitWidth == 1)
1482 Converted = 0LL - Src.Int1Val;
1483 else if (SBitWidth <= 8)
1484 Converted = (int64_t) (int8_t)Src.Int8Val;
1485 else if (SBitWidth <= 16)
1486 Converted = (int64_t) (int16_t)Src.Int16Val;
1487 else if (SBitWidth <= 32)
1488 Converted = (int64_t) (int32_t)Src.Int32Val;
1489 else
1490 Converted = (int64_t) Src.Int64Val;
1491
1492 if (DstTy->getTypeID() == Type::FloatTyID)
1493 Dest.FloatVal = (float) Converted;
1494 else
1495 Dest.DoubleVal = (double) Converted;
1496 return Dest;
1497}
1498
1499GenericValue Interpreter::executePtrToIntInst(Value *SrcVal, const Type *DstTy,
1500 ExecutionContext &SF) {
1501 const Type *SrcTy = SrcVal->getType();
1502 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1503 const IntegerType *DITy = cast<IntegerType>(DstTy);
1504 unsigned DBitWidth = DITy->getBitWidth();
1505 assert(DBitWidth <= 64 && "Integer types > 64 bits not supported");
1506 assert(isa<PointerType>(SrcTy) && "Invalid PtrToInt instruction");
1507 INTEGER_ASSIGN(Dest, DBitWidth, (intptr_t) Src.PointerVal);
1508 return Dest;
1509}
1510
1511GenericValue Interpreter::executeIntToPtrInst(Value *SrcVal, const Type *DstTy,
1512 ExecutionContext &SF) {
1513 const Type *SrcTy = SrcVal->getType();
1514 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1515 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1516 unsigned SBitWidth = SITy->getBitWidth();
1517 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1518 assert(isa<PointerType>(DstTy) && "Invalid PtrToInt instruction");
1519 uint64_t Converted = 0;
1520 if (SBitWidth == 1)
1521 Converted = (uint64_t) Src.Int1Val;
1522 else if (SBitWidth <= 8)
1523 Converted = (uint64_t) Src.Int8Val;
1524 else if (SBitWidth <= 16)
1525 Converted = (uint64_t) Src.Int16Val;
1526 else if (SBitWidth <= 32)
1527 Converted = (uint64_t) Src.Int32Val;
1528 else
1529 Converted = (uint64_t) Src.Int64Val;
1530
1531 Dest.PointerVal = (PointerTy) Converted;
1532 return Dest;
1533}
1534
1535GenericValue Interpreter::executeBitCastInst(Value *SrcVal, const Type *DstTy,
1536 ExecutionContext &SF) {
1537
1538 const Type *SrcTy = SrcVal->getType();
1539 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1540 if (isa<PointerType>(DstTy)) {
1541 assert(isa<PointerType>(SrcTy) && "Invalid BitCast");
1542 Dest.PointerVal = Src.PointerVal;
Chris Lattner42a75512007-01-15 02:27:26 +00001543 } else if (DstTy->isInteger()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001544 const IntegerType *DITy = cast<IntegerType>(DstTy);
1545 unsigned DBitWidth = DITy->getBitWidth();
1546 if (SrcTy == Type::FloatTy) {
1547 Dest.Int32Val = FloatToBits(Src.FloatVal);
1548 } else if (SrcTy == Type::DoubleTy) {
1549 Dest.Int64Val = DoubleToBits(Src.DoubleVal);
Chris Lattner42a75512007-01-15 02:27:26 +00001550 } else if (SrcTy->isInteger()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001551 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1552 unsigned SBitWidth = SITy->getBitWidth();
1553 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1554 assert(SBitWidth == DBitWidth && "Invalid BitCast");
1555 if (SBitWidth == 1)
1556 Dest.Int1Val = Src.Int1Val;
1557 else if (SBitWidth <= 8)
1558 Dest.Int8Val = Src.Int8Val;
1559 else if (SBitWidth <= 16)
1560 Dest.Int16Val = Src.Int16Val;
1561 else if (SBitWidth <= 32)
1562 Dest.Int32Val = Src.Int32Val;
1563 else
1564 Dest.Int64Val = Src.Int64Val;
1565 } else
1566 assert(0 && "Invalid BitCast");
1567 } else if (DstTy == Type::FloatTy) {
Chris Lattner42a75512007-01-15 02:27:26 +00001568 if (SrcTy->isInteger())
Reid Spencera54b7cb2007-01-12 07:05:14 +00001569 Dest.FloatVal = BitsToFloat(Src.Int32Val);
1570 else
1571 Dest.FloatVal = Src.FloatVal;
1572 } else if (DstTy == Type::DoubleTy) {
Chris Lattner42a75512007-01-15 02:27:26 +00001573 if (SrcTy->isInteger())
Reid Spencera54b7cb2007-01-12 07:05:14 +00001574 Dest.DoubleVal = BitsToDouble(Src.Int64Val);
1575 else
1576 Dest.DoubleVal = Src.DoubleVal;
1577 } else
1578 assert(0 && "Invalid Bitcast");
1579
1580 return Dest;
1581}
1582
1583void Interpreter::visitTruncInst(TruncInst &I) {
Chris Lattnerd7916e92003-05-10 21:22:39 +00001584 ExecutionContext &SF = ECStack.back();
Reid Spencera54b7cb2007-01-12 07:05:14 +00001585 SetValue(&I, executeTruncInst(I.getOperand(0), I.getType(), SF), SF);
1586}
1587
1588void Interpreter::visitSExtInst(SExtInst &I) {
1589 ExecutionContext &SF = ECStack.back();
1590 SetValue(&I, executeSExtInst(I.getOperand(0), I.getType(), SF), SF);
1591}
1592
1593void Interpreter::visitZExtInst(ZExtInst &I) {
1594 ExecutionContext &SF = ECStack.back();
1595 SetValue(&I, executeZExtInst(I.getOperand(0), I.getType(), SF), SF);
1596}
1597
1598void Interpreter::visitFPTruncInst(FPTruncInst &I) {
1599 ExecutionContext &SF = ECStack.back();
1600 SetValue(&I, executeFPTruncInst(I.getOperand(0), I.getType(), SF), SF);
1601}
1602
1603void Interpreter::visitFPExtInst(FPExtInst &I) {
1604 ExecutionContext &SF = ECStack.back();
1605 SetValue(&I, executeFPExtInst(I.getOperand(0), I.getType(), SF), SF);
1606}
1607
1608void Interpreter::visitUIToFPInst(UIToFPInst &I) {
1609 ExecutionContext &SF = ECStack.back();
1610 SetValue(&I, executeUIToFPInst(I.getOperand(0), I.getType(), SF), SF);
1611}
1612
1613void Interpreter::visitSIToFPInst(SIToFPInst &I) {
1614 ExecutionContext &SF = ECStack.back();
1615 SetValue(&I, executeSIToFPInst(I.getOperand(0), I.getType(), SF), SF);
1616}
1617
1618void Interpreter::visitFPToUIInst(FPToUIInst &I) {
1619 ExecutionContext &SF = ECStack.back();
1620 SetValue(&I, executeFPToUIInst(I.getOperand(0), I.getType(), SF), SF);
1621}
1622
1623void Interpreter::visitFPToSIInst(FPToSIInst &I) {
1624 ExecutionContext &SF = ECStack.back();
1625 SetValue(&I, executeFPToSIInst(I.getOperand(0), I.getType(), SF), SF);
1626}
1627
1628void Interpreter::visitPtrToIntInst(PtrToIntInst &I) {
1629 ExecutionContext &SF = ECStack.back();
1630 SetValue(&I, executePtrToIntInst(I.getOperand(0), I.getType(), SF), SF);
1631}
1632
1633void Interpreter::visitIntToPtrInst(IntToPtrInst &I) {
1634 ExecutionContext &SF = ECStack.back();
1635 SetValue(&I, executeIntToPtrInst(I.getOperand(0), I.getType(), SF), SF);
1636}
1637
1638void Interpreter::visitBitCastInst(BitCastInst &I) {
1639 ExecutionContext &SF = ECStack.back();
1640 SetValue(&I, executeBitCastInst(I.getOperand(0), I.getType(), SF), SF);
Chris Lattnera34c5682002-08-27 22:33:45 +00001641}
Chris Lattner92101ac2001-08-23 17:05:04 +00001642
Brian Gaekec1a2be12003-11-07 21:20:47 +00001643#define IMPLEMENT_VAARG(TY) \
1644 case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break
1645
1646void Interpreter::visitVAArgInst(VAArgInst &I) {
1647 ExecutionContext &SF = ECStack.back();
1648
Brian Gaeke9d20b712004-02-25 23:01:48 +00001649 // Get the incoming valist parameter. LLI treats the valist as a
1650 // (ec-stack-depth var-arg-index) pair.
Brian Gaekec1a2be12003-11-07 21:20:47 +00001651 GenericValue VAList = getOperandValue(I.getOperand(0), SF);
Brian Gaeke9d20b712004-02-25 23:01:48 +00001652 GenericValue Dest;
1653 GenericValue Src = ECStack[VAList.UIntPairVal.first]
Misha Brukmand1c881a2005-04-21 22:43:08 +00001654 .VarArgs[VAList.UIntPairVal.second];
Brian Gaekec1a2be12003-11-07 21:20:47 +00001655 const Type *Ty = I.getType();
Chris Lattnerf70c22b2004-06-17 18:19:28 +00001656 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001657 case Type::IntegerTyID: {
1658 unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
1659 if (BitWidth == 1)
1660 Dest.Int1Val = Src.Int1Val;
1661 else if (BitWidth <= 8)
1662 Dest.Int8Val = Src.Int8Val;
1663 else if (BitWidth <= 16)
1664 Dest.Int16Val = Src.Int16Val;
1665 else if (BitWidth <= 32)
1666 Dest.Int32Val = Src.Int32Val;
1667 else if (BitWidth <= 64)
1668 Dest.Int64Val = Src.Int64Val;
1669 else
1670 assert("Integer types > 64 bits not supported");
1671 }
Brian Gaekec1a2be12003-11-07 21:20:47 +00001672 IMPLEMENT_VAARG(Pointer);
1673 IMPLEMENT_VAARG(Float);
1674 IMPLEMENT_VAARG(Double);
Brian Gaekec1a2be12003-11-07 21:20:47 +00001675 default:
Bill Wendlinge8156192006-12-07 01:30:32 +00001676 cerr << "Unhandled dest type for vaarg instruction: " << *Ty << "\n";
Brian Gaekec1a2be12003-11-07 21:20:47 +00001677 abort();
1678 }
Misha Brukmand1c881a2005-04-21 22:43:08 +00001679
Brian Gaekec1a2be12003-11-07 21:20:47 +00001680 // Set the Value of this Instruction.
1681 SetValue(&I, Dest, SF);
Andrew Lenharth558bc882005-06-18 18:34:52 +00001682
1683 // Move the pointer to the next vararg.
1684 ++VAList.UIntPairVal.second;
Brian Gaekec1a2be12003-11-07 21:20:47 +00001685}
1686
Chris Lattner92101ac2001-08-23 17:05:04 +00001687//===----------------------------------------------------------------------===//
1688// Dispatch and Execution Code
1689//===----------------------------------------------------------------------===//
1690
Chris Lattner92101ac2001-08-23 17:05:04 +00001691//===----------------------------------------------------------------------===//
Chris Lattnerda82ed52003-05-08 16:18:31 +00001692// callFunction - Execute the specified function...
Chris Lattner92101ac2001-08-23 17:05:04 +00001693//
Chris Lattnerda82ed52003-05-08 16:18:31 +00001694void Interpreter::callFunction(Function *F,
1695 const std::vector<GenericValue> &ArgVals) {
Misha Brukmand1c881a2005-04-21 22:43:08 +00001696 assert((ECStack.empty() || ECStack.back().Caller.getInstruction() == 0 ||
1697 ECStack.back().Caller.arg_size() == ArgVals.size()) &&
1698 "Incorrect number of arguments passed into function call!");
Chris Lattner63bd6132003-09-17 17:26:22 +00001699 // Make a new stack frame... and fill it in.
1700 ECStack.push_back(ExecutionContext());
1701 ExecutionContext &StackFrame = ECStack.back();
Chris Lattnerda82ed52003-05-08 16:18:31 +00001702 StackFrame.CurFunction = F;
Brian Gaekeaf955ba2003-11-07 05:22:49 +00001703
1704 // Special handling for external functions.
1705 if (F->isExternal()) {
1706 GenericValue Result = callExternalFunction (F, ArgVals);
1707 // Simulate a 'ret' instruction of the appropriate type.
1708 popStackAndReturnValueToCaller (F->getReturnType (), Result);
1709 return;
1710 }
1711
1712 // Get pointers to first LLVM BB & Instruction in function.
Chris Lattnercdf51782003-05-08 16:06:52 +00001713 StackFrame.CurBB = F->begin();
Chris Lattner92101ac2001-08-23 17:05:04 +00001714 StackFrame.CurInst = StackFrame.CurBB->begin();
Chris Lattner92101ac2001-08-23 17:05:04 +00001715
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00001716 // Run through the function arguments and initialize their values...
Chris Lattnere4d5c442005-03-15 04:54:21 +00001717 assert((ArgVals.size() == F->arg_size() ||
Misha Brukmand1c881a2005-04-21 22:43:08 +00001718 (ArgVals.size() > F->arg_size() && F->getFunctionType()->isVarArg()))&&
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00001719 "Invalid number of values passed to function invocation!");
Chris Lattnercdf51782003-05-08 16:06:52 +00001720
1721 // Handle non-varargs arguments...
Chris Lattner365a76e2001-09-10 04:49:44 +00001722 unsigned i = 0;
Chris Lattnere4d5c442005-03-15 04:54:21 +00001723 for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); AI != E; ++AI, ++i)
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001724 SetValue(AI, ArgVals[i], StackFrame);
Chris Lattnercdf51782003-05-08 16:06:52 +00001725
1726 // Handle varargs arguments...
1727 StackFrame.VarArgs.assign(ArgVals.begin()+i, ArgVals.end());
Chris Lattner92101ac2001-08-23 17:05:04 +00001728}
1729
Chris Lattner92101ac2001-08-23 17:05:04 +00001730void Interpreter::run() {
Brian Gaeke9ad671d2003-09-04 23:15:40 +00001731 while (!ECStack.empty()) {
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001732 // Interpret a single instruction & increment the "PC".
1733 ExecutionContext &SF = ECStack.back(); // Current stack frame
1734 Instruction &I = *SF.CurInst++; // Increment before execute
Misha Brukmand1c881a2005-04-21 22:43:08 +00001735
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001736 // Track the number of dynamic instructions executed.
1737 ++NumDynamicInsts;
Chris Lattner92101ac2001-08-23 17:05:04 +00001738
Bill Wendling480f0932006-11-27 23:54:50 +00001739 DOUT << "About to interpret: " << I;
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001740 visit(I); // Dispatch to one of the visit* methods...
Chris Lattner92101ac2001-08-23 17:05:04 +00001741 }
1742}