diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-06-05 05:32:15 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-06-05 05:32:15 +0000 |
commit | fa809d8e8fa496ecae313cd76f267d59963b6517 (patch) | |
tree | c27937c4080ebab0f9988fac99bbefff692a32d6 /lib | |
parent | 4203dcc7637fce437af56e51ed7d9fef8f1ceeca (diff) | |
download | klee-fa809d8e8fa496ecae313cd76f267d59963b6517.tar.gz |
(llvm up) Update klee for introduction of f{add,sub,mul} instructions.
- Please update & rebuild LLVM. git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@72919 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Core/Executor.cpp | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 21356af9..fece4af9 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -1584,53 +1584,25 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { break; // Arithmetic / logical -#define FP_CONSTANT_BINOP(op, type, l, r, target, state) \ - bindLocal(target, state, \ - ConstantExpr::alloc(op(toConstant(state, l, "floating point")->getConstantValue(), \ - toConstant(state, r, "floating point")->getConstantValue(), \ - type), type)) + case Instruction::Add: { - BinaryOperator *bi = cast<BinaryOperator>(i); ref<Expr> left = eval(ki, 0, state).value; ref<Expr> right = eval(ki, 1, state).value; - - if( bi->getType()->getTypeID() == llvm::Type::IntegerTyID ) { - bindLocal(ki, state, AddExpr::create(left, right)); - } else { - Expr::Width type = Expr::getWidthForLLVMType(bi->getType()); - FP_CONSTANT_BINOP(floats::add, type, left, right, ki, state); - } - + bindLocal(ki, state, AddExpr::create(left, right)); break; } case Instruction::Sub: { - BinaryOperator *bi = cast<BinaryOperator>(i); ref<Expr> left = eval(ki, 0, state).value; ref<Expr> right = eval(ki, 1, state).value; - - if( bi->getType()->getTypeID() == llvm::Type::IntegerTyID ) { - bindLocal(ki, state, SubExpr::create(left, right)); - } else { - Expr::Width type = Expr::getWidthForLLVMType(bi->getType()); - FP_CONSTANT_BINOP(floats::sub, type, left, right, ki, state); - } - + bindLocal(ki, state, SubExpr::create(left, right)); break; } case Instruction::Mul: { - BinaryOperator *bi = cast<BinaryOperator>(i); ref<Expr> left = eval(ki, 0, state).value; ref<Expr> right = eval(ki, 1, state).value; - - if( bi->getType()->getTypeID() == llvm::Type::IntegerTyID ) { - bindLocal(ki, state, MulExpr::create(left, right)); - } else { - Expr::Width type = Expr::getWidthForLLVMType(bi->getType()); - FP_CONSTANT_BINOP(floats::mul, type, left, right, ki, state); - } - + bindLocal(ki, state, MulExpr::create(left, right)); break; } @@ -1905,7 +1877,43 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { break; } - // Floating Point specific instructions + // Floating point specific instructions + +#define FP_CONSTANT_BINOP(op, type, l, r, target, state) \ + bindLocal(target, state, \ + ConstantExpr::alloc(op(toConstant(state, l, \ + "floating point")->getConstantValue(), \ + toConstant(state, r, \ + "floating point")->getConstantValue(), \ + type), type)) + + case Instruction::FAdd: { + BinaryOperator *bi = cast<BinaryOperator>(i); + ref<Expr> left = eval(ki, 0, state).value; + ref<Expr> right = eval(ki, 1, state).value; + Expr::Width type = Expr::getWidthForLLVMType(bi->getType()); + FP_CONSTANT_BINOP(floats::add, type, left, right, ki, state); + break; + } + + case Instruction::FSub: { + BinaryOperator *bi = cast<BinaryOperator>(i); + ref<Expr> left = eval(ki, 0, state).value; + ref<Expr> right = eval(ki, 1, state).value; + Expr::Width type = Expr::getWidthForLLVMType(bi->getType()); + FP_CONSTANT_BINOP(floats::sub, type, left, right, ki, state); + break; + } + + case Instruction::FMul: { + BinaryOperator *bi = cast<BinaryOperator>(i); + ref<Expr> left = eval(ki, 0, state).value; + ref<Expr> right = eval(ki, 1, state).value; + Expr::Width type = Expr::getWidthForLLVMType(bi->getType()); + FP_CONSTANT_BINOP(floats::mul, type, left, right, ki, state); + break; + } + case Instruction::FPTrunc: { FPTruncInst *fi = cast<FPTruncInst>(i); Expr::Width resultType = Expr::getWidthForLLVMType(fi->getType()); @@ -2116,7 +2124,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { break; default: - terminateStateOnExecError(state, "invalid instruction"); + terminateStateOnExecError(state, "illegal instruction"); break; } } |