1 /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
2 /* { dg-options "-msse4" } */
6 foo (const unsigned char *s1
, const unsigned char *s2
,
7 int bmsk
, __m128i frag2
)
10 char *p1
= (char *) s1
;
11 char *p2
= (char *) s2
;
12 __m128i frag1
, fruc1
, fruc2
, mask1
, mask2
;
14 if( !p2
[0]) return (char *) s1
;
15 if( !p1
[0] ) return NULL
;
16 if( p2
[1]) frag2
= load (p2
);
18 fruc1
= _mm_loadu_si128 ((__m128i
*) s1
);
19 fruc2
= _mm_loadu_si128 ((__m128i
*) s2
);
20 mask1
= _mm_cmpistrm(fruc1
, frag2
, 0x44);
21 mask2
= _mm_cmpistrm(fruc2
, frag1
, 0x14);
22 frag2
= _mm_blendv_epi8(frag2
, mask1
, mask2
);
23 frag1
= _mm_blendv_epi8(frag1
, mask2
, mask1
);
24 cmp_c
= _mm_cmpistrc(frag2
, frag1
, 0x0c);
25 cmp_s
= _mm_cmpistrs(frag2
, frag1
, 0x0c);
27 __asm("bsfl %[bmsk], %[len]" : [len
] "=r" (len
) : [bmsk
] "r" (bmsk
) );