@@ -3223,8 +3223,8 @@ SZ_PUBLIC sz_bool_t sz_utf8_case_agnostic_ice(sz_cptr_t str, sz_size_t length) {
32233223 __m512i data = _mm512_maskz_loadu_epi8 (load_mask , ptr );
32243224
32253225 // 1. ASCII letter check (zeros beyond string are fine - not letters)
3226- __mmask64 is_upper = _mm512_cmp_epu8_mask (_mm512_sub_epi8 (data , a_upper_vec ), z26_vec , _MM_CMPINT_LT );
3227- __mmask64 is_lower = _mm512_cmp_epu8_mask (_mm512_sub_epi8 (data , a_lower_vec ), z26_vec , _MM_CMPINT_LT );
3226+ __mmask64 is_upper = _mm512_cmplt_epu8_mask (_mm512_sub_epi8 (data , a_upper_vec ), z26_vec );
3227+ __mmask64 is_lower = _mm512_cmplt_epu8_mask (_mm512_sub_epi8 (data , a_lower_vec ), z26_vec );
32283228 if (is_upper | is_lower ) return sz_false_k ;
32293229
32303230 // 2. Check for non-ASCII in lead positions
@@ -3250,8 +3250,8 @@ SZ_PUBLIC sz_bool_t sz_utf8_case_agnostic_ice(sz_cptr_t str, sz_size_t length) {
32503250 // C3-CF: Latin Extended (umlauts, accents, Eszett)
32513251 // D0-D1: Cyrillic, D4-D6: Armenian (D6 needed for small letters U+0580+)
32523252 if (is_two ) {
3253- __mmask64 is_bicameral = _mm512_cmp_epu8_mask ( //
3254- _mm512_sub_epi8 (data , xc3_vec ), _mm512_set1_epi8 (0x14 ), _MM_CMPINT_LT );
3253+ __mmask64 is_bicameral = _mm512_cmplt_epu8_mask ( //
3254+ _mm512_sub_epi8 (data , xc3_vec ), _mm512_set1_epi8 (0x14 ));
32553255
32563256 // Special case: C2 B5 = U+00B5 MICRO SIGN folds to Greek mu (U+03BC)
32573257 __mmask64 is_c2 = _mm512_cmpeq_epi8_mask (data , _mm512_set1_epi8 ((char )0xC2 )) & is_two ;
@@ -3266,7 +3266,7 @@ SZ_PUBLIC sz_bool_t sz_utf8_case_agnostic_ice(sz_cptr_t str, sz_size_t length) {
32663266 __mmask64 is_ca = _mm512_cmpeq_epi8_mask (data , _mm512_set1_epi8 ((char )0xCA )) & is_two ;
32673267 if (is_ca ) {
32683268 __mmask64 ca_sec = is_ca << 1 ; // positions of second bytes after CA
3269- __mmask64 is_ge_b0 = _mm512_cmp_epu8_mask (data , _mm512_set1_epi8 ((char )0xB0 ), _MM_CMPINT_NLT );
3269+ __mmask64 is_ge_b0 = _mm512_cmpge_epu8_mask (data , _mm512_set1_epi8 ((char )0xB0 ));
32703270 // If second byte >= B0, exclude this CA from bicameral
32713271 __mmask64 exclude_ca = ((ca_sec & is_ge_b0 ) >> 1 ) & is_ca ;
32723272 is_bicameral &= ~exclude_ca ;
@@ -3289,19 +3289,19 @@ SZ_PUBLIC sz_bool_t sz_utf8_case_agnostic_ice(sz_cptr_t str, sz_size_t length) {
32893289 __mmask64 is_e2 = _mm512_cmpeq_epi8_mask (data , _mm512_set1_epi8 ((char )0xE2 )) & is_three ;
32903290 if (is_e2 ) {
32913291 __mmask64 e2_sec = is_e2 << 1 ;
3292- __mmask64 safe = _mm512_cmp_epu8_mask ( //
3293- _mm512_sub_epi8 (data , x80_vec ), _mm512_set1_epi8 (0x04 ), _MM_CMPINT_LT );
3292+ __mmask64 safe = _mm512_cmplt_epu8_mask ( //
3293+ _mm512_sub_epi8 (data , x80_vec ), _mm512_set1_epi8 (0x04 ));
32943294 if (e2_sec & ~safe ) return sz_false_k ;
32953295 }
32963296
32973297 // EA: Bicameral second bytes 99-9F, AD-AE
32983298 __mmask64 is_ea = _mm512_cmpeq_epi8_mask (data , _mm512_set1_epi8 ((char )0xEA )) & is_three ;
32993299 if (is_ea ) {
33003300 __mmask64 ea_sec = is_ea << 1 ;
3301- __mmask64 is_99 = _mm512_cmp_epu8_mask ( //
3302- _mm512_sub_epi8 (data , _mm512_set1_epi8 ((char )0x99 )), _mm512_set1_epi8 (0x07 ), _MM_CMPINT_LT );
3303- __mmask64 is_ad = _mm512_cmp_epu8_mask ( //
3304- _mm512_sub_epi8 (data , _mm512_set1_epi8 ((char )0xAD )), _mm512_set1_epi8 (0x02 ), _MM_CMPINT_LT );
3301+ __mmask64 is_99 = _mm512_cmplt_epu8_mask ( //
3302+ _mm512_sub_epi8 (data , _mm512_set1_epi8 ((char )0x99 )), _mm512_set1_epi8 (0x07 ));
3303+ __mmask64 is_ad = _mm512_cmplt_epu8_mask ( //
3304+ _mm512_sub_epi8 (data , _mm512_set1_epi8 ((char )0xAD )), _mm512_set1_epi8 (0x02 ));
33053305 if (ea_sec & (is_99 | is_ad )) return sz_false_k ;
33063306 }
33073307 }
@@ -4856,7 +4856,7 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_western_europe_( //
48564856 // - E2 84 AA: 'K' (U+212A Kelvin Sign) → 'k' (3 bytes → 1 byte)
48574857 // - EF AC 80-86: 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st' (ligatures) → 2-3 bytes
48584858 // - C5 BF: 'ſ' (U+017F Long S) → 's' (2 bytes → 1 byte)
4859- sz_u512_vec_t x_e1_vec , x_e2_vec , x_ef_vec , x_c5_vec ;
4859+ sz_u512_vec_t x_e1_vec , x_e2_vec , x_ef_vec , x_c5_vec , x_ce_vec ;
48604860 sz_u512_vec_t x_ba_vec , x_84_vec , x_ac_vec , x_bf_vec ;
48614861 x_e1_vec .zmm = _mm512_set1_epi8 ((char )0xE1 ); // for 'ẞ'
48624862 x_e2_vec .zmm = _mm512_set1_epi8 ((char )0xE2 ); // for 'K'
@@ -4866,6 +4866,7 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_western_europe_( //
48664866 x_84_vec .zmm = _mm512_set1_epi8 ((char )0x84 ); // 2nd byte of 'K'
48674867 x_ac_vec .zmm = _mm512_set1_epi8 ((char )0xAC ); // 2nd byte of ligatures
48684868 x_bf_vec .zmm = _mm512_set1_epi8 ((char )0xBF ); // 2nd byte of 'ſ'
4869+ x_ce_vec .zmm = _mm512_set1_epi8 ((char )0xCE ); // Greek uppercase (CE 9x folds to same target as µ)
48694870
48704871 sz_u512_vec_t haystack_vec ;
48714872 sz_cptr_t haystack_ptr = haystack ;
@@ -4896,8 +4897,9 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_western_europe_( //
48964897 __mmask64 x_e2_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_e2_vec .zmm );
48974898 __mmask64 x_ef_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_ef_vec .zmm );
48984899 __mmask64 x_c5_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_c5_vec .zmm );
4900+ __mmask64 x_ce_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_ce_vec .zmm );
48994901
4900- if (x_e1_mask | x_e2_mask | x_ef_mask | x_c5_mask ) {
4902+ if (x_e1_mask | x_e2_mask | x_ef_mask | x_c5_mask | x_ce_mask ) {
49014903 __mmask64 x_ba_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_ba_vec .zmm );
49024904 __mmask64 x_84_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_84_vec .zmm );
49034905 __mmask64 x_ac_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_ac_vec .zmm );
@@ -4906,7 +4908,8 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_western_europe_( //
49064908 __mmask64 danger_mask = ((x_e1_mask << 1 ) & x_ba_mask ) | // ẞ (E1 BA 9E)
49074909 ((x_e2_mask << 1 ) & x_84_mask ) | // K (E2 84 AA)
49084910 ((x_ef_mask << 1 ) & x_ac_mask ) | // fi, fl (EF AC xx)
4909- ((x_c5_mask << 1 ) & x_bf_mask ); // ſ (C5 BF)
4911+ ((x_c5_mask << 1 ) & x_bf_mask ) | // ſ (C5 BF)
4912+ x_ce_mask ; // Greek (CE xx) for µ→μ
49104913
49114914 if (danger_mask & valid_mask ) {
49124915 sz_cptr_t match = sz_utf8_case_insensitive_find_in_danger_zone_ ( //
@@ -5127,7 +5130,7 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_central_europe_( //
51275130 ((x_c5_mask << 1 ) & x_bf_mask ) | // ſ
51285131 ((x_ef_mask << 1 ) & x_ac_mask ); // Ligatures
51295132
5130- if (danger_mask & valid_mask ) {
5133+ if (danger_mask ) {
51315134 sz_cptr_t match = sz_utf8_case_insensitive_find_in_danger_zone_ ( //
51325135 haystack , haystack_length , needle , needle_length , //
51335136 haystack_ptr , valid_starts , //
@@ -5569,7 +5572,7 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_armenian_( //
55695572
55705573 __mmask64 danger_mask = x_ech_yiwn | x_ef_ac ;
55715574
5572- if (( danger_mask >> 1 ) & valid_mask ) {
5575+ if (danger_mask ) {
55735576 sz_cptr_t match = sz_utf8_case_insensitive_find_in_danger_zone_ ( //
55745577 haystack , haystack_length , needle , needle_length , //
55755578 haystack_ptr , valid_starts , //
@@ -5797,14 +5800,16 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_greek_( //
57975800 // - C2 B5: Micro Sign 'µ' -> 'μ' (CE BC)
57985801 // - E2 84 A6: Ohm Sign 'Ω' -> 'ω' (CF 89) (detect E2 84 prefix)
57995802 // - E1 xx xx: Polytonic Greek (excluded by safety profile, but just in case)
5800- sz_u512_vec_t x_ce_vec , x_cf_vec , x_c2_vec , x_e2_vec ;
5803+ sz_u512_vec_t x_ce_vec , x_cf_vec , x_c2_vec , x_e1_vec , x_e2_vec , x_cd_vec ;
58015804 sz_u512_vec_t x_90_vec , x_b0_vec , x_84_vec ;
58025805 sz_u512_vec_t x_91_vec , x_95_vec , x_96_vec , x_b1_vec , x_b5_vec ;
58035806
58045807 x_ce_vec .zmm = _mm512_set1_epi8 ((char )0xCE );
58055808 x_cf_vec .zmm = _mm512_set1_epi8 ((char )0xCF );
58065809 x_c2_vec .zmm = _mm512_set1_epi8 ((char )0xC2 );
5810+ x_e1_vec .zmm = _mm512_set1_epi8 ((char )0xE1 ); // E1 lead byte (Polytonic)
58075811 x_e2_vec .zmm = _mm512_set1_epi8 ((char )0xE2 );
5812+ x_cd_vec .zmm = _mm512_set1_epi8 ((char )0xCD ); // CD lead byte (Combining Diacritics)
58085813
58095814 x_90_vec .zmm = _mm512_set1_epi8 ((char )0x90 );
58105815 x_b0_vec .zmm = _mm512_set1_epi8 ((char )0xB0 );
@@ -5845,8 +5850,10 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_greek_( //
58455850 __mmask64 x_cf_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_cf_vec .zmm );
58465851 __mmask64 x_c2_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_c2_vec .zmm );
58475852 __mmask64 x_e2_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_e2_vec .zmm );
5853+ __mmask64 x_e1_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_e1_vec .zmm );
5854+ __mmask64 x_cd_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_cd_vec .zmm );
58485855
5849- if (x_ce_mask | x_cf_mask | x_c2_mask | x_e2_mask ) {
5856+ if (x_ce_mask | x_cf_mask | x_c2_mask | x_e2_mask | x_e1_mask | x_cd_mask ) {
58505857 __mmask64 x_90_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_90_vec .zmm );
58515858 __mmask64 x_b0_mask = _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_b0_vec .zmm );
58525859 __mmask64 x_be_ce_90_b0 = (x_ce_mask << 1 ) & (x_90_mask | x_b0_mask ); // CE 90 or CE B0
@@ -5864,10 +5871,11 @@ SZ_INTERNAL sz_cptr_t sz_utf8_case_insensitive_find_ice_greek_( //
58645871
58655872 __mmask64 x_micro = (x_c2_mask << 1 ) & x_bx_mask ; // C2 B5 (B5 is in bx_mask)
58665873 __mmask64 x_ohm = (x_e2_mask << 1 ) & _mm512_cmpeq_epi8_mask (haystack_vec .zmm , x_84_vec .zmm );
5874+ // E1 is always dangerous in Greek path (Polytonic/Extensions)
5875+ // CD is dangerous (Combining Diacritical Marks)
5876+ __mmask64 danger_mask = x_be_ce_90_b0 | x_be_cf_sym | x_micro | x_ohm | x_e1_mask | x_cd_mask ;
58675877
5868- __mmask64 danger_mask = x_be_ce_90_b0 | x_be_cf_sym | x_micro | x_ohm ;
5869-
5870- if ((danger_mask >> 1 ) & valid_mask ) {
5878+ if (danger_mask ) {
58715879 sz_cptr_t match = sz_utf8_case_insensitive_find_in_danger_zone_ ( //
58725880 haystack , haystack_length , needle , needle_length , //
58735881 haystack_ptr , valid_starts , //
0 commit comments