brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · e104477 Raw
55 lines · c
1//===-- Square root of IEEE 754 floating point numbers ----------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_SQRT_H10#define LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_SQRT_H11 12#include "src/__support/common.h"13#include "src/__support/macros/config.h"14#include "src/__support/macros/properties/architectures.h"15#include "src/__support/macros/properties/cpu_features.h"16 17#if !(defined(LIBC_TARGET_ARCH_IS_X86_64) && defined(LIBC_TARGET_CPU_HAS_SSE2))18#error "sqrtss / sqrtsd need SSE2"19#endif20 21#include "src/__support/FPUtil/generic/sqrt.h"22 23namespace LIBC_NAMESPACE_DECL {24namespace fputil {25 26template <> LIBC_INLINE float sqrt<float>(float x) {27  float result;28  __asm__ __volatile__("sqrtss %x1, %x0" : "=x"(result) : "x"(x));29  return result;30}31 32template <> LIBC_INLINE double sqrt<double>(double x) {33  double result;34  __asm__ __volatile__("sqrtsd %x1, %x0" : "=x"(result) : "x"(x));35  return result;36}37 38#ifdef LIBC_TYPES_LONG_DOUBLE_IS_FLOAT6439template <> LIBC_INLINE long double sqrt<long double>(long double x) {40  long double result;41  __asm__ __volatile__("sqrtsd %x1, %x0" : "=x"(result) : "x"(x));42  return result;43}44#else45template <> LIBC_INLINE long double sqrt<long double>(long double x) {46  __asm__ __volatile__("fsqrt" : "+t"(x));47  return x;48}49#endif50 51} // namespace fputil52} // namespace LIBC_NAMESPACE_DECL53 54#endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_X86_64_SQRT_H55