Changeset 104795 in vbox for trunk/src/VBox/Runtime
- Timestamp:
- May 27, 2024 8:08:37 PM (9 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/tstRTInlineAsm.cpp
r103354 r104795 176 176 RTTestISub(#name); \ 177 177 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); \ 178 189 } while (0) 179 190 … … 1022 1033 } 1023 1034 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 1067 TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128, ASMAtomicReadU128) 1068 TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128, ASMAtomicUoReadU128) 1069 1070 TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128U, ASMAtomicReadU128U) 1071 TEST_ATOMIC_READ_U128_TMPL(TEST_READ_128U, ASMAtomicUoReadU128U) 1072 1073 #endif 1074 1024 1075 1025 1076 static void tstASMAtomicRead(void) … … 1036 1087 DO_SIMPLE_TEST(ASMAtomicReadU64, uint64_t); 1037 1088 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 1038 1097 } 1039 1098 … … 1277 1336 } 1278 1337 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 1370 TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128, ASMAtomicWriteU128) 1371 TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128, ASMAtomicUoWriteU128) 1372 1373 TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128U, ASMAtomicWriteU128U) 1374 TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128U, ASMAtomicUoWriteU128U) 1375 1376 TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128v2, ASMAtomicWriteU128v2) 1377 TEST_ATOMIC_WRITE_U128_TMPL(TEST_WRITE_128v2, ASMAtomicUoWriteU128v2) 1378 1379 #endif /* RTASM_HAVE_WRITE_U128 */ 1380 1279 1381 static void tstASMAtomicWrite(void) 1280 1382 { … … 1290 1392 DO_SIMPLE_TEST(ASMAtomicWriteU64, uint64_t); 1291 1393 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 1292 1405 } 1293 1406 … … 3080 3193 BENCH(ASMAtomicUoReadU64(&s_u64), "ASMAtomicUoReadU64"); 3081 3194 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 3082 3202 BENCH(ASMAtomicReadU8(&s_u8), "ASMAtomicReadU8"); 3083 3203 BENCH(ASMAtomicReadS8(&s_i8), "ASMAtomicReadS8"); … … 3088 3208 BENCH(ASMAtomicReadU64(&s_u64), "ASMAtomicReadU64"); 3089 3209 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 3090 3217 BENCH(ASMAtomicUoWriteU8(&s_u8, 0), "ASMAtomicUoWriteU8"); 3091 3218 BENCH(ASMAtomicUoWriteS8(&s_i8, 0), "ASMAtomicUoWriteS8"); … … 3096 3223 BENCH(ASMAtomicUoWriteU64(&s_u64, 0), "ASMAtomicUoWriteU64"); 3097 3224 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 3098 3233 BENCH(ASMAtomicWriteU8(&s_u8, 0), "ASMAtomicWriteU8"); 3099 3234 BENCH(ASMAtomicWriteS8(&s_i8, 0), "ASMAtomicWriteS8"); … … 3104 3239 BENCH(ASMAtomicWriteU64(&s_u64, 0), "ASMAtomicWriteU64"); 3105 3240 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 3106 3249 BENCH(ASMAtomicXchgU8(&s_u8, 0), "ASMAtomicXchgU8"); 3107 3250 BENCH(ASMAtomicXchgS8(&s_i8, 0), "ASMAtomicXchgS8");
Note:
See TracChangeset
for help on using the changeset viewer.