From a58b2827feceaa27193318a12e3a06893eabdcb6 Mon Sep 17 00:00:00 2001 From: Siva Chandra Reddy Date: Mon, 14 Jun 2021 21:24:57 +0000 Subject: [PATCH] [libc] Add hardware implementations of x86_64 sqrt functions. --- libc/src/math/x86_64/CMakeLists.txt | 30 ++++++++++++++++++++++++++++++ libc/src/math/x86_64/sqrt.cpp | 20 ++++++++++++++++++++ libc/src/math/x86_64/sqrtf.cpp | 20 ++++++++++++++++++++ libc/src/math/x86_64/sqrtl.cpp | 20 ++++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 libc/src/math/x86_64/sqrt.cpp create mode 100644 libc/src/math/x86_64/sqrtf.cpp create mode 100644 libc/src/math/x86_64/sqrtl.cpp diff --git a/libc/src/math/x86_64/CMakeLists.txt b/libc/src/math/x86_64/CMakeLists.txt index cd129e3..d2a4823 100644 --- a/libc/src/math/x86_64/CMakeLists.txt +++ b/libc/src/math/x86_64/CMakeLists.txt @@ -27,3 +27,33 @@ add_entrypoint_object( COMPILE_OPTIONS -O2 ) + +add_entrypoint_object( + sqrt + SRCS + sqrt.cpp + HDRS + ../sqrt.h + COMPILE_OPTIONS + -O2 +) + +add_entrypoint_object( + sqrtf + SRCS + sqrtf.cpp + HDRS + ../sqrtf.h + COMPILE_OPTIONS + -O2 +) + +add_entrypoint_object( + sqrtl + SRCS + sqrtl.cpp + HDRS + ../sqrtl.h + COMPILE_OPTIONS + -O2 +) diff --git a/libc/src/math/x86_64/sqrt.cpp b/libc/src/math/x86_64/sqrt.cpp new file mode 100644 index 0000000..5d4e942 --- /dev/null +++ b/libc/src/math/x86_64/sqrt.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of the sqrt function for x86_64 --------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/math/sqrt.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(double, sqrt, (double x)) { + double result; + __asm__ __volatile__("sqrtsd %x1, %x0" : "=x"(result) : "x"(x)); + return result; +} + +} // namespace __llvm_libc diff --git a/libc/src/math/x86_64/sqrtf.cpp b/libc/src/math/x86_64/sqrtf.cpp new file mode 100644 index 0000000..51d22df --- /dev/null +++ b/libc/src/math/x86_64/sqrtf.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of the sqrtf function for x86_64 -------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/math/sqrtf.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(float, sqrtf, (float x)) { + float result; + __asm__ __volatile__("sqrtss %x1, %x0" : "=x"(result) : "x"(x)); + return result; +} + +} // namespace __llvm_libc diff --git a/libc/src/math/x86_64/sqrtl.cpp b/libc/src/math/x86_64/sqrtl.cpp new file mode 100644 index 0000000..8b0c39e --- /dev/null +++ b/libc/src/math/x86_64/sqrtl.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of the sqrtl function for x86_64 -------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/math/sqrtl.h" +#include "src/__support/common.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(long double, sqrtl, (long double x)) { + long double result; + __asm__ __volatile__("fsqrt" : "=t"(result) : "t"(x)); + return result; +} + +} // namespace __llvm_libc -- 2.7.4