/* * 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 _HELPERS_H_INCLUDED #define _HELPERS_H_INCLUDED #include "fakesse.h" static inline __m128i shift_pack_left127( __m128i A ) { return _mm_srli_si128( _mm_srli_epi32( A, 7 ), 15 ); } static inline __m128i shift_pack_left( __m128i A ) { const __m128i endmask = _mm_set_epi8( 0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00); __m128i temp1 = _mm_and_si128( endmask, _mm_srli_epi32( _mm_slli_si128( A, 15 ), 1 ) ); __m128i temp2 = _mm_srli_si128( A, 1 ); return _mm_or_si128( temp1, temp2 ); } static inline __m128i shift_pack_right127( __m128i A ) { return _mm_slli_si128( _mm_slli_epi32( A, 7 ), 15 ); } static inline __m128i shift_pack_right( __m128i A ) { const __m128i startmask = _mm_set_epi8( 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xFF); __m128i temp1 = _mm_and_si128( startmask, _mm_slli_epi32( _mm_srli_si128( A, 15 ), 1 ) ); __m128i temp2 = _mm_slli_si128( A, 1 ); return _mm_or_si128( temp1, temp2 ); } static inline __m128i unpack( __m128i A, int row ) { const __m128i onemask = _mm_set1_epi8( 0x01 ); __m128i shift = _mm_srli_epi32( A, row ); return _mm_and_si128( shift, onemask ); } // MAKE SURE A IS IN THE FORM (0xFF) not (0x01 // ( a | mask ) | ( ~mask & b ) static inline __m128i pack( __m128i A, int row ) { const __m128i onemask = _mm_set1_epi8( 0x01 ); A = _mm_and_si128( onemask, A ); return _mm_slli_epi32(A, row); } //The get and set ops are scalar and slow. __m128i set_bit( __m128i A, int col ); char get_bit( __m128i A, int col ); void print_packed_row( __m128i A ); void print_life_block( life_block *block ); void set_bit_in_block( life_block *block, int row, int column ); #endif //_HELPERS_H_INCLUDED