Skip to content
Merged
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
10 changes: 10 additions & 0 deletions core/libs/prx/libSceLibcInternal/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -95,4 +95,14 @@ if(BUILD_TESTING)
set_tests_properties(guest_force_tls_destructor PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
endif()
add_test_executable(guest_fminf_tests ${LIBS_INCLUDE_DIR}/tests/GuestFminf.cpp)
target_include_directories(guest_fminf_tests PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(guest_fminf_tests PRIVATE libSceLibcInternal libc)
configure_windows_unwind(guest_fminf_tests)
add_test(NAME guest_fminf COMMAND guest_fminf_tests)
set_tests_properties(guest_fminf PROPERTIES TIMEOUT 20)
if(WIN32)
set_tests_properties(guest_fminf PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
endif()
endif()
4 changes: 4 additions & 0 deletions core/libs/prx/libSceLibcInternal/Export.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <sstream>
#include <stdexcept>
#include <vector>
#include <cmath>
#ifdef _WIN32
#include <windows.h>
#else
Expand Down Expand Up @@ -141,4 +142,7 @@ unsigned int APS5_VABI alarm_nid_postfix(unsigned int seconds) {
return GuestAlarm_nid_no_patch(seconds);
}

float APS5_VABI fminf_nid_postfix(float x, float y) {
return std::fmin(x, y);
}
}
46 changes: 46 additions & 0 deletions core/libs/tests/GuestFminf.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include "prx/libc/include/general/VabiMacros.hpp"
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <limits>

extern "C" {
float APS5_VABI fminf_nid_postfix(float, float);
}

static void Check(bool condition, int line) {
if (!condition) {
std::fprintf(stderr, "fminf check failed at line %d\n", line);
std::abort();
}
}
#define Require(value) Check((value), __LINE__)

int main() {
const auto nan = std::numeric_limits<float>::quiet_NaN();
const auto infinity = std::numeric_limits<float>::infinity();

Require(fminf_nid_postfix(3.0f, -2.0f) == -2.0f);
Require(fminf_nid_postfix(-2.0f, 3.0f) == -2.0f);
Require(fminf_nid_postfix(1.5f, 2.5f) == 1.5f);

Require(fminf_nid_postfix(nan, 4.0f) == 4.0f);
Require(fminf_nid_postfix(4.0f, nan) == 4.0f);
Require(std::isnan(fminf_nid_postfix(nan, nan)));

const auto minNegZero = fminf_nid_postfix(-0.0f, +0.0f);
const auto minPosZero = fminf_nid_postfix(+0.0f, -0.0f);
Require(minNegZero == 0.0f && std::signbit(minNegZero));
Require(minPosZero == 0.0f && std::signbit(minPosZero));
Require(std::signbit(fminf_nid_postfix(-0.0f, -0.0f)));
Require(!std::signbit(fminf_nid_postfix(+0.0f, +0.0f)));

Require(fminf_nid_postfix(infinity, -infinity) == -infinity);
Require(fminf_nid_postfix(-infinity, infinity) == -infinity);
Require(fminf_nid_postfix(infinity, 5.0f) == 5.0f);
Require(fminf_nid_postfix(5.0f, infinity) == 5.0f);
Require(fminf_nid_postfix(-infinity, 5.0f) == -infinity);
Require(fminf_nid_postfix(5.0f, -infinity) == -infinity);

return 0;
}
Loading