https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1ad4106b84adb448bd95ee...
commit 1ad4106b84adb448bd95eeb651d8c3dad486e5c4 Author: Timo Kreuzer timo.kreuzer@reactos.org AuthorDate: Sat Jun 18 10:19:18 2022 +0200 Commit: Timo Kreuzer timo.kreuzer@reactos.org CommitDate: Thu Dec 1 15:21:59 2022 +0200
[CRT] Add basic version of handle_error --- sdk/lib/crt/math/libm_sse2/_handle_error.c | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+)
diff --git a/sdk/lib/crt/math/libm_sse2/_handle_error.c b/sdk/lib/crt/math/libm_sse2/_handle_error.c new file mode 100644 index 00000000000..4d679a292ea --- /dev/null +++ b/sdk/lib/crt/math/libm_sse2/_handle_error.c @@ -0,0 +1,72 @@ +/* + * PROJECT: ReactOS CRT library + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of _handle_error / _handle_errorf for libm + * COPYRIGHT: Copyright 2022 Timo Kreuzer timo.kreuzer@reactos.org + */ + +#include <math.h> + +int +__cdecl +_invoke_matherr( + int type, + char* name, + double arg1, + double arg2, + double retval); + +/*! + * @brief Handles an error condition. + * @param fname - The name of the function that caused the error. + * @param opcode - Opcode of the function that cause the error (see OP_* consants in fpieee.h). + * @param value - The value to be returned, encoded as uint64_t. + * @param type - The type of error (see _DOMAIN, ... in math.h) + * @param flags - Exception flags (see AMD_F_* constants). + * @param error - Specifies the CRT error code (EDOM, ...). + * @param arg1 - First parameter to the function that cause the error. + * @param arg2 - Second parameter to the function that cause the error. + * @param nargs - Number of parameters to the function that cause the error. + * @return The value to be returned. + */ +double +__cdecl +_handle_error( + char *fname, + int opcode, + unsigned long long value, + int type, + int flags, + int error, + double arg1, + double arg2, + int nargs) +{ + float retval = *(double*)&value; + + _invoke_matherr(type, fname, arg1, arg2, retval); + + return retval; +} + + + +float +__cdecl +_handle_errorf( + char *fname, + int opcode, + unsigned long long value, + int type, + int flags, + int error, + float arg1, + float arg2, + int nargs) +{ + float retval = *(float*)&value; + + _invoke_matherr(type, fname, arg1, arg2, retval); + + return retval; +}