Commit 3176c1f
perf(wcscmp): portable-SIMD wide compare for wcscmp/wcsncmp (bd-2g7oyh.366)
wcscmp/wcsncmp compared wchar_t (u32) one element at a time. Add
scan_wcscmp_simd: a fused 8-lane Simd<u32,8> compare — equal-and-NUL-free
32-byte windows advance 8 elements, others resolve element-wise (byte-identical
to the scalar loop incl. shared-NUL=>0 and signed wchar_t ordering). Dual
pointers can't be pre-aligned, so each 32-byte vector load is page-cross guarded
(wide32_read_within_page, (addr & 0xFFF) <= 4064); 8 lanes per window amortise
that guard cost — unlike a 2-lane u64-SWAR, which lost to scalar last session.
Raw [u32;8] array loads (4-byte aligned, never a Rust slice over C memory),
matching wcschr. wcsncmp keeps the nuanced adverse-only-on-membrane-clamp logic.
Measured (rch, median ns/op, equal wide strings full scan):
wchars old(ns) new(ns) glibc(ns) self vs-glibc
64 22.5 9.1 17.8 2.48x 1.96x
256 67.5 28.9 36.7 2.34x 1.27x
1024 332.6 131.4 176.2 2.53x 1.34x
4096 1042.5 542.0 463.8 1.92x 0.86x
65536 19377.4 9555.5 7843.3 2.03x 0.82x
Self-speedup 1.66-2.53x (>=2.0 for n in {64,256,1024,16384,65536}); beats glibc
for the common short/mid strings (<=1024 + 16384) and closes the gap at large
sizes (old was 0.44x glibc at 4096; new 0.86x — the portable-SIMD vs hand-AVX2
ceiling, same as memcmp).
Parity: conformance_diff_wcscmp.rs sign-matches host glibc wcscmp/wcsncmp across
50k+ pairs + a guard-page over-read test. Twelfth ABI string-vein win.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>1 parent e555616 commit 3176c1f
2 files changed
Lines changed: 187 additions & 48 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
534 | 534 | | |
535 | 535 | | |
536 | 536 | | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
537 | 613 | | |
538 | 614 | | |
539 | 615 | | |
| |||
575 | 651 | | |
576 | 652 | | |
577 | 653 | | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
578 | 657 | | |
579 | | - | |
580 | | - | |
581 | | - | |
582 | | - | |
583 | | - | |
584 | | - | |
585 | | - | |
586 | | - | |
587 | | - | |
588 | | - | |
589 | | - | |
590 | | - | |
591 | | - | |
592 | | - | |
593 | | - | |
594 | | - | |
595 | | - | |
596 | | - | |
597 | | - | |
598 | | - | |
599 | | - | |
600 | | - | |
| 658 | + | |
| 659 | + | |
601 | 660 | | |
602 | 661 | | |
603 | 662 | | |
| |||
653 | 712 | | |
654 | 713 | | |
655 | 714 | | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
656 | 719 | | |
657 | | - | |
658 | | - | |
659 | | - | |
660 | | - | |
661 | | - | |
662 | | - | |
663 | | - | |
664 | | - | |
665 | | - | |
666 | | - | |
667 | | - | |
668 | | - | |
669 | | - | |
670 | | - | |
671 | | - | |
672 | | - | |
673 | | - | |
674 | | - | |
675 | | - | |
676 | | - | |
677 | | - | |
678 | | - | |
679 | | - | |
680 | | - | |
681 | | - | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
682 | 724 | | |
683 | 725 | | |
684 | 726 | | |
| |||
692 | 734 | | |
693 | 735 | | |
694 | 736 | | |
| 737 | + | |
695 | 738 | | |
696 | 739 | | |
697 | 740 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
19 | 38 | | |
20 | 39 | | |
21 | 40 | | |
| 41 | + | |
| 42 | + | |
22 | 43 | | |
23 | 44 | | |
24 | 45 | | |
| |||
39 | 60 | | |
40 | 61 | | |
41 | 62 | | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
42 | 82 | | |
43 | 83 | | |
44 | 84 | | |
| |||
549 | 589 | | |
550 | 590 | | |
551 | 591 | | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
552 | 648 | | |
0 commit comments