[PATCH] msvcr120/tests: Add tests for _statusfp[2].

Piotr Caban piotr.caban at gmail.com
Fri Feb 5 08:44:25 CST 2021


Hi Daniel,

On 2/4/21 8:17 AM, Daniel Lehman wrote:
> -static void test_feenv(void)
> +static DISABLE_OPT void test_feenv(void)
>   {
> +    static const struct {
> +        double num, denom;
> +        int flag;
> +    } tests[] = {
> +        { 1.0,     10.0,    FE_INEXACT },
> +        { DBL_MIN, DBL_MAX, FE_UNDERFLOW },
> +        { DBL_MAX, DBL_MIN, FE_OVERFLOW },
> +        { 1.0,     0.0,     FE_DIVBYZERO },
> +        { 0.0,     0.0,     FE_INVALID },
> +    };
> +    unsigned int x86f, sse2f;
>       fenv_t env, env2;
> -    int ret;
> +    int i, ret, flags;
> +    double res;
>   
>       p__clearfp();
>   
> @@ -806,6 +831,40 @@ static void test_feenv(void)
>       ok(!ret, "fesetenv returned %x\n", ret);
>       ret = p_fegetround();
>       ok(ret == FE_TONEAREST, "Got unexpected round mode %#x.\n", ret);
> +
> +    if(p__statusfp2) {
> +        x86f = sse2f = 0;
> +        p__statusfp2(NULL, NULL);
> +
> +        p__statusfp2(&x86f, NULL);
> +        p__statusfp2(NULL, &sse2f);
> +
> +        ok(!x86f, "p__statusfp2 set x86 %x\n", x86f);
> +        ok(!sse2f, "p__statusfp2 set sse2 %x\n", sse2f);
> +    }
> +
> +    flags = 0;
> +    for(i=0; i<ARRAY_SIZE(tests); i++) {
> +        res = tests[i].num / tests[i].denom;
This doesn't look reliable. I guess you will need to go with some kind 
of assembly function to do the computation (or set status word 
directly). I'm not sure if it's worth it.

Thanks,
Piotr



More information about the wine-devel mailing list