blob: c93dc620ed8b7ab678ec168c685a88767a72f53f [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();
1076 if (BitWidth <= 8)
1077 Idx = (int64_t)(int8_t)IdxGV.Int8Val;
1078 else if (BitWidth <= 16)
1079 Idx = (int64_t)(int16_t)IdxGV.Int16Val;
1080 else if (BitWidth <= 32)
1081 Idx = (int64_t)(int32_t)IdxGV.Int32Val;
1082 else if (BitWidth <= 64)
1083 Idx = (int64_t)IdxGV.Int64Val;
1084 else
1085 assert(0 && "Integer types >64 bits not supported");
Chris Lattnerd5644962005-01-08 20:05:34 +00001086 Total += PointerTy(TD.getTypeSize(ST->getElementType())*Idx);
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001087 }
Chris Lattner95c3af52001-10-29 19:32:19 +00001088 }
1089
Chris Lattnera34c5682002-08-27 22:33:45 +00001090 GenericValue Result;
1091 Result.PointerVal = getOperandValue(Ptr, SF).PointerVal + Total;
1092 return Result;
Chris Lattner95c3af52001-10-29 19:32:19 +00001093}
1094
Chris Lattnerd7916e92003-05-10 21:22:39 +00001095void Interpreter::visitGetElementPtrInst(GetElementPtrInst &I) {
1096 ExecutionContext &SF = ECStack.back();
Chris Lattnerfe11a972002-12-23 23:59:41 +00001097 SetValue(&I, TheEE->executeGEPOperation(I.getPointerOperand(),
Chris Lattner4af6de82003-11-25 20:44:56 +00001098 gep_type_begin(I), gep_type_end(I), SF), SF);
Chris Lattner95c3af52001-10-29 19:32:19 +00001099}
1100
Chris Lattnerd7916e92003-05-10 21:22:39 +00001101void Interpreter::visitLoadInst(LoadInst &I) {
1102 ExecutionContext &SF = ECStack.back();
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001103 GenericValue SRC = getOperandValue(I.getPointerOperand(), SF);
Chris Lattnerfe11a972002-12-23 23:59:41 +00001104 GenericValue *Ptr = (GenericValue*)GVTOP(SRC);
Chris Lattner374344c2003-05-08 16:52:43 +00001105 GenericValue Result = LoadValueFromMemory(Ptr, I.getType());
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001106 SetValue(&I, Result, SF);
Chris Lattner86660982001-08-27 05:16:50 +00001107}
1108
Chris Lattnerd7916e92003-05-10 21:22:39 +00001109void Interpreter::visitStoreInst(StoreInst &I) {
1110 ExecutionContext &SF = ECStack.back();
Chris Lattnerfddc7552002-10-15 20:34:05 +00001111 GenericValue Val = getOperandValue(I.getOperand(0), SF);
1112 GenericValue SRC = getOperandValue(I.getPointerOperand(), SF);
Chris Lattnerfe11a972002-12-23 23:59:41 +00001113 StoreValueToMemory(Val, (GenericValue *)GVTOP(SRC),
Chris Lattner683d5da92002-10-26 01:57:15 +00001114 I.getOperand(0)->getType());
Chris Lattnerfddc7552002-10-15 20:34:05 +00001115}
1116
Chris Lattner86660982001-08-27 05:16:50 +00001117//===----------------------------------------------------------------------===//
Chris Lattner92101ac2001-08-23 17:05:04 +00001118// Miscellaneous Instruction Implementations
1119//===----------------------------------------------------------------------===//
1120
Brian Gaekefea483d2003-11-07 20:04:22 +00001121void Interpreter::visitCallSite(CallSite CS) {
Chris Lattnerd7916e92003-05-10 21:22:39 +00001122 ExecutionContext &SF = ECStack.back();
Chris Lattner73011782003-12-28 09:44:37 +00001123
1124 // Check to see if this is an intrinsic function call...
1125 if (Function *F = CS.getCalledFunction())
Brian Gaeke34562ba2004-01-14 06:02:53 +00001126 if (F->isExternal ())
Chris Lattner73011782003-12-28 09:44:37 +00001127 switch (F->getIntrinsicID()) {
Brian Gaeke34562ba2004-01-14 06:02:53 +00001128 case Intrinsic::not_intrinsic:
1129 break;
Chris Lattner317201d2004-03-13 00:24:00 +00001130 case Intrinsic::vastart: { // va_start
Brian Gaeke9d20b712004-02-25 23:01:48 +00001131 GenericValue ArgIndex;
1132 ArgIndex.UIntPairVal.first = ECStack.size() - 1;
1133 ArgIndex.UIntPairVal.second = 0;
1134 SetValue(CS.getInstruction(), ArgIndex, SF);
Chris Lattner73011782003-12-28 09:44:37 +00001135 return;
Brian Gaeke9d20b712004-02-25 23:01:48 +00001136 }
Chris Lattner317201d2004-03-13 00:24:00 +00001137 case Intrinsic::vaend: // va_end is a noop for the interpreter
Chris Lattner73011782003-12-28 09:44:37 +00001138 return;
Chris Lattner317201d2004-03-13 00:24:00 +00001139 case Intrinsic::vacopy: // va_copy: dest = src
Chris Lattner73011782003-12-28 09:44:37 +00001140 SetValue(CS.getInstruction(), getOperandValue(*CS.arg_begin(), SF), SF);
1141 return;
1142 default:
Brian Gaeke34562ba2004-01-14 06:02:53 +00001143 // If it is an unknown intrinsic function, use the intrinsic lowering
Chris Lattner73011782003-12-28 09:44:37 +00001144 // class to transform it into hopefully tasty LLVM code.
1145 //
1146 Instruction *Prev = CS.getInstruction()->getPrev();
1147 BasicBlock *Parent = CS.getInstruction()->getParent();
1148 IL->LowerIntrinsicCall(cast<CallInst>(CS.getInstruction()));
1149
1150 // Restore the CurInst pointer to the first instruction newly inserted, if
1151 // any.
1152 if (!Prev) {
1153 SF.CurInst = Parent->begin();
1154 } else {
1155 SF.CurInst = Prev;
1156 ++SF.CurInst;
1157 }
Brian Gaekeb440dea2004-04-23 18:05:28 +00001158 return;
Chris Lattner73011782003-12-28 09:44:37 +00001159 }
1160
Brian Gaekefea483d2003-11-07 20:04:22 +00001161 SF.Caller = CS;
Chris Lattner02868352003-04-22 21:22:33 +00001162 std::vector<GenericValue> ArgVals;
Brian Gaekeae2495a2003-11-07 19:59:08 +00001163 const unsigned NumArgs = SF.Caller.arg_size();
1164 ArgVals.reserve(NumArgs);
1165 for (CallSite::arg_iterator i = SF.Caller.arg_begin(),
1166 e = SF.Caller.arg_end(); i != e; ++i) {
1167 Value *V = *i;
1168 ArgVals.push_back(getOperandValue(V, SF));
Chris Lattner93780132003-01-13 00:58:52 +00001169 // Promote all integral types whose size is < sizeof(int) into ints. We do
1170 // this by zero or sign extending the value as appropriate according to the
1171 // source type.
Brian Gaekeae2495a2003-11-07 19:59:08 +00001172 const Type *Ty = V->getType();
Chris Lattner42a75512007-01-15 02:27:26 +00001173 if (Ty->isInteger()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001174 if (Ty->getPrimitiveSizeInBits() == 1)
Reid Spencer4fe16d62007-01-11 18:21:29 +00001175 ArgVals.back().Int32Val = ArgVals.back().Int1Val;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001176 else if (Ty->getPrimitiveSizeInBits() <= 8)
1177 ArgVals.back().Int32Val = ArgVals.back().Int8Val;
1178 else if (Ty->getPrimitiveSizeInBits() <= 16)
1179 ArgVals.back().Int32Val = ArgVals.back().Int16Val;
Chris Lattner93780132003-01-13 00:58:52 +00001180 }
1181 }
Chris Lattner365a76e2001-09-10 04:49:44 +00001182
Misha Brukmand1c881a2005-04-21 22:43:08 +00001183 // To handle indirect calls, we must get the pointer value from the argument
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00001184 // and treat it as a function pointer.
Misha Brukmand1c881a2005-04-21 22:43:08 +00001185 GenericValue SRC = getOperandValue(SF.Caller.getCalledValue(), SF);
Chris Lattnerda82ed52003-05-08 16:18:31 +00001186 callFunction((Function*)GVTOP(SRC), ArgVals);
Chris Lattner92101ac2001-08-23 17:05:04 +00001187}
1188
Brian Gaeke63438cc2003-12-11 00:22:59 +00001189static GenericValue executeShlInst(GenericValue Src1, GenericValue Src2,
1190 const Type *Ty) {
Chris Lattner86660982001-08-27 05:16:50 +00001191 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001192 if (const IntegerType *ITy = cast<IntegerType>(Ty)) {
1193 unsigned BitWidth = ITy->getBitWidth();
1194 if (BitWidth <= 8)
1195 Dest.Int8Val = ((uint8_t)Src1.Int8Val) << ((uint32_t)Src2.Int8Val);
1196 else if (BitWidth <= 16)
1197 Dest.Int16Val = ((uint16_t)Src1.Int16Val) << ((uint32_t)Src2.Int8Val);
1198 else if (BitWidth <= 32)
1199 Dest.Int32Val = ((uint32_t)Src1.Int32Val) << ((uint32_t)Src2.Int8Val);
1200 else if (BitWidth <= 64)
1201 Dest.Int64Val = ((uint64_t)Src1.Int64Val) << ((uint32_t)Src2.Int8Val);
1202 else {
1203 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n";
1204 abort();
1205 }
1206 } else {
Bill Wendlinge8156192006-12-07 01:30:32 +00001207 cerr << "Unhandled type for Shl instruction: " << *Ty << "\n";
Reid Spencera54b7cb2007-01-12 07:05:14 +00001208 abort();
Chris Lattner86660982001-08-27 05:16:50 +00001209 }
Brian Gaeke63438cc2003-12-11 00:22:59 +00001210 return Dest;
Chris Lattner86660982001-08-27 05:16:50 +00001211}
1212
Reid Spencer3822ff52006-11-08 06:47:33 +00001213static GenericValue executeLShrInst(GenericValue Src1, GenericValue Src2,
1214 const Type *Ty) {
Chris Lattner86660982001-08-27 05:16:50 +00001215 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001216 if (const IntegerType *ITy = cast<IntegerType>(Ty)) {
1217 unsigned BitWidth = ITy->getBitWidth();
1218 if (BitWidth <= 8)
1219 Dest.Int8Val = ((uint8_t)Src1.Int8Val) >> ((uint32_t)Src2.Int8Val);
1220 else if (BitWidth <= 16)
1221 Dest.Int16Val = ((uint16_t)Src1.Int16Val) >> ((uint32_t)Src2.Int8Val);
1222 else if (BitWidth <= 32)
1223 Dest.Int32Val = ((uint32_t)Src1.Int32Val) >> ((uint32_t)Src2.Int8Val);
1224 else if (BitWidth <= 64)
1225 Dest.Int64Val = ((uint64_t)Src1.Int64Val) >> ((uint32_t)Src2.Int8Val);
1226 else {
1227 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n";
1228 abort();
1229 }
1230 } else {
Bill Wendlinge8156192006-12-07 01:30:32 +00001231 cerr << "Unhandled type for LShr instruction: " << *Ty << "\n";
Reid Spencer3822ff52006-11-08 06:47:33 +00001232 abort();
1233 }
1234 return Dest;
1235}
1236
1237static GenericValue executeAShrInst(GenericValue Src1, GenericValue Src2,
1238 const Type *Ty) {
1239 GenericValue Dest;
Reid Spencera54b7cb2007-01-12 07:05:14 +00001240 if (const IntegerType *ITy = cast<IntegerType>(Ty)) {
1241 unsigned BitWidth = ITy->getBitWidth();
1242 if (BitWidth <= 8)
1243 Dest.Int8Val = ((int8_t)Src1.Int8Val) >> ((int32_t)Src2.Int8Val);
1244 else if (BitWidth <= 16)
1245 Dest.Int16Val = ((int16_t)Src1.Int16Val) >> ((int32_t)Src2.Int8Val);
1246 else if (BitWidth <= 32)
1247 Dest.Int32Val = ((int32_t)Src1.Int32Val) >> ((int32_t)Src2.Int8Val);
1248 else if (BitWidth <= 64)
1249 Dest.Int64Val = ((int64_t)Src1.Int64Val) >> ((int32_t)Src2.Int8Val);
1250 else {
1251 cerr << "Integer types > 64 bits not supported: " << *Ty << "\n"; \
1252 abort();
1253 }
1254 } else {
Bill Wendlinge8156192006-12-07 01:30:32 +00001255 cerr << "Unhandled type for AShr instruction: " << *Ty << "\n";
Chris Lattner02868352003-04-22 21:22:33 +00001256 abort();
Chris Lattner86660982001-08-27 05:16:50 +00001257 }
Brian Gaeke63438cc2003-12-11 00:22:59 +00001258 return Dest;
1259}
1260
1261void Interpreter::visitShl(ShiftInst &I) {
1262 ExecutionContext &SF = ECStack.back();
1263 const Type *Ty = I.getOperand(0)->getType();
1264 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
1265 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
1266 GenericValue Dest;
1267 Dest = executeShlInst (Src1, Src2, Ty);
1268 SetValue(&I, Dest, SF);
1269}
1270
Reid Spencer3822ff52006-11-08 06:47:33 +00001271void Interpreter::visitLShr(ShiftInst &I) {
Brian Gaeke63438cc2003-12-11 00:22:59 +00001272 ExecutionContext &SF = ECStack.back();
1273 const Type *Ty = I.getOperand(0)->getType();
1274 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
1275 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
1276 GenericValue Dest;
Reid Spencer3822ff52006-11-08 06:47:33 +00001277 Dest = executeLShrInst (Src1, Src2, Ty);
1278 SetValue(&I, Dest, SF);
1279}
1280
1281void Interpreter::visitAShr(ShiftInst &I) {
1282 ExecutionContext &SF = ECStack.back();
1283 const Type *Ty = I.getOperand(0)->getType();
1284 GenericValue Src1 = getOperandValue(I.getOperand(0), SF);
1285 GenericValue Src2 = getOperandValue(I.getOperand(1), SF);
1286 GenericValue Dest;
1287 Dest = executeAShrInst (Src1, Src2, Ty);
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001288 SetValue(&I, Dest, SF);
Chris Lattner86660982001-08-27 05:16:50 +00001289}
1290
Reid Spencera54b7cb2007-01-12 07:05:14 +00001291#define INTEGER_ASSIGN(DEST, BITWIDTH, VAL) \
1292 if (BITWIDTH == 1) { \
1293 Dest.Int1Val = (bool) VAL; \
1294 } else if (BITWIDTH <= 8) { \
1295 Dest.Int8Val = (uint8_t) VAL; \
1296 } else if (BITWIDTH <= 16) { \
1297 Dest.Int16Val = (uint16_t) VAL; \
1298 } else if (BITWIDTH <= 32) { \
1299 Dest.Int32Val = (uint32_t) VAL; \
1300 } else \
1301 Dest.Int64Val = (uint64_t) VAL;
Chris Lattner86660982001-08-27 05:16:50 +00001302
Reid Spencera54b7cb2007-01-12 07:05:14 +00001303GenericValue Interpreter::executeTruncInst(Value *SrcVal, const Type *DstTy,
1304 ExecutionContext &SF) {
Chris Lattnera34c5682002-08-27 22:33:45 +00001305 const Type *SrcTy = SrcVal->getType();
1306 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
Reid Spencera54b7cb2007-01-12 07:05:14 +00001307 const IntegerType *DITy = cast<IntegerType>(DstTy);
1308 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1309 unsigned DBitWidth = DITy->getBitWidth();
1310 unsigned SBitWidth = SITy->getBitWidth();
1311 assert(SBitWidth <= 64 && DBitWidth <= 64 &&
1312 "Integer types > 64 bits not supported");
1313 assert(SBitWidth > DBitWidth && "Invalid truncate");
Chris Lattner86660982001-08-27 05:16:50 +00001314
Reid Spencera54b7cb2007-01-12 07:05:14 +00001315 // Mask the source value to its actual bit width. This ensures that any
1316 // high order bits are cleared.
1317 uint64_t Mask = (1ULL << DBitWidth) - 1;
1318 uint64_t MaskedVal = 0;
1319 if (SBitWidth <= 8)
1320 MaskedVal = Src.Int8Val & Mask;
1321 else if (SBitWidth <= 16)
1322 MaskedVal = Src.Int16Val & Mask;
1323 else if (SBitWidth <= 32)
1324 MaskedVal = Src.Int32Val & Mask;
1325 else
1326 MaskedVal = Src.Int64Val & Mask;
Chris Lattnera34c5682002-08-27 22:33:45 +00001327
Reid Spencera54b7cb2007-01-12 07:05:14 +00001328 INTEGER_ASSIGN(Dest, DBitWidth, MaskedVal);
Chris Lattnera34c5682002-08-27 22:33:45 +00001329 return Dest;
Chris Lattner86660982001-08-27 05:16:50 +00001330}
Chris Lattner92101ac2001-08-23 17:05:04 +00001331
Reid Spencera54b7cb2007-01-12 07:05:14 +00001332GenericValue Interpreter::executeSExtInst(Value *SrcVal, const Type *DstTy,
1333 ExecutionContext &SF) {
1334 const Type *SrcTy = SrcVal->getType();
1335 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1336 const IntegerType *DITy = cast<IntegerType>(DstTy);
1337 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1338 unsigned DBitWidth = DITy->getBitWidth();
1339 unsigned SBitWidth = SITy->getBitWidth();
1340 assert(SBitWidth <= 64 && DBitWidth <= 64 &&
1341 "Integer types > 64 bits not supported");
1342 assert(SBitWidth < DBitWidth && "Invalid sign extend");
1343 int64_t Extended = 0;
1344 if (SBitWidth == 1)
1345 // For sign extension from bool, we must extend the source bits.
1346 Extended = 0 - (Src.Int1Val & 1);
1347 else if (SBitWidth <= 8)
1348 Extended = (int64_t) (int8_t)Src.Int8Val;
1349 else if (SBitWidth <= 16)
1350 Extended = (int64_t) (int16_t)Src.Int16Val;
1351 else if (SBitWidth <= 32)
1352 Extended = (int64_t) (int32_t)Src.Int32Val;
1353 else
1354 Extended = (int64_t) Src.Int64Val;
1355
1356 // Now that we have a sign extended value, assign it to the destination
1357 INTEGER_ASSIGN(Dest, DBitWidth, Extended);
1358 return Dest;
1359}
1360
1361GenericValue Interpreter::executeZExtInst(Value *SrcVal, const Type *DstTy,
1362 ExecutionContext &SF) {
1363 const Type *SrcTy = SrcVal->getType();
1364 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1365 const IntegerType *DITy = cast<IntegerType>(DstTy);
1366 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1367 unsigned DBitWidth = DITy->getBitWidth();
1368 unsigned SBitWidth = SITy->getBitWidth();
1369 assert(SBitWidth <= 64 && DBitWidth <= 64 &&
1370 "Integer types > 64 bits not supported");
1371 assert(SBitWidth < DBitWidth && "Invalid sign extend");
1372 uint64_t Extended = 0;
1373 if (SBitWidth == 1)
1374 // For sign extension from bool, we must extend the source bits.
1375 Extended = (uint64_t) (Src.Int1Val & 1);
1376 else if (SBitWidth <= 8)
1377 Extended = (uint64_t) (uint8_t)Src.Int8Val;
1378 else if (SBitWidth <= 16)
1379 Extended = (uint64_t) (uint16_t)Src.Int16Val;
1380 else if (SBitWidth <= 32)
1381 Extended = (uint64_t) (uint32_t)Src.Int32Val;
1382 else
1383 Extended = (uint64_t) Src.Int64Val;
1384
1385 // Now that we have a sign extended value, assign it to the destination
1386 INTEGER_ASSIGN(Dest, DBitWidth, Extended);
1387 return Dest;
1388}
1389
1390GenericValue Interpreter::executeFPTruncInst(Value *SrcVal, const Type *DstTy,
1391 ExecutionContext &SF) {
1392 const Type *SrcTy = SrcVal->getType();
1393 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1394 assert(SrcTy == Type::DoubleTy && DstTy == Type::FloatTy &&
1395 "Invalid FPTrunc instruction");
1396 Dest.FloatVal = (float) Src.DoubleVal;
1397 return Dest;
1398}
1399
1400GenericValue Interpreter::executeFPExtInst(Value *SrcVal, const Type *DstTy,
1401 ExecutionContext &SF) {
1402 const Type *SrcTy = SrcVal->getType();
1403 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1404 assert(SrcTy == Type::FloatTy && DstTy == Type::DoubleTy &&
1405 "Invalid FPTrunc instruction");
1406 Dest.DoubleVal = (double) Src.FloatVal;
1407 return Dest;
1408}
1409
1410GenericValue Interpreter::executeFPToUIInst(Value *SrcVal, const Type *DstTy,
1411 ExecutionContext &SF) {
1412 const Type *SrcTy = SrcVal->getType();
1413 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1414 const IntegerType *DITy = cast<IntegerType>(DstTy);
1415 unsigned DBitWidth = DITy->getBitWidth();
1416 assert(DBitWidth <= 64 && "Integer types > 64 bits not supported");
1417 assert(SrcTy->isFloatingPoint() && "Invalid FPToUI instruction");
1418 uint64_t Converted = 0;
1419 if (SrcTy->getTypeID() == Type::FloatTyID)
1420 Converted = (uint64_t) Src.FloatVal;
1421 else
1422 Converted = (uint64_t) Src.DoubleVal;
1423
1424 INTEGER_ASSIGN(Dest, DBitWidth, Converted);
1425 return Dest;
1426}
1427
1428GenericValue Interpreter::executeFPToSIInst(Value *SrcVal, const Type *DstTy,
1429 ExecutionContext &SF) {
1430 const Type *SrcTy = SrcVal->getType();
1431 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1432 const IntegerType *DITy = cast<IntegerType>(DstTy);
1433 unsigned DBitWidth = DITy->getBitWidth();
1434 assert(DBitWidth <= 64 && "Integer types > 64 bits not supported");
1435 assert(SrcTy->isFloatingPoint() && "Invalid FPToSI instruction");
1436 int64_t Converted = 0;
1437 if (SrcTy->getTypeID() == Type::FloatTyID)
1438 Converted = (int64_t) Src.FloatVal;
1439 else
1440 Converted = (int64_t) Src.DoubleVal;
1441
1442 INTEGER_ASSIGN(Dest, DBitWidth, Converted);
1443 return Dest;
1444}
1445
1446GenericValue Interpreter::executeUIToFPInst(Value *SrcVal, const Type *DstTy,
1447 ExecutionContext &SF) {
1448 const Type *SrcTy = SrcVal->getType();
1449 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1450 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1451 unsigned SBitWidth = SITy->getBitWidth();
1452 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1453 assert(DstTy->isFloatingPoint() && "Invalid UIToFP instruction");
1454 uint64_t Converted = 0;
1455 if (SBitWidth == 1)
1456 Converted = (uint64_t) Src.Int1Val;
1457 else if (SBitWidth <= 8)
1458 Converted = (uint64_t) Src.Int8Val;
1459 else if (SBitWidth <= 16)
1460 Converted = (uint64_t) Src.Int16Val;
1461 else if (SBitWidth <= 32)
1462 Converted = (uint64_t) Src.Int32Val;
1463 else
1464 Converted = (uint64_t) Src.Int64Val;
1465
1466 if (DstTy->getTypeID() == Type::FloatTyID)
1467 Dest.FloatVal = (float) Converted;
1468 else
1469 Dest.DoubleVal = (double) Converted;
1470 return Dest;
1471}
1472
1473GenericValue Interpreter::executeSIToFPInst(Value *SrcVal, const Type *DstTy,
1474 ExecutionContext &SF) {
1475 const Type *SrcTy = SrcVal->getType();
1476 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1477 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1478 unsigned SBitWidth = SITy->getBitWidth();
1479 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1480 assert(DstTy->isFloatingPoint() && "Invalid UIToFP instruction");
1481 int64_t Converted = 0;
1482 if (SBitWidth == 1)
1483 Converted = 0LL - Src.Int1Val;
1484 else if (SBitWidth <= 8)
1485 Converted = (int64_t) (int8_t)Src.Int8Val;
1486 else if (SBitWidth <= 16)
1487 Converted = (int64_t) (int16_t)Src.Int16Val;
1488 else if (SBitWidth <= 32)
1489 Converted = (int64_t) (int32_t)Src.Int32Val;
1490 else
1491 Converted = (int64_t) Src.Int64Val;
1492
1493 if (DstTy->getTypeID() == Type::FloatTyID)
1494 Dest.FloatVal = (float) Converted;
1495 else
1496 Dest.DoubleVal = (double) Converted;
1497 return Dest;
1498}
1499
1500GenericValue Interpreter::executePtrToIntInst(Value *SrcVal, const Type *DstTy,
1501 ExecutionContext &SF) {
1502 const Type *SrcTy = SrcVal->getType();
1503 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1504 const IntegerType *DITy = cast<IntegerType>(DstTy);
1505 unsigned DBitWidth = DITy->getBitWidth();
1506 assert(DBitWidth <= 64 && "Integer types > 64 bits not supported");
1507 assert(isa<PointerType>(SrcTy) && "Invalid PtrToInt instruction");
1508 INTEGER_ASSIGN(Dest, DBitWidth, (intptr_t) Src.PointerVal);
1509 return Dest;
1510}
1511
1512GenericValue Interpreter::executeIntToPtrInst(Value *SrcVal, const Type *DstTy,
1513 ExecutionContext &SF) {
1514 const Type *SrcTy = SrcVal->getType();
1515 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1516 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1517 unsigned SBitWidth = SITy->getBitWidth();
1518 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1519 assert(isa<PointerType>(DstTy) && "Invalid PtrToInt instruction");
1520 uint64_t Converted = 0;
1521 if (SBitWidth == 1)
1522 Converted = (uint64_t) Src.Int1Val;
1523 else if (SBitWidth <= 8)
1524 Converted = (uint64_t) Src.Int8Val;
1525 else if (SBitWidth <= 16)
1526 Converted = (uint64_t) Src.Int16Val;
1527 else if (SBitWidth <= 32)
1528 Converted = (uint64_t) Src.Int32Val;
1529 else
1530 Converted = (uint64_t) Src.Int64Val;
1531
1532 Dest.PointerVal = (PointerTy) Converted;
1533 return Dest;
1534}
1535
1536GenericValue Interpreter::executeBitCastInst(Value *SrcVal, const Type *DstTy,
1537 ExecutionContext &SF) {
1538
1539 const Type *SrcTy = SrcVal->getType();
1540 GenericValue Dest, Src = getOperandValue(SrcVal, SF);
1541 if (isa<PointerType>(DstTy)) {
1542 assert(isa<PointerType>(SrcTy) && "Invalid BitCast");
1543 Dest.PointerVal = Src.PointerVal;
Chris Lattner42a75512007-01-15 02:27:26 +00001544 } else if (DstTy->isInteger()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001545 const IntegerType *DITy = cast<IntegerType>(DstTy);
1546 unsigned DBitWidth = DITy->getBitWidth();
1547 if (SrcTy == Type::FloatTy) {
1548 Dest.Int32Val = FloatToBits(Src.FloatVal);
1549 } else if (SrcTy == Type::DoubleTy) {
1550 Dest.Int64Val = DoubleToBits(Src.DoubleVal);
Chris Lattner42a75512007-01-15 02:27:26 +00001551 } else if (SrcTy->isInteger()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001552 const IntegerType *SITy = cast<IntegerType>(SrcTy);
1553 unsigned SBitWidth = SITy->getBitWidth();
1554 assert(SBitWidth <= 64 && "Integer types > 64 bits not supported");
1555 assert(SBitWidth == DBitWidth && "Invalid BitCast");
1556 if (SBitWidth == 1)
1557 Dest.Int1Val = Src.Int1Val;
1558 else if (SBitWidth <= 8)
1559 Dest.Int8Val = Src.Int8Val;
1560 else if (SBitWidth <= 16)
1561 Dest.Int16Val = Src.Int16Val;
1562 else if (SBitWidth <= 32)
1563 Dest.Int32Val = Src.Int32Val;
1564 else
1565 Dest.Int64Val = Src.Int64Val;
1566 } else
1567 assert(0 && "Invalid BitCast");
1568 } else if (DstTy == Type::FloatTy) {
Chris Lattner42a75512007-01-15 02:27:26 +00001569 if (SrcTy->isInteger())
Reid Spencera54b7cb2007-01-12 07:05:14 +00001570 Dest.FloatVal = BitsToFloat(Src.Int32Val);
1571 else
1572 Dest.FloatVal = Src.FloatVal;
1573 } else if (DstTy == Type::DoubleTy) {
Chris Lattner42a75512007-01-15 02:27:26 +00001574 if (SrcTy->isInteger())
Reid Spencera54b7cb2007-01-12 07:05:14 +00001575 Dest.DoubleVal = BitsToDouble(Src.Int64Val);
1576 else
1577 Dest.DoubleVal = Src.DoubleVal;
1578 } else
1579 assert(0 && "Invalid Bitcast");
1580
1581 return Dest;
1582}
1583
1584void Interpreter::visitTruncInst(TruncInst &I) {
Chris Lattnerd7916e92003-05-10 21:22:39 +00001585 ExecutionContext &SF = ECStack.back();
Reid Spencera54b7cb2007-01-12 07:05:14 +00001586 SetValue(&I, executeTruncInst(I.getOperand(0), I.getType(), SF), SF);
1587}
1588
1589void Interpreter::visitSExtInst(SExtInst &I) {
1590 ExecutionContext &SF = ECStack.back();
1591 SetValue(&I, executeSExtInst(I.getOperand(0), I.getType(), SF), SF);
1592}
1593
1594void Interpreter::visitZExtInst(ZExtInst &I) {
1595 ExecutionContext &SF = ECStack.back();
1596 SetValue(&I, executeZExtInst(I.getOperand(0), I.getType(), SF), SF);
1597}
1598
1599void Interpreter::visitFPTruncInst(FPTruncInst &I) {
1600 ExecutionContext &SF = ECStack.back();
1601 SetValue(&I, executeFPTruncInst(I.getOperand(0), I.getType(), SF), SF);
1602}
1603
1604void Interpreter::visitFPExtInst(FPExtInst &I) {
1605 ExecutionContext &SF = ECStack.back();
1606 SetValue(&I, executeFPExtInst(I.getOperand(0), I.getType(), SF), SF);
1607}
1608
1609void Interpreter::visitUIToFPInst(UIToFPInst &I) {
1610 ExecutionContext &SF = ECStack.back();
1611 SetValue(&I, executeUIToFPInst(I.getOperand(0), I.getType(), SF), SF);
1612}
1613
1614void Interpreter::visitSIToFPInst(SIToFPInst &I) {
1615 ExecutionContext &SF = ECStack.back();
1616 SetValue(&I, executeSIToFPInst(I.getOperand(0), I.getType(), SF), SF);
1617}
1618
1619void Interpreter::visitFPToUIInst(FPToUIInst &I) {
1620 ExecutionContext &SF = ECStack.back();
1621 SetValue(&I, executeFPToUIInst(I.getOperand(0), I.getType(), SF), SF);
1622}
1623
1624void Interpreter::visitFPToSIInst(FPToSIInst &I) {
1625 ExecutionContext &SF = ECStack.back();
1626 SetValue(&I, executeFPToSIInst(I.getOperand(0), I.getType(), SF), SF);
1627}
1628
1629void Interpreter::visitPtrToIntInst(PtrToIntInst &I) {
1630 ExecutionContext &SF = ECStack.back();
1631 SetValue(&I, executePtrToIntInst(I.getOperand(0), I.getType(), SF), SF);
1632}
1633
1634void Interpreter::visitIntToPtrInst(IntToPtrInst &I) {
1635 ExecutionContext &SF = ECStack.back();
1636 SetValue(&I, executeIntToPtrInst(I.getOperand(0), I.getType(), SF), SF);
1637}
1638
1639void Interpreter::visitBitCastInst(BitCastInst &I) {
1640 ExecutionContext &SF = ECStack.back();
1641 SetValue(&I, executeBitCastInst(I.getOperand(0), I.getType(), SF), SF);
Chris Lattnera34c5682002-08-27 22:33:45 +00001642}
Chris Lattner92101ac2001-08-23 17:05:04 +00001643
Brian Gaekec1a2be12003-11-07 21:20:47 +00001644#define IMPLEMENT_VAARG(TY) \
1645 case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break
1646
1647void Interpreter::visitVAArgInst(VAArgInst &I) {
1648 ExecutionContext &SF = ECStack.back();
1649
Brian Gaeke9d20b712004-02-25 23:01:48 +00001650 // Get the incoming valist parameter. LLI treats the valist as a
1651 // (ec-stack-depth var-arg-index) pair.
Brian Gaekec1a2be12003-11-07 21:20:47 +00001652 GenericValue VAList = getOperandValue(I.getOperand(0), SF);
Brian Gaeke9d20b712004-02-25 23:01:48 +00001653 GenericValue Dest;
1654 GenericValue Src = ECStack[VAList.UIntPairVal.first]
Misha Brukmand1c881a2005-04-21 22:43:08 +00001655 .VarArgs[VAList.UIntPairVal.second];
Brian Gaekec1a2be12003-11-07 21:20:47 +00001656 const Type *Ty = I.getType();
Chris Lattnerf70c22b2004-06-17 18:19:28 +00001657 switch (Ty->getTypeID()) {
Reid Spencera54b7cb2007-01-12 07:05:14 +00001658 case Type::IntegerTyID: {
1659 unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
1660 if (BitWidth == 1)
1661 Dest.Int1Val = Src.Int1Val;
1662 else if (BitWidth <= 8)
1663 Dest.Int8Val = Src.Int8Val;
1664 else if (BitWidth <= 16)
1665 Dest.Int16Val = Src.Int16Val;
1666 else if (BitWidth <= 32)
1667 Dest.Int32Val = Src.Int32Val;
1668 else if (BitWidth <= 64)
1669 Dest.Int64Val = Src.Int64Val;
1670 else
1671 assert("Integer types > 64 bits not supported");
1672 }
Brian Gaekec1a2be12003-11-07 21:20:47 +00001673 IMPLEMENT_VAARG(Pointer);
1674 IMPLEMENT_VAARG(Float);
1675 IMPLEMENT_VAARG(Double);
Brian Gaekec1a2be12003-11-07 21:20:47 +00001676 default:
Bill Wendlinge8156192006-12-07 01:30:32 +00001677 cerr << "Unhandled dest type for vaarg instruction: " << *Ty << "\n";
Brian Gaekec1a2be12003-11-07 21:20:47 +00001678 abort();
1679 }
Misha Brukmand1c881a2005-04-21 22:43:08 +00001680
Brian Gaekec1a2be12003-11-07 21:20:47 +00001681 // Set the Value of this Instruction.
1682 SetValue(&I, Dest, SF);
Andrew Lenharth558bc882005-06-18 18:34:52 +00001683
1684 // Move the pointer to the next vararg.
1685 ++VAList.UIntPairVal.second;
Brian Gaekec1a2be12003-11-07 21:20:47 +00001686}
1687
Chris Lattner92101ac2001-08-23 17:05:04 +00001688//===----------------------------------------------------------------------===//
1689// Dispatch and Execution Code
1690//===----------------------------------------------------------------------===//
1691
Chris Lattner92101ac2001-08-23 17:05:04 +00001692//===----------------------------------------------------------------------===//
Chris Lattnerda82ed52003-05-08 16:18:31 +00001693// callFunction - Execute the specified function...
Chris Lattner92101ac2001-08-23 17:05:04 +00001694//
Chris Lattnerda82ed52003-05-08 16:18:31 +00001695void Interpreter::callFunction(Function *F,
1696 const std::vector<GenericValue> &ArgVals) {
Misha Brukmand1c881a2005-04-21 22:43:08 +00001697 assert((ECStack.empty() || ECStack.back().Caller.getInstruction() == 0 ||
1698 ECStack.back().Caller.arg_size() == ArgVals.size()) &&
1699 "Incorrect number of arguments passed into function call!");
Chris Lattner63bd6132003-09-17 17:26:22 +00001700 // Make a new stack frame... and fill it in.
1701 ECStack.push_back(ExecutionContext());
1702 ExecutionContext &StackFrame = ECStack.back();
Chris Lattnerda82ed52003-05-08 16:18:31 +00001703 StackFrame.CurFunction = F;
Brian Gaekeaf955ba2003-11-07 05:22:49 +00001704
1705 // Special handling for external functions.
1706 if (F->isExternal()) {
1707 GenericValue Result = callExternalFunction (F, ArgVals);
1708 // Simulate a 'ret' instruction of the appropriate type.
1709 popStackAndReturnValueToCaller (F->getReturnType (), Result);
1710 return;
1711 }
1712
1713 // Get pointers to first LLVM BB & Instruction in function.
Chris Lattnercdf51782003-05-08 16:06:52 +00001714 StackFrame.CurBB = F->begin();
Chris Lattner92101ac2001-08-23 17:05:04 +00001715 StackFrame.CurInst = StackFrame.CurBB->begin();
Chris Lattner92101ac2001-08-23 17:05:04 +00001716
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00001717 // Run through the function arguments and initialize their values...
Chris Lattnere4d5c442005-03-15 04:54:21 +00001718 assert((ArgVals.size() == F->arg_size() ||
Misha Brukmand1c881a2005-04-21 22:43:08 +00001719 (ArgVals.size() > F->arg_size() && F->getFunctionType()->isVarArg()))&&
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00001720 "Invalid number of values passed to function invocation!");
Chris Lattnercdf51782003-05-08 16:06:52 +00001721
1722 // Handle non-varargs arguments...
Chris Lattner365a76e2001-09-10 04:49:44 +00001723 unsigned i = 0;
Chris Lattnere4d5c442005-03-15 04:54:21 +00001724 for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); AI != E; ++AI, ++i)
Chris Lattner0b12b5f2002-06-25 16:13:21 +00001725 SetValue(AI, ArgVals[i], StackFrame);
Chris Lattnercdf51782003-05-08 16:06:52 +00001726
1727 // Handle varargs arguments...
1728 StackFrame.VarArgs.assign(ArgVals.begin()+i, ArgVals.end());
Chris Lattner92101ac2001-08-23 17:05:04 +00001729}
1730
Chris Lattner92101ac2001-08-23 17:05:04 +00001731void Interpreter::run() {
Brian Gaeke9ad671d2003-09-04 23:15:40 +00001732 while (!ECStack.empty()) {
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001733 // Interpret a single instruction & increment the "PC".
1734 ExecutionContext &SF = ECStack.back(); // Current stack frame
1735 Instruction &I = *SF.CurInst++; // Increment before execute
Misha Brukmand1c881a2005-04-21 22:43:08 +00001736
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001737 // Track the number of dynamic instructions executed.
1738 ++NumDynamicInsts;
Chris Lattner92101ac2001-08-23 17:05:04 +00001739
Bill Wendling480f0932006-11-27 23:54:50 +00001740 DOUT << "About to interpret: " << I;
Brian Gaeke03e43dc2003-10-24 19:59:01 +00001741 visit(I); // Dispatch to one of the visit* methods...
Chris Lattner92101ac2001-08-23 17:05:04 +00001742 }
1743}