[libc] Add hardware implementations of ceil and ceilf for aarch64.

This change also introduces a new source layout for adding machine
specific and generic implementations. To keep the scope of this change
small, this new pattern is only applied for ceil, ceilf and ceill.
Follow up changes will switch all math functions in to the new pattern.

Reviewed By: lntue

Differential Revision: https://reviews.llvm.org/D95850
This commit is contained in:
Siva Chandra 2021-02-01 23:43:05 -08:00
parent 5b7619c90b
commit 2668714747
10 changed files with 183 additions and 36 deletions

View File

@ -1,3 +1,41 @@
add_subdirectory(generic)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_MACHINE})
add_subdirectory(${LIBC_TARGET_MACHINE})
endif()
function(add_math_entrypoint_object name)
# We prefer machine specific implementation if available. Hence we check
# that first and retrun early if we are able to add an alias target for the
# machine specific implementation.
get_fq_target_name("${LIBC_TARGET_MACHINE}.${name}" fq_machine_specific_target_name)
if(TARGET ${fq_machine_specific_target_name})
add_entrypoint_object(
${name}
ALIAS
DEPENDS
.${LIBC_TARGET_MACHINE}.${name}
)
return()
endif()
get_fq_target_name("generic.${name}" fq_generic_target_name)
if(TARGET ${fq_generic_target_name})
add_entrypoint_object(
${name}
ALIAS
DEPENDS
.generic.${name}
)
return()
endif()
message(FATAL_ERROR "No machine specific or generic implementation found for ${name}.")
endfunction()
add_math_entrypoint_object(ceil)
add_math_entrypoint_object(ceilf)
add_math_entrypoint_object(ceill)
add_object_library(
math_utils
SRCS
@ -128,42 +166,6 @@ add_entrypoint_object(
-O2
)
add_entrypoint_object(
ceil
SRCS
ceil.cpp
HDRS
ceil.h
DEPENDS
libc.utils.FPUtil.fputil
COMPILE_OPTIONS
-O2
)
add_entrypoint_object(
ceilf
SRCS
ceilf.cpp
HDRS
ceilf.h
DEPENDS
libc.utils.FPUtil.fputil
COMPILE_OPTIONS
-O2
)
add_entrypoint_object(
ceill
SRCS
ceill.cpp
HDRS
ceill.h
DEPENDS
libc.utils.FPUtil.fputil
COMPILE_OPTIONS
-O2
)
add_entrypoint_object(
floor
SRCS

View File

@ -0,0 +1,19 @@
add_entrypoint_object(
ceil
SRCS
ceil.cpp
HDRS
../ceil.h
COMPILE_OPTIONS
-O2
)
add_entrypoint_object(
ceilf
SRCS
ceilf.cpp
HDRS
../ceilf.h
COMPILE_OPTIONS
-O2
)

View File

@ -0,0 +1,25 @@
//===-- Implementation of the ceil function for aarch64 -------------------===//
//
// 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/ceil.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(double, ceil, (double x)) {
double y;
__asm__ __volatile__("ldr d0, %1\n"
"frintp d0, d0\n"
"str d0, %0\n"
: "=m"(y)
: "m"(x)
: "d0");
return y;
}
} // namespace __llvm_libc

View File

@ -0,0 +1,25 @@
//===-- Implementation of the ceilf function for aarch64 ------------------===//
//
// 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/ceilf.h"
#include "src/__support/common.h"
namespace __llvm_libc {
LLVM_LIBC_FUNCTION(float, ceilf, (float x)) {
float y;
__asm__ __volatile__("ldr s0, %1\n"
"frintp s0, s0\n"
"str s0, %0\n"
: "=m"(y)
: "m"(x)
: "s0");
return y;
}
} // namespace __llvm_libc

View File

@ -0,0 +1,35 @@
add_entrypoint_object(
ceil
SRCS
ceil.cpp
HDRS
../ceil.h
DEPENDS
libc.utils.FPUtil.fputil
COMPILE_OPTIONS
-O2
)
add_entrypoint_object(
ceilf
SRCS
ceilf.cpp
HDRS
../ceilf.h
DEPENDS
libc.utils.FPUtil.fputil
COMPILE_OPTIONS
-O2
)
add_entrypoint_object(
ceill
SRCS
ceill.cpp
HDRS
../ceill.h
DEPENDS
libc.utils.FPUtil.fputil
COMPILE_OPTIONS
-O2
)

View File

@ -1070,3 +1070,5 @@ add_fp_unittest(
libc.src.math.fmaf
libc.utils.FPUtil.fputil
)
add_subdirectory(generic)

View File

@ -0,0 +1,39 @@
add_fp_unittest(
ceil_test
NEED_MPFR
SUITE
libc_math_unittests
SRCS
../ceil_test.cpp
DEPENDS
libc.include.math
libc.src.math.generic.ceil
libc.utils.FPUtil.fputil
)
add_fp_unittest(
ceilf_test
NEED_MPFR
SUITE
libc_math_unittests
SRCS
../ceilf_test.cpp
DEPENDS
libc.include.math
libc.src.math.generic.ceilf
libc.utils.FPUtil.fputil
)
add_fp_unittest(
ceill_test
NEED_MPFR
SUITE
libc_math_unittests
SRCS
../ceill_test.cpp
DEPENDS
libc.include.math
libc.src.math.generic.ceill
libc.utils.FPUtil.fputil
)