Strategy 23: Advanced Integer Operations * * Tests SSSE3/SSE4.1 advanced integer intrinsics: * - _mm_minpos_epu16: horizontal minimum with position * - _mm_mulhrs_epi16: high-rounding multiply * - _mm_packus_epi32: 32-to-16 unsigned packing * - 64-bit insert/extract */
| 1444 | * - 64-bit insert/extract |
| 1445 | */ |
| 1446 | static void test_advanced_integer(const uint8_t *data, size_t size) |
| 1447 | { |
| 1448 | if (size < 32) |
| 1449 | return; |
| 1450 | |
| 1451 | __m128i a = _mm_loadu_si128((const __m128i *) data); |
| 1452 | __m128i b = _mm_loadu_si128((const __m128i *) (data + 16)); |
| 1453 | |
| 1454 | /* Horizontal minimum with position (SSE4.1) */ |
| 1455 | SINK_I128(_mm_minpos_epu16(a)); |
| 1456 | |
| 1457 | /* High-rounding multiply (SSSE3) */ |
| 1458 | SINK_I128(_mm_mulhrs_epi16(a, b)); |
| 1459 | |
| 1460 | /* 32-to-16 unsigned pack (SSE4.1) */ |
| 1461 | SINK_I128(_mm_packus_epi32(a, b)); |
| 1462 | |
| 1463 | /* 64-bit extract/insert (SSE4.1, 64-bit only) */ |
| 1464 | #if defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64) |
| 1465 | SINK_I64(_mm_extract_epi64(a, 0)); |
| 1466 | SINK_I64(_mm_extract_epi64(a, 1)); |
| 1467 | |
| 1468 | int64_t insert_val = |
| 1469 | get_u32(data, size, 0) | ((int64_t) get_u32(data, size, 4) << 32); |
| 1470 | SINK_I128(_mm_insert_epi64(a, insert_val, 0)); |
| 1471 | SINK_I128(_mm_insert_epi64(a, insert_val, 1)); |
| 1472 | #endif |
| 1473 | |
| 1474 | /* Edge cases for minpos */ |
| 1475 | __m128i all_max = _mm_set1_epi16((short) 0xFFFF); |
| 1476 | __m128i all_zero = _mm_setzero_si128(); |
| 1477 | SINK_I128(_mm_minpos_epu16(all_max)); |
| 1478 | SINK_I128(_mm_minpos_epu16(all_zero)); |
| 1479 | |
| 1480 | /* mulhrs edge cases */ |
| 1481 | __m128i max16 = _mm_set1_epi16((short) 0x7FFF); |
| 1482 | __m128i min16 = _mm_set1_epi16((short) 0x8000); |
| 1483 | SINK_I128(_mm_mulhrs_epi16(max16, max16)); |
| 1484 | SINK_I128(_mm_mulhrs_epi16(min16, min16)); |
| 1485 | SINK_I128(_mm_mulhrs_epi16(max16, min16)); |
| 1486 | } |
| 1487 | |
| 1488 | /* Strategy 24: Scalar Upper Lane Preservation |
| 1489 | * |
no test coverage detected