VirtualBox

Changeset 96282 in vbox


Ignore:
Timestamp:
Aug 18, 2022 2:52:12 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153096
Message:

IPRT/nocrt: Implemented expf. bugref:10261

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

Legend:

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

    r96280 r96282  
    19111911        common/math/ceilf.asm  \
    19121912        common/math/exp.asm  \
     1913        common/math/expf.asm  \
    19131914        common/math/exp2.asm  \
    19141915        common/math/exp2f.asm  \
     
    19861987        common/math/ceilf.asm  \
    19871988        common/math/exp.asm  \
     1989        common/math/expf.asm  \
    19881990        common/math/exp2.asm  \
    19891991        common/math/exp2f.asm  \
  • trunk/src/VBox/Runtime/common/math/expf.asm

    r96281 r96282  
    11; $Id$
    22;; @file
    3 ; IPRT - No-CRT exp - AMD64 & X86.
     3; IPRT - No-CRT expf - AMD64 & X86.
    44;
    55
     
    3939; @returns st(0) / xmm0
    4040; @param    rd      [xSP + xCB*2] / xmm0
    41 RT_NOCRT_BEGINPROC exp
     41RT_NOCRT_BEGINPROC expf
    4242        push    xBP
    4343        SEH64_PUSH_xBP
     
    5252        ;
    5353%ifdef RT_ARCH_AMD64
    54         movsd   [xBP - 10h], xmm0
    55         fld     qword [xBP - 10h]
     54        movss   [xBP - 10h], xmm0
     55        fld     dword [xBP - 10h]
    5656%else
    57         fld     qword [xBP + xCB*2]
     57        fld     dword [xBP + xCB*2]
    5858%endif
    5959
     
    104104.return_val:
    105105%ifdef RT_ARCH_AMD64
    106         fstp    qword [xBP - 10h]
    107         movsd   xmm0, [xBP - 10h]
     106        fstp    dword [xBP - 10h]
     107        movss   xmm0, [xBP - 10h]
    108108%endif
    109109.return:
     
    138138%endif
    139139        jmp     .return
    140 ENDPROC   RT_NOCRT(exp)
     140ENDPROC   RT_NOCRT(expf)
    141141
  • trunk/src/VBox/Runtime/testcase/Makefile.kmk

    r96280 r96282  
    644644        ../common/math/cosl.asm \
    645645        ../common/math/exp.asm \
     646        ../common/math/expf.asm \
    646647        ../common/math/exp2.asm \
    647648        ../common/math/exp2f.asm \
  • trunk/src/VBox/Runtime/testcase/tstRTNoCrt-2.cpp

    r96280 r96282  
    385385    } while (0)
    386386
    387 #define CHECK_FLT_APPROX_SAME(a_Fn, a_Args) do { \
     387#define CHECK_FLT_APPROX_SAME(a_Fn, a_Args, a_cMaxDelta) do { \
    388388        RTFLOAT32U uNoCrtRet, uCrtRet; \
    389389        uNoCrtRet.r = RT_NOCRT(a_Fn) a_Args; \
    390390        uCrtRet.r   =          a_Fn  a_Args; \
    391391        if (   !RTFLOAT32U_ARE_IDENTICAL(&uNoCrtRet, &uCrtRet) \
    392             && (  (uNoCrtRet.u >= uCrtRet.u ? uNoCrtRet.u - uCrtRet.u : uCrtRet.u - uNoCrtRet.u) > 1 /* off by one is okay */ \
     392            && (  (uNoCrtRet.u >= uCrtRet.u ? uNoCrtRet.u - uCrtRet.u : uCrtRet.u - uNoCrtRet.u) > (a_cMaxDelta) \
    393393                || RTFLOAT32U_IS_NAN(&uNoCrtRet) \
    394394                || RTFLOAT32U_IS_NAN(&uCrtRet) ) ) \
     
    396396            RTStrFormatR32(g_szFloat[0], sizeof(g_szFloat[0]), &uNoCrtRet, 0, 0, RTSTR_F_SPECIAL); \
    397397            RTStrFormatR32(g_szFloat[1], sizeof(g_szFloat[0]), &uCrtRet,   0, 0, RTSTR_F_SPECIAL); \
    398             RTTestFailed(g_hTest, "line %u: %s%s: noCRT => %s; CRT => %s", \
    399                          __LINE__, #a_Fn, #a_Args, g_szFloat[0], g_szFloat[1]); \
     398            RTTestFailed(g_hTest, "line %u: %s%s: noCRT => %s; CRT => %s (max delta %u)", \
     399                         __LINE__, #a_Fn, #a_Args, g_szFloat[0], g_szFloat[1], a_cMaxDelta); \
    400400        } \
    401401    } while (0)
     
    24382438    RTTestSub(g_hTest, "exp[f]");
    24392439
    2440     CHECK_DBL(        RT_NOCRT(exp)(         +1.0),   M_E);
    2441     CHECK_DBL_RANGE(  RT_NOCRT(exp)(         +2.0),   M_E * M_E, 0.000000000000001);
    2442     CHECK_DBL(        RT_NOCRT(exp)(    +INFINITY),   +INFINITY);
    2443     CHECK_DBL(        RT_NOCRT(exp)(    -INFINITY),   +0.0);
    2444     CHECK_DBL(        RT_NOCRT(exp)(         +0.0),   +1.0);
    2445     CHECK_DBL(        RT_NOCRT(exp)(         -0.0),   +1.0);
    2446     CHECK_DBL_SAME(            exp,(         +0.0));
    2447     CHECK_DBL_SAME(            exp,(         -0.0));
    2448     CHECK_DBL_SAME(            exp,(         +1.0));
    2449     CHECK_DBL_SAME(            exp,(         +2.0));
    2450     CHECK_DBL_SAME(            exp,(         -1.0));
    2451     CHECK_DBL_APPROX_SAME(     exp,(          +0.5),    1);
    2452     CHECK_DBL_APPROX_SAME(     exp,(          -0.5),    1);
    2453     CHECK_DBL_APPROX_SAME(     exp,(          +1.5),    1);
    2454     CHECK_DBL_APPROX_SAME(     exp,(          -1.5),    1);
    2455     CHECK_DBL_APPROX_SAME(     exp,(         +3.25),   16);
    2456     CHECK_DBL_APPROX_SAME(     exp,(    99.2559430),   16);
    2457     CHECK_DBL_APPROX_SAME(     exp,(   -99.2559430),   32);
    2458     CHECK_DBL_APPROX_SAME(     exp,(  +305.2559430),  128);
    2459     CHECK_DBL_APPROX_SAME(     exp,(  -305.2559430),  128);
    2460     CHECK_DBL_APPROX_SAME(     exp,(    +309.99884),  128);
    2461     CHECK_DBL_APPROX_SAME(     exp,(   -309.111048),  128);
    2462     CHECK_DBL_APPROX_SAME(     exp,(+999.864597634),    1);
    2463     CHECK_DBL_APPROX_SAME(     exp,(-999.098234837),    1);
    2464     CHECK_DBL_SAME(            exp,(+DBL_MAX));
    2465     CHECK_DBL_SAME(            exp,(-DBL_MAX));
    2466     CHECK_DBL_SAME(            exp,(-DBL_MIN));
    2467     CHECK_DBL_SAME(            exp,(+DBL_MIN));
    2468     CHECK_DBL_SAME(            exp,(+INFINITY));
    2469     CHECK_DBL_SAME(            exp,(-INFINITY));
     2440    CHECK_DBL(        RT_NOCRT(exp)(           +1.0),   M_E);
     2441    CHECK_DBL_RANGE(  RT_NOCRT(exp)(           +2.0),   M_E * M_E, 0.000000000000001);
     2442    CHECK_DBL(        RT_NOCRT(exp)(      +INFINITY),   +INFINITY);
     2443    CHECK_DBL(        RT_NOCRT(exp)(      -INFINITY),   +0.0);
     2444    CHECK_DBL(        RT_NOCRT(exp)(           +0.0),   +1.0);
     2445    CHECK_DBL(        RT_NOCRT(exp)(           -0.0),   +1.0);
     2446    CHECK_DBL_SAME(            exp,(           +0.0));
     2447    CHECK_DBL_SAME(            exp,(           -0.0));
     2448    CHECK_DBL_SAME(            exp,(           +1.0));
     2449    CHECK_DBL_SAME(            exp,(           +2.0));
     2450    CHECK_DBL_SAME(            exp,(           -1.0));
     2451    CHECK_DBL_APPROX_SAME(     exp,(           +0.5),    1);
     2452    CHECK_DBL_APPROX_SAME(     exp,(           -0.5),    1);
     2453    CHECK_DBL_APPROX_SAME(     exp,(           +1.5),    1);
     2454    CHECK_DBL_APPROX_SAME(     exp,(           -1.5),    1);
     2455    CHECK_DBL_APPROX_SAME(     exp,(          +3.25),   16);
     2456    CHECK_DBL_APPROX_SAME(     exp,(     99.2559430),   16);
     2457    CHECK_DBL_APPROX_SAME(     exp,(    -99.2559430),   32);
     2458    CHECK_DBL_APPROX_SAME(     exp,(   +305.2559430),  128);
     2459    CHECK_DBL_APPROX_SAME(     exp,(   -305.2559430),  128);
     2460    CHECK_DBL_APPROX_SAME(     exp,(     +309.99884),  128);
     2461    CHECK_DBL_APPROX_SAME(     exp,(    -309.111048),  128);
     2462    CHECK_DBL_APPROX_SAME(     exp,( +999.864597634),    1);
     2463    CHECK_DBL_APPROX_SAME(     exp,( -999.098234837),    1);
     2464    CHECK_DBL_SAME(            exp,(       +DBL_MAX));
     2465    CHECK_DBL_SAME(            exp,(       -DBL_MAX));
     2466    CHECK_DBL_SAME(            exp,(       -DBL_MIN));
     2467    CHECK_DBL_SAME(            exp,(       +DBL_MIN));
     2468    CHECK_DBL_SAME(            exp,(      +INFINITY));
     2469    CHECK_DBL_SAME(            exp,(      -INFINITY));
    24702470    CHECK_DBL_SAME(            exp,(RTStrNanDouble(NULL, false)));
    24712471    CHECK_DBL_SAME(            exp,(RTStrNanDouble("ab305f", true)));
    24722472    CHECK_DBL_SAME_RELAXED_NAN(exp,(RTStrNanDouble("fffffffff_signaling", true)));
    24732473    CHECK_DBL_SAME_RELAXED_NAN(exp,(RTStrNanDouble("7777777777778_sig", false)));
     2474
     2475    CHECK_FLT(        RT_NOCRT(expf)(           +1.0f),   (float)M_E);
     2476    CHECK_FLT(        RT_NOCRT(expf)(           +2.0f),   (float)(M_E * M_E));
     2477    CHECK_FLT(        RT_NOCRT(expf)(+(float)INFINITY),+(float)INFINITY);
     2478    CHECK_FLT(        RT_NOCRT(expf)(-(float)INFINITY),+0.0f);
     2479    CHECK_FLT(        RT_NOCRT(expf)(           +0.0f),   +1.0f);
     2480    CHECK_FLT(        RT_NOCRT(expf)(           -0.0f),   +1.0f);
     2481    CHECK_FLT_SAME(            expf,(           +0.0f));
     2482    CHECK_FLT_SAME(            expf,(           -0.0f));
     2483    CHECK_FLT_SAME(            expf,(           +1.0f));
     2484    CHECK_FLT_SAME(            expf,(           +2.0f));
     2485    CHECK_FLT_SAME(            expf,(           -1.0f));
     2486    CHECK_FLT_SAME(            expf,(           +0.5f));
     2487    CHECK_FLT_SAME(            expf,(           -0.5f));
     2488    CHECK_FLT_SAME(            expf,(           +1.5f));
     2489    CHECK_FLT_SAME(            expf,(           -1.5f));
     2490    CHECK_FLT_SAME(            expf,(          +3.25f));
     2491    CHECK_FLT_SAME(            expf,(     99.2559430f));
     2492    CHECK_FLT_SAME(            expf,(    -99.2559430f));
     2493    CHECK_FLT_SAME(            expf,(   +305.2559430f));
     2494    CHECK_FLT_SAME(            expf,(   -305.2559430f));
     2495    CHECK_FLT_SAME(            expf,(     +309.99884f));
     2496    CHECK_FLT_SAME(            expf,(    -309.111048f));
     2497    CHECK_FLT_SAME(            expf,( +999.864597634f));
     2498    CHECK_FLT_SAME(            expf,( -999.098234837f));
     2499    CHECK_FLT_SAME(            expf,(        +FLT_MAX));
     2500    CHECK_FLT_SAME(            expf,(        -FLT_MAX));
     2501    CHECK_FLT_SAME(            expf,(        -FLT_MIN));
     2502    CHECK_FLT_SAME(            expf,(        +FLT_MIN));
     2503    CHECK_FLT_SAME(            expf,(+(float)INFINITY));
     2504    CHECK_FLT_SAME(            expf,(-(float)INFINITY));
     2505    CHECK_FLT_SAME(            expf,(RTStrNanFloat(NULL, false)));
     2506    CHECK_FLT_SAME(            expf,(RTStrNanFloat("ab305f", true)));
     2507    CHECK_FLT_SAME_RELAXED_NAN(expf,(RTStrNanFloat("fffffffff_signaling", true)));
     2508    CHECK_FLT_SAME_RELAXED_NAN(expf,(RTStrNanFloat("7777777777778_sig", false)));
    24742509}
    24752510
     
    25092544
    25102545
    2511     CHECK_FLT(RT_NOCRT(exp2f)(1.0f), 2.0f);
    2512     CHECK_FLT(RT_NOCRT(exp2f)(2.0f), 4.0f);
    2513     CHECK_FLT(RT_NOCRT(exp2f)(32.0f), 4294967296.0f);
    2514     CHECK_FLT(RT_NOCRT(exp2f)(-1.0f), 0.5f);
    2515     CHECK_FLT(RT_NOCRT(exp2f)(-3.0f), 0.125f);
    2516     CHECK_FLT_SAME(exp2f, (0.0f));
    2517     CHECK_FLT_SAME(exp2f, (+INFINITY));
    2518     CHECK_FLT_SAME(exp2f, (-INFINITY));
    2519     CHECK_FLT_SAME(exp2f, (nan("1")));
    2520     CHECK_FLT_SAME(exp2f, (RTStrNanFloat("ab305f", true)));
    2521     CHECK_FLT_SAME(exp2f, (RTStrNanFloat("3fffff_signaling", true)));
    2522     CHECK_FLT_SAME(exp2f, (RTStrNanFloat("79778_sig", false)));
    2523     CHECK_FLT_SAME(exp2f, (1.0f));
    2524     CHECK_FLT_SAME(exp2f, (2.0f));
    2525     CHECK_FLT_SAME(exp2f, (-1.0f));
    2526     CHECK_FLT_APPROX_SAME(exp2f, (+0.5f));
    2527     CHECK_FLT_APPROX_SAME(exp2f, (-0.5f));
    2528     CHECK_FLT_APPROX_SAME(exp2f, (+1.5f));
    2529     CHECK_FLT_APPROX_SAME(exp2f, (-1.5f));
    2530     CHECK_FLT_APPROX_SAME(exp2f, (+3.25f));
    2531     CHECK_FLT_APPROX_SAME(exp2f, (99.25594f));
    2532     CHECK_FLT_APPROX_SAME(exp2f, (-99.25594f));
    2533     CHECK_FLT_APPROX_SAME(exp2f, (+305.25594f));
    2534     CHECK_FLT_APPROX_SAME(exp2f, (-305.25594f));
    2535     CHECK_FLT_APPROX_SAME(exp2f, (+309.99884f));
    2536     CHECK_FLT_APPROX_SAME(exp2f, (-309.111048f));
    2537     CHECK_FLT_APPROX_SAME(exp2f, (+999.86459f));
    2538     CHECK_FLT_APPROX_SAME(exp2f, (-999.09823f));
     2546    CHECK_FLT(   RT_NOCRT(exp2f)(            1.0f), 2.0f);
     2547    CHECK_FLT(   RT_NOCRT(exp2f)(            2.0f), 4.0f);
     2548    CHECK_FLT(   RT_NOCRT(exp2f)(           32.0f), 4294967296.0f);
     2549    CHECK_FLT(   RT_NOCRT(exp2f)(           -1.0f), 0.5f);
     2550    CHECK_FLT(   RT_NOCRT(exp2f)(           -3.0f), 0.125f);
     2551    CHECK_FLT_SAME(       exp2f,(            0.0f));
     2552    CHECK_FLT_SAME(       exp2f,(+(float)INFINITY));
     2553    CHECK_FLT_SAME(       exp2f,(-(float)INFINITY));
     2554    CHECK_FLT_SAME(       exp2f,(         nan("1")));
     2555    CHECK_FLT_SAME(       exp2f,(RTStrNanFloat("ab305f", true)));
     2556    CHECK_FLT_SAME(       exp2f,(RTStrNanFloat("3fffff_signaling", true)));
     2557    CHECK_FLT_SAME(       exp2f,(RTStrNanFloat("79778_sig", false)));
     2558    CHECK_FLT_SAME(       exp2f,(            1.0f));
     2559    CHECK_FLT_SAME(       exp2f,(            2.0f));
     2560    CHECK_FLT_SAME(       exp2f,(           -1.0f));
     2561    CHECK_FLT_APPROX_SAME(exp2f,(           +0.5f), 1);
     2562    CHECK_FLT_APPROX_SAME(exp2f,(           -0.5f), 1);
     2563    CHECK_FLT_APPROX_SAME(exp2f,(           +1.5f), 1);
     2564    CHECK_FLT_APPROX_SAME(exp2f,(           -1.5f), 1);
     2565    CHECK_FLT_APPROX_SAME(exp2f,(          +3.25f), 1);
     2566    CHECK_FLT_APPROX_SAME(exp2f,(       99.25594f), 1);
     2567    CHECK_FLT_APPROX_SAME(exp2f,(      -99.25594f), 1);
     2568    CHECK_FLT_APPROX_SAME(exp2f,(     +305.25594f), 1);
     2569    CHECK_FLT_APPROX_SAME(exp2f,(     -305.25594f), 1);
     2570    CHECK_FLT_APPROX_SAME(exp2f,(     +309.99884f), 1);
     2571    CHECK_FLT_APPROX_SAME(exp2f,(    -309.111048f), 1);
     2572    CHECK_FLT_APPROX_SAME(exp2f,(     +999.86459f), 1);
     2573    CHECK_FLT_APPROX_SAME(exp2f,(     -999.09823f), 1);
    25392574}
    25402575
Note: See TracChangeset for help on using the changeset viewer.

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