From: Daniel Lehman dlehman25@gmail.com
--- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/ucrtbase/tests/misc.c | 57 +++++++++++++++++++++++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- include/msvcrt/complex.h | 1 + libs/musl/Makefile.in | 1 + libs/musl/src/complex/cargf.c | 6 +++ 7 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 libs/musl/src/complex/cargf.c
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 438256b72a2..42494e4e39f 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2048,7 +2048,7 @@ @ stub cacosl @ cdecl calloc(long long) @ cdecl carg(int128) -@ stub cargf +@ cdecl cargf(int64) @ stub cargl @ stub casin @ stub casinf diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index a156ff84678..a784be7c361 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1715,7 +1715,7 @@ @ stub cacosl @ cdecl calloc(long long) msvcr120.calloc @ cdecl carg(int128) msvcr120.carg -@ stub cargf +@ cdecl cargf(int64) msvcr120.cargf @ stub cargl @ stub casin @ stub casinf diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c index 351de952c86..b1de04c3a9d 100644 --- a/dlls/ucrtbase/tests/misc.c +++ b/dlls/ucrtbase/tests/misc.c @@ -2056,6 +2056,62 @@ static void test_carg(void) __setusermatherr(NULL); }
+static void test_cargf(void) +{ + const double M_PI_3_4 = M_PI_2 + M_PI_4; + static const struct { + float r, i, expect; + } tests[] = { + { NAN, NAN, NAN }, + { INFINITY, 2.0f, 0.0 }, + { INFINITY, -2.0f, -0.0 }, + { 10.0f, INFINITY, M_PI_2 }, + { 10.0f, -INFINITY, -M_PI_2 }, + { -INFINITY, 10.0f, M_PI }, + { -INFINITY, -10.0f, -M_PI }, + { INFINITY, -INFINITY, -M_PI_4 }, + { -INFINITY, INFINITY, M_PI_3_4 }, + { INFINITY, INFINITY, M_PI_4 }, + { -INFINITY, -INFINITY, -M_PI_3_4 }, + { 2.0f, 0.0f, 0.0 }, + { 2.0f, -0.0f, -0.0 }, + { 0.0f, 0.0f, 0.0 }, + { 0.0f, -0.0f, -0.0 }, + { -2.0f, 0.0f, M_PI }, + { -2.0f, -0.0f, -M_PI }, + { -0.0f, 0.0f, M_PI }, + { -0.0f, -0.0f, -M_PI }, + { 0.0f, 2.0f, M_PI_2 }, + { -0.0f, 2.0f, M_PI_2 }, + { 0.0f, -2.0f, -M_PI_2 }, + { -0.0f, -2.0f, -M_PI_2 }, + }; + _Fcomplex c; + errno_t e; + float z; + int i; + + __setusermatherr(matherr_callback); + + for(i=0; i<ARRAY_SIZE(tests); i++) { + c = _FCbuild(tests[i].r, tests[i].i); + errno = -1; + exception.type = -1; + z = cargf(c); + e = errno; + + ok(compare_float(z, tests[i].expect, 0), + "expected %0.7e, got %0.7e for %d\n", tests[i].expect, z, i); + ok(signbit(z) == signbit(tests[i].expect), "expected sign %x, got %x for %d\n", + signbit(tests[i].expect), signbit(z), i); + + ok(e == -1, "expected errno -1, but got %d for %d\n", e, i); + ok(exception.type == -1, "expected -1, got %d for %d\n", exception.type, i); + } + + __setusermatherr(NULL); +} + START_TEST(misc) { int arg_c; @@ -2107,4 +2163,5 @@ START_TEST(misc) test_expf(); test_cexp(); test_carg(); + test_cargf(); } diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 6c323e90313..f2e5102b616 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -2193,7 +2193,7 @@ @ stub cacosl @ cdecl calloc(long long) @ cdecl carg(int128) -@ stub cargf +@ cdecl cargf(int64) @ stub cargl @ stub casin @ stub casinf diff --git a/include/msvcrt/complex.h b/include/msvcrt/complex.h index a179bb2ebee..3d27f4429cb 100644 --- a/include/msvcrt/complex.h +++ b/include/msvcrt/complex.h @@ -51,6 +51,7 @@ static inline _Fcomplex __cdecl __wine__FCbuild(float r, float i) _ACRTIMP _Fcomplex __cdecl _FCbuild(float, float); #endif
+_ACRTIMP float __cdecl cargf(_Fcomplex); _ACRTIMP float __cdecl cimagf(_Fcomplex); _ACRTIMP float __cdecl crealf(_Fcomplex);
diff --git a/libs/musl/Makefile.in b/libs/musl/Makefile.in index 0b4f8fad5a4..16b0f1bf857 100644 --- a/libs/musl/Makefile.in +++ b/libs/musl/Makefile.in @@ -6,6 +6,7 @@ EXTRADEFS = -D_ACRTIMP= -D_NO_CRT_MATH_INLINE \ SOURCES = \ src/complex/__cexp.c \ src/complex/carg.c \ + src/complex/cargf.c \ src/complex/cexp.c \ src/math/__cos.c \ src/math/__cosdf.c \ diff --git a/libs/musl/src/complex/cargf.c b/libs/musl/src/complex/cargf.c new file mode 100644 index 00000000000..947da753073 --- /dev/null +++ b/libs/musl/src/complex/cargf.c @@ -0,0 +1,6 @@ +#include "complex_impl.h" + +float cargf(_Fcomplex z) +{ + return atan2f(cimagf(z), crealf(z)); +}
This merge request was approved by Piotr Caban.