https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1ad4106b84adb448bd95e…
commit 1ad4106b84adb448bd95eeb651d8c3dad486e5c4
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Sat Jun 18 10:19:18 2022 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)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(a)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;
+}