summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorGuo Yejun <yejun.guo@intel.com>2016-02-29 08:08:06 +0800
committerYang Rong <rong.r.yang@intel.com>2016-03-17 16:00:26 +0800
commit27a95c6678e3e6426ad1bc7927d92f1488fe884c (patch)
tree49a70270e09a920e2b7fa3618074bc5ac1bbced9 /backend
parent4e7d5a0c7a269b2c0b70e37e4e7fcb254065c042 (diff)
downloadbeignet-27a95c6678e3e6426ad1bc7927d92f1488fe884c.tar.gz
enable FP_CONTRACT on as default, and implemented with MAD
According to OpenCL spec, FP_CONTRACT is on as default, while LLVM/clang just enabled it at http://reviews.llvm.org/D14200 at Nov 2015. So we still need set this option explicitly now. The implementation is hardware MAD instruction whose accuracy is enough for FP_CONTRACT. Passed test: contractions of conformance test Signed-off-by: Guo Yejun <yejun.guo@intel.com> Reviewed-by: Ruiling Song <ruiling.song@intel.com>
Diffstat (limited to 'backend')
-rw-r--r--backend/src/backend/program.cpp2
-rw-r--r--backend/src/llvm/llvm_gen_backend.cpp12
-rw-r--r--backend/src/llvm/llvm_scalarize.cpp1
3 files changed, 3 insertions, 12 deletions
diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
index 2c233ea5..5eee4cbd 100644
--- a/backend/src/backend/program.cpp
+++ b/backend/src/backend/program.cpp
@@ -630,7 +630,7 @@ namespace gbe {
args.push_back("spir");
#endif /* LLVM_VERSION_MINOR <= 2 */
args.push_back("stringInput.cl");
- args.push_back("-ffp-contract=off");
+ args.push_back("-ffp-contract=on");
if(OCL_DEBUGINFO) args.push_back("-g");
// The compiler invocation needs a DiagnosticsEngine so it can report problems
diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
index bbbd5378..f43f8702 100644
--- a/backend/src/llvm/llvm_gen_backend.cpp
+++ b/backend/src/llvm/llvm_gen_backend.cpp
@@ -3926,17 +3926,6 @@ namespace gbe
}
break;
#if LLVM_VERSION_MINOR >= 2
- case Intrinsic::fmuladd:
- {
- const ir::Register tmp = ctx.reg(ir::FAMILY_DWORD);
- const ir::Register dst = this->getRegister(&I);
- const ir::Register src0 = this->getRegister(I.getOperand(0));
- const ir::Register src1 = this->getRegister(I.getOperand(1));
- const ir::Register src2 = this->getRegister(I.getOperand(2));
- ctx.MUL(ir::TYPE_FLOAT, tmp, src0, src1);
- ctx.ADD(ir::TYPE_FLOAT, dst, tmp, src2);
- }
- break;
case Intrinsic::lifetime_start:
case Intrinsic::lifetime_end:
break;
@@ -4023,6 +4012,7 @@ namespace gbe
}
break;
case Intrinsic::fma:
+ case Intrinsic::fmuladd:
{
ir::Type srcType = getType(ctx, I.getType());
const ir::Register dst = this->getRegister(&I);
diff --git a/backend/src/llvm/llvm_scalarize.cpp b/backend/src/llvm/llvm_scalarize.cpp
index 9efb8975..414bbac9 100644
--- a/backend/src/llvm/llvm_scalarize.cpp
+++ b/backend/src/llvm/llvm_scalarize.cpp
@@ -269,6 +269,7 @@ namespace gbe {
case Intrinsic::sqrt:
case Intrinsic::ceil:
case Intrinsic::trunc:
+ case Intrinsic::fmuladd:
return true;
}
}