VirtualBox

Changeset 95071 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
May 24, 2022 11:06:24 AM (3 years ago)
Author:
vboxsync
Message:

IPRT/asm: Added ASMCountLeadingZerosU16/32/64 & ASMCountTrailingZerosU16/32/64. bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstRTInlineAsm.cpp

    r93838 r95071  
    27432743    }
    27442744}
     2745
     2746
     2747void tstASMBit(void)
     2748{
     2749    RTTestSub(g_hTest, "ASMBitFirstSetU16");
     2750    RTTESTI_CHECK(ASMBitFirstSetU16(0x0000) == 0);
     2751    RTTESTI_CHECK(ASMBitFirstSetU16(0x0001) == 1);
     2752    RTTESTI_CHECK(ASMBitFirstSetU16(0x8000) == 16);
     2753    RTTESTI_CHECK(ASMBitFirstSetU16(0x0ef0) == 5);
     2754    for (unsigned iBit = 0; iBit < 16; iBit++)
     2755    {
     2756        RTTESTI_CHECK(ASMBitFirstSetU16((uint16_t)1 << iBit) == iBit + 1);
     2757        RTTESTI_CHECK(ASMBitFirstSetU16(UINT16_MAX  << iBit) == iBit + 1);
     2758    }
     2759
     2760    RTTestSub(g_hTest, "ASMBitFirstSetU32");
     2761    RTTESTI_CHECK(ASMBitFirstSetU32(UINT32_C(0x00000000)) == 0);
     2762    RTTESTI_CHECK(ASMBitFirstSetU32(UINT32_C(0x00000001)) == 1);
     2763    RTTESTI_CHECK(ASMBitFirstSetU32(UINT32_C(0x80000000)) == 32);
     2764    RTTESTI_CHECK(ASMBitFirstSetU32(UINT32_C(0x0efff0f0)) == 5);
     2765    for (unsigned iBit = 0; iBit < 32; iBit++)
     2766    {
     2767        RTTESTI_CHECK(ASMBitFirstSetU32((uint32_t)1 << iBit) == iBit + 1);
     2768        RTTESTI_CHECK(ASMBitFirstSetU32(UINT32_MAX  << iBit) == iBit + 1);
     2769    }
     2770
     2771    RTTestSub(g_hTest, "ASMBitFirstSetU64");
     2772    RTTESTI_CHECK(ASMBitFirstSetU64(UINT64_C(0x0000000000000000)) == 0);
     2773    RTTESTI_CHECK(ASMBitFirstSetU64(UINT64_C(0x0000000000000001)) == 1);
     2774    RTTESTI_CHECK(ASMBitFirstSetU64(UINT64_C(0x8000000000000000)) == 64);
     2775    RTTESTI_CHECK(ASMBitFirstSetU64(UINT64_C(0x0effffff0ffff0f0)) == 5);
     2776    for (unsigned iBit = 0; iBit < 64; iBit++)
     2777    {
     2778        RTTESTI_CHECK(ASMBitFirstSetU64((uint64_t)1 << iBit) == iBit + 1);
     2779        RTTESTI_CHECK(ASMBitFirstSetU64(UINT64_MAX  << iBit) == iBit + 1);
     2780    }
     2781
     2782    RTTestSub(g_hTest, "ASMBitLastSetU16");
     2783    RTTESTI_CHECK(ASMBitLastSetU16(0x0000) == 0);
     2784    RTTESTI_CHECK(ASMBitLastSetU16(0x0001) == 1);
     2785    RTTESTI_CHECK(ASMBitLastSetU16(0x8000) == 16);
     2786    RTTESTI_CHECK(ASMBitLastSetU16(0x0fe0) == 12);
     2787    for (unsigned iBit = 0; iBit < 16; iBit++)
     2788    {
     2789        RTTESTI_CHECK(ASMBitLastSetU16(UINT16_C(0x8000) >> (15 - iBit)) == iBit + 1);
     2790        RTTESTI_CHECK(ASMBitLastSetU16(UINT16_MAX       >> (15 - iBit)) == iBit + 1);
     2791    }
     2792
     2793    RTTestSub(g_hTest, "ASMBitLastSetU32");
     2794    RTTESTI_CHECK(ASMBitLastSetU32(UINT32_C(0x00000000)) == 0);
     2795    RTTESTI_CHECK(ASMBitLastSetU32(UINT32_C(0x00000001)) == 1);
     2796    RTTESTI_CHECK(ASMBitLastSetU32(UINT32_C(0x80000000)) == 32);
     2797    RTTESTI_CHECK(ASMBitLastSetU32(UINT32_C(0x0fffffe0)) == 28);
     2798    for (unsigned iBit = 0; iBit < 32; iBit++)
     2799    {
     2800        RTTESTI_CHECK(ASMBitLastSetU32(UINT32_C(0x80000000) >> (31 - iBit)) == iBit + 1);
     2801        RTTESTI_CHECK(ASMBitLastSetU32(UINT32_MAX           >> (31 - iBit)) == iBit + 1);
     2802    }
     2803
     2804    RTTestSub(g_hTest, "ASMBitLastSetU64");
     2805    RTTESTI_CHECK(ASMBitLastSetU64(UINT64_C(0x0000000000000000)) == 0);
     2806    RTTESTI_CHECK(ASMBitLastSetU64(UINT64_C(0x0000000000000001)) == 1);
     2807    RTTESTI_CHECK(ASMBitLastSetU64(UINT64_C(0x8000000000000000)) == 64);
     2808    RTTESTI_CHECK(ASMBitLastSetU64(UINT64_C(0x0ffffefff0ffffe0)) == 60);
     2809    for (unsigned iBit = 0; iBit < 64; iBit++)
     2810    {
     2811        RTTESTI_CHECK(ASMBitLastSetU64(UINT64_C(0x8000000000000000) >> (63 - iBit)) == iBit + 1);
     2812        RTTESTI_CHECK(ASMBitLastSetU64(UINT64_MAX                   >> (63 - iBit)) == iBit + 1);
     2813    }
     2814
     2815    RTTestSub(g_hTest, "ASMCountLeadingZerosU16");
     2816    RTTESTI_CHECK(ASMCountLeadingZerosU16(0x0000) == 16);
     2817    RTTESTI_CHECK(ASMCountLeadingZerosU16(0x0001) == 15);
     2818    RTTESTI_CHECK(ASMCountLeadingZerosU16(0x8000) == 0);
     2819    RTTESTI_CHECK(ASMCountLeadingZerosU16(0x0fe0) == 4);
     2820    for (unsigned iBit = 0; iBit < 16; iBit++)
     2821    {
     2822        RTTESTI_CHECK(ASMCountLeadingZerosU16(UINT16_C(0x8000) >> iBit) == iBit);
     2823        RTTESTI_CHECK(ASMCountLeadingZerosU16(UINT16_MAX       >> iBit) == iBit);
     2824    }
     2825
     2826    RTTestSub(g_hTest, "ASMCountLeadingZerosU32");
     2827    RTTESTI_CHECK(ASMCountLeadingZerosU32(UINT32_C(0x00000000)) == 32);
     2828    RTTESTI_CHECK(ASMCountLeadingZerosU32(UINT32_C(0x00000001)) == 31);
     2829    RTTESTI_CHECK(ASMCountLeadingZerosU32(UINT32_C(0x80000000)) == 0);
     2830    RTTESTI_CHECK(ASMCountLeadingZerosU32(UINT32_C(0x0fffffe0)) == 4);
     2831    for (unsigned iBit = 0; iBit < 32; iBit++)
     2832    {
     2833        RTTESTI_CHECK(ASMCountLeadingZerosU32(UINT32_C(0x80000000) >> iBit) == iBit);
     2834        RTTESTI_CHECK(ASMCountLeadingZerosU32(UINT32_MAX           >> iBit) == iBit);
     2835    }
     2836
     2837    RTTestSub(g_hTest, "ASMCountLeadingZerosU64");
     2838    RTTESTI_CHECK(ASMCountLeadingZerosU64(UINT64_C(0x0000000000000000)) == 64);
     2839    RTTESTI_CHECK(ASMCountLeadingZerosU64(UINT64_C(0x0000000000000001)) == 63);
     2840    RTTESTI_CHECK(ASMCountLeadingZerosU64(UINT64_C(0x8000000000000000)) == 0);
     2841    RTTESTI_CHECK(ASMCountLeadingZerosU64(UINT64_C(0x0fffffff0f0fffe0)) == 4);
     2842    for (unsigned iBit = 0; iBit < 64; iBit++)
     2843    {
     2844        RTTESTI_CHECK(ASMCountLeadingZerosU64(UINT64_C(0x8000000000000000) >> iBit) == iBit);
     2845        RTTESTI_CHECK(ASMCountLeadingZerosU64(UINT64_MAX                   >> iBit) == iBit);
     2846    }
     2847
     2848    RTTestSub(g_hTest, "ASMCountTrailingZerosU16");
     2849    RTTESTI_CHECK(ASMCountTrailingZerosU16(0x0000) == 16);
     2850    RTTESTI_CHECK(ASMCountTrailingZerosU16(0x0001) == 0);
     2851    RTTESTI_CHECK(ASMCountTrailingZerosU16(0x8000) == 15);
     2852    RTTESTI_CHECK(ASMCountTrailingZerosU16(0x0ef0) == 4);
     2853    for (unsigned iBit = 0; iBit < 16; iBit++)
     2854    {
     2855        RTTESTI_CHECK(ASMCountTrailingZerosU16((uint16_t)1 << iBit) == iBit);
     2856        RTTESTI_CHECK(ASMCountTrailingZerosU16(UINT16_MAX  << iBit) == iBit);
     2857    }
     2858
     2859    RTTestSub(g_hTest, "ASMCountTrailingZerosU32");
     2860    RTTESTI_CHECK(ASMCountTrailingZerosU32(UINT32_C(0x00000000)) == 32);
     2861    RTTESTI_CHECK(ASMCountTrailingZerosU32(UINT32_C(0x00000001)) == 0);
     2862    RTTESTI_CHECK(ASMCountTrailingZerosU32(UINT32_C(0x80000000)) == 31);
     2863    RTTESTI_CHECK(ASMCountTrailingZerosU32(UINT32_C(0x0efffff0)) == 4);
     2864    for (unsigned iBit = 0; iBit < 32; iBit++)
     2865    {
     2866        RTTESTI_CHECK(ASMCountTrailingZerosU32((uint32_t)1 << iBit) == iBit);
     2867        RTTESTI_CHECK(ASMCountTrailingZerosU32(UINT32_MAX  << iBit) == iBit);
     2868    }
     2869
     2870    RTTestSub(g_hTest, "ASMCountTrailingZerosU64");
     2871    RTTESTI_CHECK(ASMCountTrailingZerosU64(UINT64_C(0x0000000000000000)) == 64);
     2872    RTTESTI_CHECK(ASMCountTrailingZerosU64(UINT64_C(0x0000000000000001)) == 0);
     2873    RTTESTI_CHECK(ASMCountTrailingZerosU64(UINT64_C(0x8000000000000000)) == 63);
     2874    RTTESTI_CHECK(ASMCountTrailingZerosU64(UINT64_C(0x0effff0fefef0ff0)) == 4);
     2875    for (unsigned iBit = 0; iBit < 64; iBit++)
     2876    {
     2877        RTTESTI_CHECK(ASMCountTrailingZerosU64((uint64_t)1 << iBit) == iBit);
     2878        RTTESTI_CHECK(ASMCountTrailingZerosU64(UINT64_MAX  << iBit) == iBit);
     2879    }
     2880}
     2881
    27452882
    27462883void tstASMMath(void)
     
    31043241    BENCH(ASMNopPause(),                         "ASMNopPause");
    31053242
     3243    BENCH(ASMBitFirstSetU16(s_u16),              "ASMBitFirstSetU16");
     3244    BENCH(ASMBitFirstSetU32(s_u32),              "ASMBitFirstSetU32");
     3245    BENCH(ASMBitFirstSetU64(s_u32),              "ASMBitFirstSetU64");
     3246    BENCH(ASMBitLastSetU16(s_u16),               "ASMBitLastSetU16");
     3247    BENCH(ASMBitLastSetU32(s_u32),               "ASMBitLastSetU32");
     3248    BENCH(ASMBitLastSetU64(s_u32),               "ASMBitLastSetU64");
     3249    BENCH(ASMCountLeadingZerosU16(s_u16),        "ASMCountLeadingZerosU16");
     3250    BENCH(ASMCountLeadingZerosU32(s_u32),        "ASMCountLeadingZerosU32");
     3251    BENCH(ASMCountLeadingZerosU64(s_u64),        "ASMCountLeadingZerosU64");
     3252    BENCH(ASMCountTrailingZerosU16(s_u16),       "ASMCountTrailingZerosU16");
     3253    BENCH(ASMCountTrailingZerosU32(s_u32),       "ASMCountTrailingZerosU32");
     3254    BENCH(ASMCountTrailingZerosU64(s_u64),       "ASMCountTrailingZerosU64");
     3255
     3256s_u32 = 0; if (s_u32) { /// remove me
    31063257    /* The Darwin gcc does not like this ... */
    31073258#if !defined(RT_OS_DARWIN) && !defined(GCC44_32BIT_PIC) && (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86))
     
    31783329    tstASMMisc();
    31793330
     3331    tstASMBit();
     3332
    31803333    tstASMMath();
    31813334
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