Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions core/libs/prx/libc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -729,3 +729,16 @@ if(MINGW)
PASS_REGULAR_EXPRESSION "aborting[^~]*SIGABRT. on thread[^~]*stack return address candidates:[^~]*rsp[+]0x")
endif()
endif()

if(BUILD_TESTING)
add_test_executable(guest_tgammaf_tests ${LIBS_INCLUDE_DIR}/tests/GuestTgammaf.cpp)
target_include_directories(guest_tgammaf_tests PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(guest_tgammaf_tests PRIVATE libc)
configure_windows_unwind(guest_tgammaf_tests)
add_test(NAME guest_tgammaf COMMAND guest_tgammaf_tests)
set_tests_properties(guest_tgammaf PROPERTIES TIMEOUT 30)
if(WIN32)
set_tests_properties(guest_tgammaf PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libc>")
endif()
endif()
2 changes: 2 additions & 0 deletions core/libs/prx/libc/src/Math.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,8 @@ long double AsinDenominator(long double t) {
}

extern "C" {
float APS5_VABI tgammaf_nid_postfix(float x) { return std::tgamma(x); }


std::lldiv_t APS5_VABI lldiv_nid_postfix(long long numerator, long long denominator) {
return std::lldiv(numerator, denominator);
Expand Down
32 changes: 32 additions & 0 deletions core/libs/tests/GuestTgammaf.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include "prx/libc/include/general/VabiMacros.hpp"
#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <limits>
extern "C" float APS5_VABI tgammaf_nid_postfix(float);
extern "C" int* APS5_VABI __error_nid_postfix();
static void Require(bool value) {
if (!value) std::abort();
}
int main() {
float (APS5_VABI *volatile call)(float) = tgammaf_nid_postfix;
Require(call(1.0f) == 1.0f && call(5.0f) == 24.0f);
const auto half = call(0.5f);
Require(std::abs(half - std::sqrt(std::acos(-1.0f))) < 0.000002f);
Require(std::isnan(call(std::numeric_limits<float>::quiet_NaN())));
Require(std::isinf(call(std::numeric_limits<float>::infinity())));
std::feclearexcept(FE_ALL_EXCEPT);
*__error_nid_postfix() = 0;
Require(std::isinf(call(0.0f)));
Require(std::fetestexcept(FE_DIVBYZERO));
if (math_errhandling & MATH_ERRNO) Require(*__error_nid_postfix() == ERANGE);
std::feclearexcept(FE_ALL_EXCEPT);
*__error_nid_postfix() = 0;
Require(std::isnan(call(-1.0f)));
Require(std::fetestexcept(FE_INVALID));
if (math_errhandling & MATH_ERRNO) Require(*__error_nid_postfix() == EDOM);
Require(std::signbit(call(-0.5f)));
std::puts("tgammaf: values, signs, NaN, infinity, poles, errno and SysV ABI passed");
}
Loading