VirtualBox

Changeset 96216 in vbox


Ignore:
Timestamp:
Aug 15, 2022 11:12:09 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153027
Message:

IPRT/nocrt: fabs[f] tests and 64-bit code improvements. bugref:10261

Location:
trunk/src/VBox/Runtime
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/math/fabs.asm

    r96014 r96216  
    2525;
    2626
     27
     28%define RT_ASM_WITH_SEH64
    2729%include "iprt/asmdefs.mac"
     30
    2831
    2932BEGINCODE
     
    3437; @param    rd      32-bit: [ebp + 8]   64-bit: xmm0
    3538RT_NOCRT_BEGINPROC fabs
    36     push    xBP
    37     mov     xBP, xSP
     39        push    xBP
     40        SEH64_PUSH_xBP
     41        mov     xBP, xSP
     42        SEH64_SET_FRAME_xBP 0
     43        SEH64_END_PROLOGUE
    3844
    3945%ifdef RT_ARCH_AMD64
    40     sub     xSP, 10h
    41 
    42     movsd   [xSP], xmm0
    43     fld     qword [xSP]
    44 
    45     fabs
    46 
    47     fstp    qword [xSP]
    48     movsd   xmm0, [xSP]
    49 
     46        andps   xmm0, [g_r64ClearSignMask xWrtRIP]
    5047%else
    51     fld     qword [xBP + xCB*2]
    52     fabs
     48        fld     qword [xBP + xCB*2]     ; This turns SNaN into QNaN.
     49        fabs
    5350%endif
    5451
    55     leave
    56     ret
     52        leave
     53        ret
    5754ENDPROC   RT_NOCRT(fabs)
    5855
     56ALIGNCODE(16)
     57g_r64ClearSignMask:
     58        dd      0ffffffffh
     59        dd      07fffffffh
     60
     61        dd      0ffffffffh
     62        dd      07fffffffh
     63
  • trunk/src/VBox/Runtime/common/math/fabsf.asm

    r96014 r96216  
    2525;
    2626
     27
     28%define RT_ASM_WITH_SEH64
    2729%include "iprt/asmdefs.mac"
     30
    2831
    2932BEGINCODE
     
    3437; @param    rf      32-bit: [ebp + 8]   64-bit: xmm0
    3538RT_NOCRT_BEGINPROC fabsf
    36     push    xBP
    37     mov     xBP, xSP
     39        push    xBP
     40        SEH64_PUSH_xBP
     41        mov     xBP, xSP
     42        SEH64_SET_FRAME_xBP 0
     43        SEH64_END_PROLOGUE
    3844
    3945%ifdef RT_ARCH_AMD64
    40     sub     xSP, 10h
    41 
    42     movsd   [xSP], xmm0
    43     fld     dword [xSP]
    44 
    45     fabs
    46 
    47     fstp    dword [xSP]
    48     movsd   xmm0, [xSP]
    49 
     46        andps   xmm0, [g_r32ClearSignMask xWrtRIP]
    5047%else
    51     fld     dword [xBP + xCB*2]
    52     fabs
     48        fld     dword [xBP + xCB*2]     ; This turns SNaN into QNaN.
     49        fabs
    5350%endif
    5451
    55     leave
    56     ret
     52        leave
     53        ret
    5754ENDPROC   RT_NOCRT(fabsf)
    5855
     56ALIGNCODE(16)
     57g_r32ClearSignMask:
     58        dd      07fffffffh
     59        dd      07fffffffh
     60        dd      07fffffffh
     61        dd      07fffffffh
     62
  • trunk/src/VBox/Runtime/common/math/fabsl.asm

    r96014 r96216  
    2525;
    2626
     27
     28%define RT_ASM_WITH_SEH64
    2729%include "iprt/asmdefs.mac"
     30
    2831
    2932BEGINCODE
     
    3437; @param    lrd     [xSP + xCB*2]
    3538RT_NOCRT_BEGINPROC fabsl
    36     push    xBP
    37     mov     xBP, xSP
     39        push    xBP
     40        SEH64_PUSH_xBP
     41        mov     xBP, xSP
     42        SEH64_SET_FRAME_xBP 0
     43        SEH64_END_PROLOGUE
    3844
    39     fld     tword [xBP + xCB*2]
    40     fabs
     45        fld     tword [xBP + xCB*2]
     46        fabs
    4147
    42 .done:
    43     leave
    44     ret
     48        leave
     49        ret
    4550ENDPROC   RT_NOCRT(fabsl)
    4651
  • trunk/src/VBox/Runtime/testcase/tstRTNoCrt-2.cpp

    r96215 r96216  
    345345    CHECK_LONG_SAME(llabs,(LONG_MIN));
    346346    CHECK_LONG_SAME(llabs,(LONG_MAX));
     347}
     348
     349
     350void testFAbs()
     351{
     352    RTTestSub(g_hTest, "fabs[fl]");
     353
     354    CHECK_DBL(RT_NOCRT(fabs)(              +0.0),               +0.0);
     355    CHECK_DBL(RT_NOCRT(fabs)(              -0.0),               +0.0);
     356    CHECK_DBL(RT_NOCRT(fabs)(             -42.5),              +42.5);
     357    CHECK_DBL(RT_NOCRT(fabs)(             +42.5),              +42.5);
     358    CHECK_DBL(RT_NOCRT(fabs)(+1234.60958634e+20), +1234.60958634e+20);
     359    CHECK_DBL(RT_NOCRT(fabs)(-1234.60958634e+20), +1234.60958634e+20);
     360    CHECK_DBL(RT_NOCRT(fabs)(      +2.1984e-310),       +2.1984e-310); /* subnormal */
     361    CHECK_DBL(RT_NOCRT(fabs)(      -2.1984e-310),       +2.1984e-310); /* subnormal */
     362    CHECK_DBL(RT_NOCRT(fabs)(-INFINITY),                   +INFINITY);
     363    CHECK_DBL(RT_NOCRT(fabs)(+INFINITY),                   +INFINITY);
     364    CHECK_DBL(RT_NOCRT(fabs)(RTStrNanDouble(NULL, true)), RTStrNanDouble(NULL, true));
     365    CHECK_DBL(RT_NOCRT(fabs)(RTStrNanDouble("s", false)), RTStrNanDouble("s", true));
     366    CHECK_DBL_SAME(fabs,(              -0.0));
     367    CHECK_DBL_SAME(fabs,(              +0.0));
     368    CHECK_DBL_SAME(fabs,(             +22.5));
     369    CHECK_DBL_SAME(fabs,(             -22.5));
     370    CHECK_DBL_SAME(fabs,(      +2.1984e-310)); /* subnormal */
     371    CHECK_DBL_SAME(fabs,(      -2.1984e-310)); /* subnormal */
     372    CHECK_DBL_SAME(fabs,(+1234.60958634e+20));
     373    CHECK_DBL_SAME(fabs,(-1234.60958634e+20));
     374    CHECK_DBL_SAME(fabs,(-INFINITY));
     375    CHECK_DBL_SAME(fabs,(+INFINITY));
     376    CHECK_DBL_SAME(fabs,(RTStrNanDouble(NULL, true)));
     377    CHECK_DBL_SAME(fabs,(RTStrNanDouble("s", false)));
     378
     379    CHECK_FLT(RT_NOCRT(fabsf)(              +0.0f),               +0.0f);
     380    CHECK_FLT(RT_NOCRT(fabsf)(              -0.0f),               +0.0f);
     381    CHECK_FLT(RT_NOCRT(fabsf)(             -42.5f),              +42.5f);
     382    CHECK_FLT(RT_NOCRT(fabsf)(             +42.5f),              +42.5f);
     383    CHECK_FLT(RT_NOCRT(fabsf)(+1234.60958634e+20f), +1234.60958634e+20f);
     384    CHECK_FLT(RT_NOCRT(fabsf)(-1234.60958634e+20f), +1234.60958634e+20f);
     385    CHECK_FLT(RT_NOCRT(fabsf)(      +2.1984e-310f),       +2.1984e-310f); /* subnormal */
     386    CHECK_FLT(RT_NOCRT(fabsf)(      -2.1984e-310f),       +2.1984e-310f); /* subnormal */
     387    CHECK_FLT(RT_NOCRT(fabsf)(-INFINITY),                     +INFINITY);
     388    CHECK_FLT(RT_NOCRT(fabsf)(+INFINITY),                     +INFINITY);
     389    CHECK_FLT(RT_NOCRT(fabsf)(RTStrNanFloat(NULL, true)), RTStrNanFloat(NULL, true));
     390    CHECK_FLT(RT_NOCRT(fabsf)(RTStrNanFloat("s", false)), RTStrNanFloat("s", true));
     391    CHECK_FLT_SAME(fabsf,(              -0.0f));
     392    CHECK_FLT_SAME(fabsf,(              +0.0f));
     393    CHECK_FLT_SAME(fabsf,(             +22.5f));
     394    CHECK_FLT_SAME(fabsf,(             -22.5f));
     395    CHECK_FLT_SAME(fabsf,(      +2.1984e-310f)); /* subnormal */
     396    CHECK_FLT_SAME(fabsf,(      -2.1984e-310f)); /* subnormal */
     397    CHECK_FLT_SAME(fabsf,(+1234.60958634e+20f));
     398    CHECK_FLT_SAME(fabsf,(-1234.60958634e+20f));
     399    CHECK_FLT_SAME(fabsf,(-INFINITY));
     400    CHECK_FLT_SAME(fabsf,(+INFINITY));
     401    CHECK_FLT_SAME(fabsf,(RTStrNanFloat(NULL, true)));
     402#if 0 /* UCRT on windows converts this to a quiet NaN, so skip it. */
     403    CHECK_FLT_SAME(fabsf,(RTStrNanFloat("s", false)));
     404#endif
    347405}
    348406
     
    23512409
    23522410    /* math.h */
     2411    testFAbs();
    23532412    testCopySign();
    23542413    testFmax();
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