| 292 | } |
| 293 | |
| 294 | uint64 CheckSolid( const uint8* src ) |
| 295 | { |
| 296 | #ifdef __SSE4_1__ |
| 297 | __m128i d0 = _mm_loadu_si128(((__m128i*)src) + 0); |
| 298 | __m128i d1 = _mm_loadu_si128(((__m128i*)src) + 1); |
| 299 | __m128i d2 = _mm_loadu_si128(((__m128i*)src) + 2); |
| 300 | __m128i d3 = _mm_loadu_si128(((__m128i*)src) + 3); |
| 301 | |
| 302 | __m128i c = _mm_shuffle_epi32(d0, _MM_SHUFFLE(0, 0, 0, 0)); |
| 303 | |
| 304 | __m128i c0 = _mm_cmpeq_epi8(d0, c); |
| 305 | __m128i c1 = _mm_cmpeq_epi8(d1, c); |
| 306 | __m128i c2 = _mm_cmpeq_epi8(d2, c); |
| 307 | __m128i c3 = _mm_cmpeq_epi8(d3, c); |
| 308 | |
| 309 | __m128i m0 = _mm_and_si128(c0, c1); |
| 310 | __m128i m1 = _mm_and_si128(c2, c3); |
| 311 | __m128i m = _mm_and_si128(m0, m1); |
| 312 | |
| 313 | if (!_mm_testc_si128(m, _mm_set1_epi32(-1))) |
| 314 | { |
| 315 | return 0; |
| 316 | } |
| 317 | #else |
| 318 | const uint8* ptr = src + 4; |
| 319 | for( int i=1; i<16; i++ ) |
| 320 | { |
| 321 | if( memcmp( src, ptr, 4 ) != 0 ) |
| 322 | { |
| 323 | return 0; |
| 324 | } |
| 325 | ptr += 4; |
| 326 | } |
| 327 | #endif |
| 328 | return 0x02000000 | |
| 329 | ( uint( src[0] & 0xF8 ) << 16 ) | |
| 330 | ( uint( src[1] & 0xF8 ) << 8 ) | |
| 331 | ( uint( src[2] & 0xF8 ) ); |
| 332 | } |
| 333 | |
| 334 | void PrepareAverages( v4i a[8], const uint8* src, uint err[4] ) |
| 335 | { |