mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 19:56:06 +00:00

GCC provides these functions (e.g. __addtf3, etc.) in libgcc on x86_64. Since Clang supports float128, we can also enable the existing code by using float128 for fp_t if either __FLOAT128__ or __SIZEOF_FLOAT128__ is defined instead of only supporting these builtins for platforms with 128-bit IEEE long doubles. This commit defines a new tf_float typedef that matches a float with attribute((mode(TF)) on each given architecture. There are more tests that could be enabled for x86, but to keep the diff smaller, I restricted test changes to ones that started failing as part of this refactoring. This change has been tested on x86 (natively) and aarch64,powerpc64,riscv64 and sparc64 via qemu-user. This supersedes https://reviews.llvm.org/D98261 and should also cover the changes from https://github.com/llvm/llvm-project/pull/68041.
35 lines
840 B
C
35 lines
840 B
C
//===-- powitf2.cpp - Implement __powitf2 ---------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements __powitf2 for the compiler_rt library.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#define QUAD_PRECISION
|
|
#include "fp_lib.h"
|
|
|
|
#if defined(CRT_HAS_TF_MODE)
|
|
|
|
// Returns: a ^ b
|
|
|
|
COMPILER_RT_ABI fp_t __powitf2(fp_t a, int b) {
|
|
const int recip = b < 0;
|
|
fp_t r = 1;
|
|
while (1) {
|
|
if (b & 1)
|
|
r *= a;
|
|
b /= 2;
|
|
if (b == 0)
|
|
break;
|
|
a *= a;
|
|
}
|
|
return recip ? 1 / r : r;
|
|
}
|
|
|
|
#endif
|