VirtualBox

Changeset 96279 in vbox


Ignore:
Timestamp:
Aug 18, 2022 12:07:28 AM (2 years ago)
Author:
vboxsync
Message:

IPRT/nocrt: Implemented log2f and added testing of log2 and log2f. bugref:10261

Location:
trunk/src/VBox/Runtime
Files:
3 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r96271 r96279  
    19371937        common/math/log.asm \
    19381938        common/math/logf.asm \
     1939        common/math/log2.asm \
     1940        common/math/log2f.asm \
    19391941        common/math/llrint.asm \
    19401942        common/math/llrintf.asm \
     
    20082010        common/math/log.asm \
    20092011        common/math/logf.asm \
     2012        common/math/log2.asm \
     2013        common/math/log2f.asm \
    20102014        common/math/llrint.asm \
    20112015        common/math/llrintf.asm \
  • trunk/src/VBox/Runtime/common/math/log2f.asm

    r96276 r96279  
    11; $Id$
    22;; @file
    3 ; IPRT - No-CRT log2 - AMD64 & X86.
     3; IPRT - No-CRT log2f - AMD64 & X86.
    44;
    55
     
    3636
    3737;;
    38 ; Compute the log2 of rd
     38; Compute the log2f of rf
    3939; @returns st(0) / xmm0
    40 ; @param    rd      [xSP + xCB*2] / xmm0
    41 RT_NOCRT_BEGINPROC log2
     40; @param    rf      [xSP + xCB*2] / xmm0
     41RT_NOCRT_BEGINPROC log2f
    4242        push    xBP
    4343        SEH64_PUSH_xBP
     
    5252        ;
    5353%ifdef RT_ARCH_AMD64
    54         movsd   [xBP - 10h], xmm0
    55         fld     qword [xBP - 10h]
    56 %else
    57         fld     qword [xBP + xCB*2]
     54        movss   [xBP - 10h], xmm0
     55        fld     dword [xBP - 10h]
     56%else
     57        fld     dword [xBP + xCB*2]
    5858%endif
    5959
     
    118118.return_val:
    119119%ifdef RT_ARCH_AMD64
    120         fstp    qword [xBP - 10h]
    121         movsd   xmm0, [xBP - 10h]
     120        fstp    dword [xBP - 10h]
     121        movss   xmm0, [xBP - 10h]
    122122%endif
    123123.return:
     
    153153        ; Load NaN
    154154%ifdef RT_ARCH_AMD64
    155         movsd   xmm0, [.s_r64NaN xWrtRIP]
    156 %else
    157         fld     qword [.s_r64NaN xWrtRIP]
     155        movss   xmm0, [.s_r32NaN xWrtRIP]
     156%else
     157        fld     dword [.s_r32NaN xWrtRIP]
    158158%endif
    159159        jmp     .return
     
    179179        ; Load +Inf
    180180%ifdef RT_ARCH_AMD64
    181         movsd   xmm0, [.s_r64MinusInf xWrtRIP]
    182 %else
    183         fld     qword [.s_r64MinusInf xWrtRIP]
     181        movss   xmm0, [.s_r32MinusInf xWrtRIP]
     182%else
     183        fld     dword [.s_r32MinusInf xWrtRIP]
    184184%endif
    185185        jmp     .return
     
    210210.s_r64AbsFyL2xP1InputMax:
    211211        dq      1.292
    212 ;.s_r64AbsFyL2xP1Range:
    213 ;        dq      0.292
    214 .s_r64MinusInf:
    215         dq      RTFLOAT64U_INF_MINUS
    216 .s_r64NaN:
    217         dq      RTFLOAT64U_QNAN_MINUS
    218 ENDPROC   RT_NOCRT(log2)
    219 
     212.s_r32MinusInf:
     213        dd      RTFLOAT32U_INF_MINUS
     214.s_r32NaN:
     215        dd      RTFLOAT32U_QNAN_MINUS
     216ENDPROC   RT_NOCRT(log2f)
     217
  • trunk/src/VBox/Runtime/testcase/Makefile.kmk

    r96268 r96279  
    672672        ../common/math/log.asm \
    673673        ../common/math/logf.asm \
     674        ../common/math/log2.asm \
     675        ../common/math/log2f.asm \
    674676        ../common/math/lrint.asm \
    675677        ../common/math/lrintf.asm \
  • trunk/src/VBox/Runtime/testcase/tstRTNoCrt-2.cpp

    r96273 r96279  
    433433                         __LINE__, #a_Fn, #a_Args, g_szFloat[0], g_szFloat[1]); \
    434434        } \
     435    } while (0)
     436
     437
     438
     439#define CHECK_XCPT(a_InnerTestExpr, a_fXcptMask, a_fXcptExpect) do { \
     440        RT_NOCRT(feclearexcept(RT_NOCRT_FE_ALL_EXCEPT)); \
     441        a_InnerTestExpr; \
     442        int const fXcpt = RT_NOCRT(fetestexcept)(RT_NOCRT_FE_ALL_EXCEPT); \
     443        if ((fXcpt & (a_fXcptMask)) != (a_fXcptExpect)) \
     444            RTTestFailed(g_hTest, "line %u: %s -^-> %#x, expected %#x (%s)", \
     445                          __LINE__, #a_InnerTestExpr, fXcpt, (a_fXcptExpect), #a_fXcptExpect); \
     446        RT_NOCRT(feclearexcept(RT_NOCRT_FE_ALL_EXCEPT)); \
    435447    } while (0)
    436448
     
    27042716    CHECK_FLT_SAME(logf,(RTStrNanFloat("s",  true)));
    27052717    CHECK_FLT_SAME(logf,(RTStrNanFloat("s", false)));
     2718}
     2719
     2720
     2721void testLog2()
     2722{
     2723    RTTestSub(g_hTest, "log2[f]");
     2724
     2725    CHECK_DBL(           RT_NOCRT(log2)(RTStrNanDouble(NULL,    true)), RTStrNanDouble(NULL,    true));
     2726    CHECK_DBL(           RT_NOCRT(log2)(RTStrNanDouble("234",  false)), RTStrNanDouble("234",  false));
     2727    CHECK_DBL(           RT_NOCRT(log2)(RTStrNanDouble("999s", false)), RTStrNanDouble("999s", false));
     2728    CHECK_DBL(           RT_NOCRT(log2)(RTStrNanDouble("fffs",  true)), RTStrNanDouble("fffs",  true));
     2729    CHECK_XCPT(CHECK_DBL(RT_NOCRT(log2)(  +0.0), -INFINITY), RT_NOCRT_FE_DIVBYZERO, RT_NOCRT_FE_DIVBYZERO);
     2730    CHECK_XCPT(CHECK_DBL(RT_NOCRT(log2)(  -0.0), -INFINITY), RT_NOCRT_FE_DIVBYZERO, RT_NOCRT_FE_DIVBYZERO);
     2731    CHECK_XCPT(CHECK_DBL(RT_NOCRT(log2)(-123.0), RTStrNanDouble(NULL, false)), RT_NOCRT_FE_INVALID, RT_NOCRT_FE_INVALID);
     2732    CHECK_DBL(           RT_NOCRT(log2)(              1.0),   +0.0);
     2733    CHECK_DBL(           RT_NOCRT(log2)(              2.0),   +1.0);
     2734    CHECK_DBL(           RT_NOCRT(log2)(           1024.0),  +10.0);
     2735    CHECK_DBL(           RT_NOCRT(log2)(  1099511627776.0),  +40.0); /* _1T */
     2736    CHECK_DBL_SAME(               log2,(              1.0));
     2737    CHECK_DBL_SAME(               log2,(              2.0));
     2738    CHECK_DBL_SAME(               log2,(           1024.0));
     2739    CHECK_DBL_SAME(               log2,(  1099511627776.0)); /* _1T */
     2740    CHECK_DBL_SAME(               log2,(              1.5));
     2741    CHECK_DBL_SAME(               log2,(      1.234485e-5));
     2742    CHECK_DBL_SAME(               log2,(      1.234485e+9));
     2743    CHECK_DBL_SAME(               log2,(    1.234485e+253));
     2744    CHECK_DBL_SAME(               log2,(        +INFINITY));
     2745    CHECK_DBL_SAME(               log2,(        -INFINITY));
     2746    CHECK_DBL_SAME(               log2,(         +DBL_MAX));
     2747    CHECK_DBL_SAME(               log2,(         -DBL_MAX));
     2748    CHECK_DBL_SAME(               log2,(RTStrNanDouble(NULL, true)));
     2749    CHECK_DBL_SAME(               log2,(RTStrNanDouble(NULL, false)));
     2750#if 0 /* UCRT doesn't preserve signalling NaN */
     2751    CHECK_DBL_SAME(               log2,(RTStrNanDouble("s",  true)));
     2752    CHECK_DBL_SAME(               log2,(RTStrNanDouble("s", false)));
     2753#endif
     2754
     2755    CHECK_FLT(           RT_NOCRT(log2f)(RTStrNanFloat(NULL,    true)), RTStrNanFloat(NULL,    true));
     2756    CHECK_FLT(           RT_NOCRT(log2f)(RTStrNanFloat("234",  false)), RTStrNanFloat("234",  false));
     2757    CHECK_FLT(           RT_NOCRT(log2f)(RTStrNanFloat("999s", false)), RTStrNanFloat("999s", false));
     2758    CHECK_FLT(           RT_NOCRT(log2f)(RTStrNanFloat("fffs",  true)), RTStrNanFloat("fffs",  true));
     2759    CHECK_XCPT(CHECK_FLT(RT_NOCRT(log2f)(  +0.0f), -(float)INFINITY), RT_NOCRT_FE_DIVBYZERO, RT_NOCRT_FE_DIVBYZERO);
     2760    CHECK_XCPT(CHECK_FLT(RT_NOCRT(log2f)(  -0.0f), -(float)INFINITY), RT_NOCRT_FE_DIVBYZERO, RT_NOCRT_FE_DIVBYZERO);
     2761    CHECK_XCPT(CHECK_FLT(RT_NOCRT(log2f)(-123.0f), RTStrNanFloat(NULL, false)), RT_NOCRT_FE_INVALID, RT_NOCRT_FE_INVALID);
     2762    CHECK_FLT(           RT_NOCRT(log2f)(              1.0f),   +0.0f);
     2763    CHECK_FLT(           RT_NOCRT(log2f)(              2.0f),   +1.0f);
     2764    CHECK_FLT(           RT_NOCRT(log2f)(           1024.0f),  +10.0f);
     2765    CHECK_FLT(           RT_NOCRT(log2f)(  1099511627776.0f),  +40.0f); /* _1T */
     2766    CHECK_FLT_SAME(               log2f,(              1.0f));
     2767    CHECK_FLT_SAME(               log2f,(              2.0f));
     2768    CHECK_FLT_SAME(               log2f,(           1024.0f));
     2769    CHECK_FLT_SAME(               log2f,(  1099511627776.0f)); /* _1T */
     2770    CHECK_FLT_SAME(               log2f,(              1.5f));
     2771    CHECK_FLT_SAME(               log2f,(      1.234485e-5f));
     2772    CHECK_FLT_SAME(               log2f,(      1.234485e+9f));
     2773    CHECK_FLT_SAME(               log2f,(     1.234485e+35f));
     2774    CHECK_FLT_SAME_RELAXED_NAN(   log2f,(  +(float)INFINITY)); /* UCRT returns +QNaN here, but log2 reutrn -QNaN. */
     2775    CHECK_FLT_SAME_RELAXED_NAN(   log2f,(  -(float)INFINITY)); /* ditto */
     2776    CHECK_FLT_SAME(               log2f,(          +FLT_MAX));
     2777    CHECK_FLT_SAME_RELAXED_NAN(   log2f,(          -FLT_MAX)); /* UCRT returns +QNaN here, but log2 reutrn -QNaN. */
     2778    CHECK_FLT_SAME(               log2f,(RTStrNanFloat(NULL, true)));
     2779    CHECK_FLT_SAME(               log2f,(RTStrNanFloat(NULL, false)));
     2780#if 0 /* UCRT doesn't preserve signalling NaN */
     2781    CHECK_FLT_SAME(               log2f,(RTStrNanDouble("s",  true)));
     2782    CHECK_FLT_SAME(               log2f,(RTStrNanDouble("s", false)));
     2783#endif
     2784
    27062785}
    27072786
     
    33973476    testRemainder();
    33983477    testLog();
     3478    testLog2();
    33993479    testSqRt();
    34003480
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette