ARM: Implement sqrt in inline assembly.
Call VSQRT directly to avoid the tiniest (1ulp) precision error that occurs in the system-supplied sqrt on QNX/ARM. All precision tests in SunSpider are now passing on this platform. BUG= R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/98363010 Patch from Cosmin Truta <ctruta@gmail.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18506 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
902a05922b
commit
bb041d65ee
@ -347,13 +347,33 @@ OS::MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef __
|
|
||||||
|
|
||||||
|
|
||||||
UnaryMathFunction CreateSqrtFunction() {
|
UnaryMathFunction CreateSqrtFunction() {
|
||||||
return &sqrt;
|
#if defined(USE_SIMULATOR)
|
||||||
|
return &std::sqrt;
|
||||||
|
#else
|
||||||
|
size_t actual_size;
|
||||||
|
byte* buffer = static_cast<byte*>(OS::Allocate(1 * KB, &actual_size, true));
|
||||||
|
if (buffer == NULL) return &std::sqrt;
|
||||||
|
|
||||||
|
MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size));
|
||||||
|
|
||||||
|
__ GetCFunctionDoubleResult(d0);
|
||||||
|
__ vsqrt(d0, d0);
|
||||||
|
__ SetCallCDoubleArguments(d0);
|
||||||
|
__ Ret();
|
||||||
|
|
||||||
|
CodeDesc desc;
|
||||||
|
masm.GetCode(&desc);
|
||||||
|
ASSERT(!RelocInfo::RequiresRelocation(desc));
|
||||||
|
|
||||||
|
CPU::FlushICache(buffer, actual_size);
|
||||||
|
OS::ProtectCode(buffer, actual_size);
|
||||||
|
return FUNCTION_CAST<UnaryMathFunction>(buffer);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef __
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Platform-specific RuntimeCallHelper functions.
|
// Platform-specific RuntimeCallHelper functions.
|
||||||
|
Loading…
Reference in New Issue
Block a user