size_t varvectorshift_unrolled(uint32_t *array, size_t length, int shiftamount) { size_t k = 0; __m256i * a = (__m256i *) array; __m128i s = _mm_set1_epi32(shiftamount); for (; k + 3 < length / 8 ; k +=4, a+=4) { __m256i v1 = _mm256_loadu_si256(a); __m256i v2 = _mm256_loadu_si256(a + 1); __m256i v3 = _mm256_loadu_si256(a + 2); __m256i v4 = _mm256_loadu_si256(a + 3); v1 = _mm256_srl_epi32(v1,s); v2 = _mm256_srl_epi32(v2,s); v3 = _mm256_srl_epi32(v3,s); v4 = _mm256_srl_epi32(v4,s); _mm256_storeu_si256(a,v1); _mm256_storeu_si256(a + 1,v2); _mm256_storeu_si256(a + 2,v3); _mm256_storeu_si256(a + 3,v4); } for (; k < length / 8 ; k ++, a++) { __m256i v = _mm256_loadu_si256(a); v = _mm256_srl_epi32(v,s); _mm256_storeu_si256(a,v); } k *= 8; for (; k < length; ++k) { array[k] = array[k] >> shiftamount; } return 0; }
size_t varvectorshift(uint32_t *array, size_t length, int shiftamount) { size_t k = 0; __m256i * a = (__m256i *) array; __m128i s = _mm_set1_epi32(shiftamount); for (; k < length / 8 ; k ++, a++) { __m256i v = _mm256_loadu_si256(a); v = _mm256_srl_epi32(v,s); _mm256_storeu_si256(a,v); } k *= 8; for (; k < length; ++k) { array[k] = array[k] >> shiftamount; } return 0; }
__m256i test_mm256_srl_epi32(__m256i a, __m128i b) { // CHECK: @llvm.x86.avx2.psrl.d return _mm256_srl_epi32(a, b); }
__m256i test_mm256_srl_epi32(__m256i a, __m128i b) { // CHECK-LABEL: test_mm256_srl_epi32 // CHECK:call <8 x i32> @llvm.x86.avx2.psrl.d(<8 x i32> %{{.*}}, <4 x i32> %{{.*}}) return _mm256_srl_epi32(a, b); }
void extern avx2_test (void) { x = _mm256_srl_epi32 (x, y); }