@@ -143,5 +143,16 @@ pub unsafe fn compare_bytes(a: *const u8, b: *const u8, n: usize) -> i32 {
143
143
let c8 = |a : * const u64 , b, n| cmp ( a, b, n, c4) ;
144
144
let c16 = |a : * const u128 , b, n| cmp ( a, b, n, c8) ;
145
145
let c32 = |a : * const [ u128 ; 2 ] , b, n| cmp ( a, b, n, c16) ;
146
- c32 ( a. cast ( ) , b. cast ( ) , n)
146
+ // [u128; 2] internally uses raw_eq for comparisons, which may emit a call to memcmp
147
+ // above a certain size threshold. When SSE2 is enabled this threshold does not seem
148
+ // to be reached but without SSE2 a call is emitted, leading to infinite recursion.
149
+ //
150
+ // While replacing [u128; 2] with (u128, u128) fixes the issues it degrades performance
151
+ // severely. Likewise, removing c32() has a lesser but still significant impact. Instead the
152
+ // [u128; 2] case is only enabled when SSE2 is present.
153
+ if cfg ! ( target_feature = "sse2" ) {
154
+ c32 ( a. cast ( ) , b. cast ( ) , n)
155
+ } else {
156
+ c16 ( a. cast ( ) , b. cast ( ) , n)
157
+ }
147
158
}
0 commit comments