VirtualBox

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


Ignore:
Timestamp:
May 27, 2024 8:08:37 PM (9 months ago)
Author:
vboxsync
Message:

iprt/asm.h: Added ASMAtomic[Uo]WriteU128[U|v2] and ASMAtomic[Uo]ReadU128[U]. bugref:10687

File:
1 edited

Legend:

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

    r103354 r104795  
    176176        RTTestISub(#name); \
    177177        DO_SIMPLE_TEST_NO_SUB(tst ## name ## Worker, type); \
     178    } while (0)
     179
     180
     181/**
     182 * Calls a worker function with different worker variable storage types.
     183 */
     184#define DO_SIMPLE_TEST_NO_STACK(name, type) \
     185    do \
     186    { \
     187        RTTestISub(#name); \
     188        DO_SIMPLE_TEST_NO_SUB_NO_STACK(tst ## name ## Worker, type); \
    178189    } while (0)
    179190
     
    10221033}
    10231034
     1035#ifdef RTASM_HAVE_READ_U128
     1036# define TEST_READ_128_EX(a_pVar, a_szFunction, a_CallExpr, a_u64ValHi, a_u64ValLo) do { \
     1037        a_pVar->s.Hi = a_u64ValHi; \
     1038        a_pVar->s.Lo = a_u64ValLo; \
     1039        RTUINT128U uRet; \
     1040        a_CallExpr; \
     1041        if (uRet.s.Lo != a_u64ValLo || uRet.s.Hi != a_u64ValHi) \
     1042            RTTestFailed(g_hTest, "%s, %d: " a_szFunction ": expected %#RX64'%016RX64 got %#RX64'%016RX64\n", \
     1043                         __FUNCTION__, __LINE__, a_u64ValHi, a_u64ValLo, uRet.s.Hi, uRet.s.Lo); \
     1044        CHECKVAL128(a_pVar, a_u64ValHi, a_u64ValLo); \
     1045    } while (0)
     1046
     1047# define TEST_READ_128U(a_pVar, a_Function, a_u64ValHi, a_u64ValLo) \
     1048    TEST_READ_128_EX(a_pVar, #a_Function, uRet = a_Function(a_pVar), a_u64ValHi, a_u64ValLo)
     1049# define TEST_READ_128(a_pVar, a_Function, a_u64ValHi, a_u64ValLo) \
     1050    TEST_READ_128_EX(a_pVar, #a_Function, uRet.u = a_Function(&a_pVar->u), a_u64ValHi, a_u64ValLo)
     1051
     1052# define TEST_ATOMIC_READ_U128_TMPL(a_TestMacro, a_fn) \
     1053    DECLINLINE(void) tst ## a_fn ## Worker(RTUINT128U volatile *pu128) \
     1054    { \
     1055        a_TestMacro(pu128, a_fn, 0,                                                       0); \
     1056        a_TestMacro(pu128, a_fn, 19983,                                               20245); \
     1057        a_TestMacro(pu128, a_fn, UINT16_MAX,                                      INT16_MAX); \
     1058        a_TestMacro(pu128, a_fn, INT16_MAX,                                      UINT16_MAX); \
     1059        a_TestMacro(pu128, a_fn, UINT32_MAX,                                      INT32_MAX); \
     1060        a_TestMacro(pu128, a_fn, INT32_MAX,                                      UINT32_MAX); \
     1061        a_TestMacro(pu128, a_fn, UINT64_MAX,                                      INT64_MAX); \
     1062        a_TestMacro(pu128, a_fn, INT64_MAX,                                      UINT64_MAX); \
     1063        a_TestMacro(pu128, a_fn, UINT64_C(0xb5a23edcc258ad0a), UINT64_C(0xaf88507eceb58580)); \
     1064        a_TestMacro(pu128, a_fn, UINT64_C(0x5dc7d02e4e474fdb), UINT64_C(0x132b375f2b60f4b6)); \
     1065    }
     1066
     1067TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128,   ASMAtomicReadU128)
     1068TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128,   ASMAtomicUoReadU128)
     1069
     1070TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128U,  ASMAtomicReadU128U)
     1071TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128U,  ASMAtomicUoReadU128U)
     1072
     1073#endif
     1074
    10241075
    10251076static void tstASMAtomicRead(void)
     
    10361087    DO_SIMPLE_TEST(ASMAtomicReadU64, uint64_t);
    10371088    DO_SIMPLE_TEST(ASMAtomicUoReadU64, uint64_t);
     1089
     1090#ifdef RTASM_HAVE_READ_U128
     1091    DO_SIMPLE_TEST_NO_STACK(ASMAtomicReadU128, RTUINT128U);
     1092    DO_SIMPLE_TEST_NO_STACK(ASMAtomicReadU128U, RTUINT128U);
     1093
     1094    DO_SIMPLE_TEST_NO_STACK(ASMAtomicUoReadU128, RTUINT128U);
     1095    DO_SIMPLE_TEST_NO_STACK(ASMAtomicUoReadU128U, RTUINT128U);
     1096#endif
    10381097}
    10391098
     
    12771336}
    12781337
     1338#ifdef RTASM_HAVE_WRITE_U128
     1339
     1340# define TEST_WRITE_128(a_pVar, a_Function, a_HiVal, a_LoVal) do { \
     1341        RTUINT128U uValTmp; \
     1342        a_Function(&a_pVar->u, (uValTmp = RTUINT128_INIT(a_HiVal, a_LoVal)).u); \
     1343        CHECKVAL128(a_pVar, a_HiVal, a_LoVal); \
     1344    } while (0)
     1345
     1346# define TEST_WRITE_128U(a_pVar, a_Function, a_HiVal, a_LoVal) do { \
     1347        RTUINT128U uValTmp; \
     1348        a_Function(a_pVar, uValTmp = RTUINT128_INIT(a_HiVal, a_LoVal)); \
     1349        CHECKVAL128(a_pVar, a_HiVal, a_LoVal); \
     1350    } while (0)
     1351
     1352# define TEST_WRITE_128v2(a_pVar, a_Function, a_HiVal, a_LoVal) \
     1353    do { a_Function(&a_pVar->u, a_HiVal, a_LoVal); CHECKVAL128(a_pVar, a_HiVal, a_LoVal); } while (0)
     1354
     1355#define TEST_ATOMIC_WRITE_U128_TMPL(a_TestMacro, a_fn) \
     1356    DECLINLINE(void) tst ## a_fn ## Worker(RTUINT128U volatile *pu128) \
     1357    { \
     1358        a_TestMacro(pu128, a_fn, 0,                                                       0); \
     1359        a_TestMacro(pu128, a_fn, 19983,                                               20245); \
     1360        a_TestMacro(pu128, a_fn, UINT16_MAX,                                      INT16_MAX); \
     1361        a_TestMacro(pu128, a_fn, INT16_MAX,                                      UINT16_MAX); \
     1362        a_TestMacro(pu128, a_fn, UINT32_MAX,                                      INT32_MAX); \
     1363        a_TestMacro(pu128, a_fn, INT32_MAX,                                      UINT32_MAX); \
     1364        a_TestMacro(pu128, a_fn, UINT64_MAX,                                      INT64_MAX); \
     1365        a_TestMacro(pu128, a_fn, INT64_MAX,                                      UINT64_MAX); \
     1366        a_TestMacro(pu128, a_fn, UINT64_C(0xb5a23edcc258ad0a), UINT64_C(0xaf88507eceb58580)); \
     1367        a_TestMacro(pu128, a_fn, UINT64_C(0x5dc7d02e4e474fdb), UINT64_C(0x132b375f2b60f4b6)); \
     1368    }
     1369
     1370TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128,   ASMAtomicWriteU128)
     1371TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128,   ASMAtomicUoWriteU128)
     1372
     1373TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128U,  ASMAtomicWriteU128U)
     1374TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128U,  ASMAtomicUoWriteU128U)
     1375
     1376TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128v2, ASMAtomicWriteU128v2)
     1377TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128v2, ASMAtomicUoWriteU128v2)
     1378
     1379#endif /* RTASM_HAVE_WRITE_U128 */
     1380
    12791381static void tstASMAtomicWrite(void)
    12801382{
     
    12901392    DO_SIMPLE_TEST(ASMAtomicWriteU64, uint64_t);
    12911393    DO_SIMPLE_TEST(ASMAtomicUoWriteU64, uint64_t);
     1394
     1395#ifdef RTASM_HAVE_WRITE_U128
     1396    /* Not doing stack here, as it won't be necessarily correctly aligned for cmpxchg16b on MSC. */
     1397    DO_SIMPLE_TEST_NO_STACK(ASMAtomicWriteU128,   RTUINT128U);
     1398    DO_SIMPLE_TEST_NO_STACK(ASMAtomicWriteU128U,  RTUINT128U);
     1399    DO_SIMPLE_TEST_NO_STACK(ASMAtomicWriteU128v2, RTUINT128U);
     1400
     1401    DO_SIMPLE_TEST_NO_STACK(ASMAtomicUoWriteU128,   RTUINT128U);
     1402    DO_SIMPLE_TEST_NO_STACK(ASMAtomicUoWriteU128U,  RTUINT128U);
     1403    DO_SIMPLE_TEST_NO_STACK(ASMAtomicUoWriteU128v2, RTUINT128U);
     1404#endif
    12921405}
    12931406
     
    30803193    BENCH(ASMAtomicUoReadU64(&s_u64),            "ASMAtomicUoReadU64");
    30813194    BENCH(ASMAtomicUoReadS64(&s_i64),            "ASMAtomicUoReadS64");
     3195#ifdef RTASM_HAVE_READ_U128
     3196    if (fHaveCmpXchg128)
     3197    {
     3198        BENCH(ASMAtomicUoReadU128(&s_u128.u),    "ASMAtomicUoReadU128");
     3199        BENCH(ASMAtomicUoReadU128U(&s_u128),     "ASMAtomicUoReadU128U");
     3200    }
     3201#endif
    30823202    BENCH(ASMAtomicReadU8(&s_u8),                "ASMAtomicReadU8");
    30833203    BENCH(ASMAtomicReadS8(&s_i8),                "ASMAtomicReadS8");
     
    30883208    BENCH(ASMAtomicReadU64(&s_u64),              "ASMAtomicReadU64");
    30893209    BENCH(ASMAtomicReadS64(&s_i64),              "ASMAtomicReadS64");
     3210#ifdef RTASM_HAVE_READ_U128
     3211    if (fHaveCmpXchg128)
     3212    {
     3213        BENCH(ASMAtomicReadU128(&s_u128.u),      "ASMAtomicReadU128");
     3214        BENCH(ASMAtomicReadU128U(&s_u128),       "ASMAtomicReadU128U");
     3215    }
     3216#endif
    30903217    BENCH(ASMAtomicUoWriteU8(&s_u8, 0),          "ASMAtomicUoWriteU8");
    30913218    BENCH(ASMAtomicUoWriteS8(&s_i8, 0),          "ASMAtomicUoWriteS8");
     
    30963223    BENCH(ASMAtomicUoWriteU64(&s_u64, 0),        "ASMAtomicUoWriteU64");
    30973224    BENCH(ASMAtomicUoWriteS64(&s_i64, 0),        "ASMAtomicUoWriteS64");
     3225#ifdef RTASM_HAVE_WRITE_U128
     3226    if (fHaveCmpXchg128)
     3227    {
     3228        BENCH(ASMAtomicUoWriteU128(&s_u128.u, (u128Tmp1 = RTUINT128_INIT_C(0, 0)).u),   "ASMAtomicUoWriteU128");
     3229        BENCH(ASMAtomicUoWriteU128v2(&s_u128.u, 0, 0),                                  "ASMAtomicUoWriteU128v2");
     3230        BENCH(ASMAtomicUoWriteU128U(&s_u128, u128Tmp1 = RTUINT128_INIT_C(0, 0)),        "ASMAtomicUoWriteU128U");
     3231    }
     3232#endif
    30983233    BENCH(ASMAtomicWriteU8(&s_u8, 0),            "ASMAtomicWriteU8");
    30993234    BENCH(ASMAtomicWriteS8(&s_i8, 0),            "ASMAtomicWriteS8");
     
    31043239    BENCH(ASMAtomicWriteU64(&s_u64, 0),          "ASMAtomicWriteU64");
    31053240    BENCH(ASMAtomicWriteS64(&s_i64, 0),          "ASMAtomicWriteS64");
     3241#ifdef RTASM_HAVE_WRITE_U128
     3242    if (fHaveCmpXchg128)
     3243    {
     3244        BENCH(ASMAtomicWriteU128(&s_u128.u, (u128Tmp1 = RTUINT128_INIT_C(0, 0)).u), "ASMAtomicWriteU128");
     3245        BENCH(ASMAtomicWriteU128v2(&s_u128.u, 0, 0),                                "ASMAtomicWriteU128v2");
     3246        BENCH(ASMAtomicWriteU128U(&s_u128, u128Tmp1 = RTUINT128_INIT_C(0, 0)),      "ASMAtomicWriteU128U");
     3247    }
     3248#endif
    31063249    BENCH(ASMAtomicXchgU8(&s_u8, 0),             "ASMAtomicXchgU8");
    31073250    BENCH(ASMAtomicXchgS8(&s_i8, 0),             "ASMAtomicXchgS8");
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