diff options
author | Guo Yejun <yejun.guo@intel.com> | 2016-02-29 08:08:06 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2016-03-17 16:00:26 +0800 |
commit | 27a95c6678e3e6426ad1bc7927d92f1488fe884c (patch) | |
tree | 49a70270e09a920e2b7fa3618074bc5ac1bbced9 /backend | |
parent | 4e7d5a0c7a269b2c0b70e37e4e7fcb254065c042 (diff) | |
download | beignet-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.cpp | 2 | ||||
-rw-r--r-- | backend/src/llvm/llvm_gen_backend.cpp | 12 | ||||
-rw-r--r-- | backend/src/llvm/llvm_scalarize.cpp | 1 |
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; } } |