Naruto
8/27/2017 - 6:47 AM

avx2_shift.c

// intel avx2 __m256i right, left rotate test
//
// usage
// $ cc -O3 -mavx2 -std=c99 ./avx2_shift.c -o avx2_shift
#include <stdio.h>
#include <stdint.h>
#include <immintrin.h>

int main() {
  // right rotate
  {
    uint64_t a = 0x00000000000000ffU;
    __m256i va = _mm256_set_epi64x(a, a, a, a);
    va = _mm256_xor_si256(_mm256_srli_epi64(va,8),_mm256_slli_epi64(va,(64-8)));

    uint64_t bva[4];
    _mm256_storeu_si256((__m256i*)&bva[0], va);
    printf("0x%016llx\n", bva[0]);
    printf("0x%016llx\n", bva[1]);
    printf("0x%016llx\n", bva[2]);
    printf("0x%016llx\n", bva[3]);
  }

  // left rotate
  {
    uint64_t a = 0xff00000000000000U;
    __m256i va = _mm256_set_epi64x(a, a, a, a);
    va = _mm256_xor_si256(_mm256_slli_epi64(va, 8), _mm256_srli_epi64(va, (64-8)));

    uint64_t bva[4];
    _mm256_storeu_si256((__m256i*)&bva[0], va);
    printf("0x%016llx\n", bva[0]);
    printf("0x%016llx\n", bva[1]);
    printf("0x%016llx\n", bva[2]);
    printf("0x%016llx\n", bva[3]);
  }

  return 0;
}