i got an assignment of converting an SIMD SSE instruction to equivalent C code… The Code is something like this
(I1_block_addr– is a uint8_t and esc_offset_1 is a 32 bit integer.)
__m128i xmm1 = _mm_load_si128((__m128i*)(I1_block_addr+desc_offset_1));
__m128i xmm6 = _mm_load_si128((__m128i*)(I2_block_addr+desc_offset_1));
xmm6 = _mm_sad_epu8(xmm1,xmm6);
what i did is
char *c1;
char xmm1[16],xmm6[16];
short xmm6s[16]
//for loding 16 byte
c1=( char* )( I1_block_addr + desc_offset_1 );
memcpy( xmm1 , c1 , 16 );
c1=( char* )( I2_block_addr + desc_offset_1 );
memcpy( xmm6 , c1 , 16 );
xmm6s[0] = (short) ( abs(xmm1[0]-xmm6[0]) + abs(xmm1[1]-xmm6[1]) + abs(xmm1[2]-xmm6[2]) + abs(xmm1[3]-xmm6[3]) + abs(xmm1[4]-xmm6[4]) + abs(xmm1[5]-xmm6[5]) +
abs(xmm1[6]-xmm6[6]) + abs(xmm1[7]-xmm6[7]) );
xmm6s[1] = 0; xmm6s[2] = 0; xmm6s[3] = 0;
xmm6s[4] = (short) ( abs(xmm1[8]-xmm6[8]) + abs(xmm1[9]-xmm6[9]) + abs(xmm1[10]-xmm6[10]) + abs(xmm1[11]-xmm6[11]) + abs(xmm1[12]-xmm6[12]) +
abs(xmm1[13]-xmm6[13]) + abs(xmm1[14]-xmm6[14]) + abs(xmm1[15]-xmm6[15]) );
xmm6s[5] = 0; xmm6s[6] = 0; xmm6s[7] = 0;
i am not getting any error but the quality of image is getting decreased. please tell which part of the code is wrong and how to correct it.
The code looks more or less OK – I think you just need to change your char/short types to appropriate unsigned types: