Naruto
7/6/2017 - 1:31 PM

neon_shift.c

// arm neon uint64x1_t right, left rotate test
//
// usage
// $ arm-linux-gnueabi-gcc -O3 -mfpu=neon -mfloat-abi=softfp -std=c99 ./neon_shift.c -o neon_shift
// $ qemu-arm  -L /usr/arm-linux-gnueabi/ ./neon_shift
#include <stdio.h>
#include <stdint.h>
#include "arm_neon.h"

int main() {
  // right rotate
  {
    uint64_t a = 0xff;
    uint64x1_t va = vld1_u64(&a);

    va = vsri_n_u64(vshl_n_u64(va, (64-8)), va, 8);
    vst1_u64(&a, va);
    printf("0x%llx\n", a); // 0xff00000000000000
  }

  // left rotate
  {
    uint64_t a = 0xff00000000000000;
    uint64x1_t va = vld1_u64(&a);

    va = vsri_n_u64(vshl_n_u64(va, (8)), va, 64-8);
    vst1_u64(&a, va);
    printf("0x%llx\n", a); // 0xff
  }


  return 0;
}