From: Stéphane Bacri frisou76@yahoo.fr
--- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120/tests/msvcr120.c | 46 +++++++++++++++++++++++++++++ dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcrt/math.c | 25 ++++++++++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 5 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index c5950385b4e..b7795e6353d 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -830,7 +830,7 @@ @ stdcall _CxxThrowException(ptr ptr) @ cdecl -arch=i386 -norelay _EH_prolog() @ stub -arch=arm _FPE_Raise -@ stub _FCbuild +@ cdecl -norelay _FCbuild(float float) @ cdecl _FindAndUnlinkFrame(ptr) @ stub -arch=win64 _GetImageBase @ stub -arch=win64 _GetThrowImageBase diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 53cd0431cc5..0ff8adf4453 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -155,6 +155,12 @@ typedef struct double i; } _Dcomplex;
+typedef struct +{ + float r; + float i; +} _Fcomplex; + typedef void (*vtable_ptr)(void);
typedef struct { @@ -222,6 +228,7 @@ static void (__cdecl *p_free_locale)(_locale_t); static unsigned short (__cdecl *p_wctype)(const char*); static int (__cdecl *p_vsscanf)(const char*, const char *, va_list valist); static _Dcomplex (__cdecl *p__Cbuild)(double, double); +static _Fcomplex (__cdecl *p__FCbuild)(float, float); static double (__cdecl *p_creal)(_Dcomplex); static double (__cdecl *p_cimag)(_Dcomplex); static double (__cdecl *p_nexttoward)(double, double); @@ -277,6 +284,19 @@ static _Cancellation_beacon* (__thiscall *p__Cancellation_beacon_ctor)(_Cancella static void (__thiscall *p__Cancellation_beacon_dtor)(_Cancellation_beacon*); static MSVCRT_bool (__thiscall *p__Cancellation_beacon__Confirm_cancel)(_Cancellation_beacon*);
+#ifdef __i386__ +static ULONGLONG (__cdecl *p_i386_FCbuild)(float, float); +static _Fcomplex __cdecl i386_FCbuild(float r, float i) +{ + union { + _Fcomplex c; + ULONGLONG ull; + } ret; + ret.ull = p_i386_FCbuild(r, i); + return ret.c; +} +#endif + #define SETNOFAIL(x,y) x = (void*)GetProcAddress(module,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0)
@@ -335,6 +355,7 @@ static BOOL init(void) SET(p__Cbuild, "_Cbuild"); SET(p_creal, "creal"); SET(p_cimag, "cimag"); + SET(p__FCbuild, "_FCbuild"); SET(p_nexttoward, "nexttoward"); SET(p_nexttowardf, "nexttowardf"); SET(p_nexttowardl, "nexttowardl"); @@ -499,6 +520,12 @@ static BOOL init(void) "?CurrentContext@Context@Concurrency@@SAPAV12@XZ"); }
+#ifdef __i386__ + SET(p_i386_FCbuild, + "_FCbuild"); + p__FCbuild = i386_FCbuild; +#endif + init_thiscall_thunk(); return TRUE; } @@ -1320,6 +1347,24 @@ static void test__Cbuild(void) ok(d == 4.0, "cimag returned %lf\n", d); }
+static void test__FCbuild(void) +{ + _Fcomplex c; + float d; + + c = p__FCbuild(1.0f, 2.0f); + ok(c.r == 1.0f, "c.r = %lf\n", c.r); + ok(c.i == 2.0f, "c.i = %lf\n", c.i); + + c = p__FCbuild(3.0f, NAN); + ok(c.r == 3.0f, "c.r = %lf\n", c.r); + ok(_isnan(c.i), "c.i = %lf\n", c.i); + + c = p__FCbuild(NAN, 4.0f); + ok(_isnan(c.r), "c.r = %lf\n", c.r); + ok(c.i == 4.0f, "c.i = %lf\n", c.i); +} + static void test_nexttoward(void) { errno_t e; @@ -1913,6 +1958,7 @@ START_TEST(msvcr120) test__Condition_variable(); test_wctype(); test_vsscanf(); + test__FCbuild(); test__Cbuild(); test_nexttoward(); test_towctrans(); diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 7f44909650f..7bf8e8a4bce 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -825,7 +825,7 @@ @ stdcall _CxxThrowException(ptr ptr) msvcr120._CxxThrowException @ cdecl -arch=i386 -norelay _EH_prolog() msvcr120._EH_prolog @ stub -arch=arm _FPE_Raise -@ stub _FCbuild +@ cdecl -norelay _FCbuild(float float) msvcr120._FCbuild @ cdecl _FindAndUnlinkFrame(ptr) msvcr120._FindAndUnlinkFrame @ stub -arch=win64 _GetImageBase @ stub -arch=win64 _GetThrowImageBase diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 7e1128e93ea..d8f3bb324e4 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -2976,4 +2976,29 @@ double CDECL cimag(_Dcomplex z) return z._Val[1]; }
+#ifndef __i386__ +_Fcomplex CDECL _FCbuild(float r, float i) +{ + _Fcomplex ret; + ret._Val[0] = r; + ret._Val[1] = i; + return ret; +} +#else +ULONGLONG CDECL _FCbuild(float r, float i) +{ + union + { + _Fcomplex c; + ULONGLONG ull; + } ret; + + C_ASSERT(sizeof(_Fcomplex) == sizeof(ULONGLONG)); + + ret.c._Val[0] = r; + ret.c._Val[1] = i; + return ret.ull; +} +#endif + #endif /* _MSVCR_VER>=120 */ diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 98a3177a3cc..8c06f8d75ff 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -21,7 +21,7 @@ @ stdcall _CxxThrowException(ptr ptr) @ cdecl -arch=i386 -norelay _EH_prolog() @ cdecl _Exit(long) _exit -@ stub _FCbuild +@ cdecl -norelay _FCbuild(float float) @ stub _FCmulcc @ stub _FCmulcr @ cdecl _FindAndUnlinkFrame(ptr)