/* * Copyright (C) 2007 Michael Lewis * Author: Mike Lewis * * This work is provide AS IS, and has no warranty. * The author is NOT responsible for anything that happens * due to use of this code, either using it or running it on * your system */ #ifndef _FAKE_SSE_INCLUDED #define _FAKE_SSE_INCLUDED #ifndef __SSE2__ #include #include #ifdef __APPLE__ #include #endif /* typedef struct { union { unsigned char byte[16]; uint32_t int32[4]; } u; } __m128i; */ //Shifts this to the left all the way static inline __m128i _mm_srli_epi32( __m128i A, int count ) { //printf("_mm_srli_epi32\n"); int i; for( i = 0; i < 4; i++ ) { A.u.int32[i] = A.u.int32[i] >> count; } return A; } static inline __m128i _mm_slli_epi32( __m128i A, int count ) { //printf("_mm_slli_epi32\n"); int i; for( i = 0; i < 4; i++ ) { A.u.int32[i] = A.u.int32[i] << count; } return A; } static inline __m128i _mm_slli_si128( __m128i A, int imm ) { //printf("_mm_srli_si128\n"); int i; __m128i ret; for( i = imm; i < 16; i++ ) { ret.u.byte[i] = A.u.byte[i-imm]; } for( i = 0; i < imm; i++ ) { ret.u.byte[i] = 0x00; } return ret; } static inline __m128i _mm_srli_si128( __m128i A, int imm ) { //printf("_mm_slli_si128\n"); int i; __m128i ret; for( i = 0; i < 16-imm; i++ ) { ret.u.byte[i] = A.u.byte[i+imm]; } for( i = 16-imm; i < 16; i++ ) { ret.u.byte[i] = 0x00; } return ret; } static inline __m128i _mm_setzero_si128() { //printf("_mm_setzero_si128\n"); __m128i r; memset( &r, 0, sizeof( r )); return r; } static inline __m128i _mm_cmpeq_epi8( __m128i A, __m128i B ) { //printf("_mm_cmpeq_epi8\n"); __m128i ret; int i; for( i = 0; i < 16; i++ ) { ret.u.byte[i] = ( A.u.byte[i] == B.u.byte[i] ) ? 0xFF : 0x00; } return ret; } static inline __m128i _mm_add_epi8( __m128i A, __m128i B ) { //printf("_mm_add_epi8\n"); __m128i ret; int i; for( i = 0; i < 16; i++ ) { ret.u.byte[i] = A.u.byte[i] + B.u.byte[i]; } return ret; } static inline __m128i _mm_set_epi8 (char __q15, char __q14, char __q13, char __q12, char __q11, char __q10, char __q09, char __q08, char __q07, char __q06, char __q05, char __q04, char __q03, char __q02, char __q01, char __q00) { //printf("_mm_set_epi8 \n"); __m128i ret; ret.u.byte[15] = __q15; ret.u.byte[14] = __q14; ret.u.byte[13] = __q13; ret.u.byte[12] = __q12; ret.u.byte[11] = __q11; ret.u.byte[10] = __q10; ret.u.byte[9] = __q09; ret.u.byte[8] = __q08; ret.u.byte[7] = __q07; ret.u.byte[6] = __q06; ret.u.byte[5] = __q05; ret.u.byte[4] = __q04; ret.u.byte[3] = __q03; ret.u.byte[2] = __q02; ret.u.byte[1] = __q01; ret.u.byte[0] = __q00; return ret; } static inline __m128i _mm_set1_epi8 ( char f ) { //printf("_mm_set1_epi8 \n"); int i; __m128i ret; for( i = 0; i < 16; i++ ) { ret.u.byte[i] = f; } return ret; } static inline __m128i _mm_and_si128( __m128i A, __m128i B ) { //printf("_mm_and_si128\n"); __m128i ret; int i; for( i = 0; i < 4; i++ ) { ret.u.int32[i] = A.u.int32[i] & B.u.int32[i]; } return ret; } static inline __m128i _mm_or_si128( __m128i A, __m128i B ) { //printf("_mm_or_si128\n"); __m128i ret; int i; for( i = 0; i < 4; i++ ) { ret.u.int32[i] = A.u.int32[i] | B.u.int32[i]; } return ret; } #endif #endif //_FAKE_SSE_INCLUDED