#include #include #include #include using namespace std; #include "MOA.h" #include /* This is convenient -- a procedure to print out SIMD variables for debugging. */ void print_simd(string s, __m128i v) { uint16_t array[8]; __m128i *c; int i; c = (__m128i *) array; *c = v; printf("%-30s", s.c_str()); for (i = 7; i >= 0; i--) printf(" %04x", array[i]); printf("\n"); } int main(int argc, char **argv) { uint16_t array[8]; uint64_t *a64; int i; __m128i a, b, x, *c; if (argc != 2) { fprintf(stderr, "usage: odd_shorts seed\n"); exit(1); } /* Set array to 8 random shorts */ MOA_Seed(atoi(argv[1])); for (i = 0; i < 8; i++) array[i] = MOA_Random_W(16, 1); /* Print the numbers from 7 down to 1. */ printf("%-30s", ""); for (i = 7; i >= 0; i--) printf("%5d", i); printf("\n"); /* Set c to the array, then turn the even numbers to zeros. */ c = (__m128i *) array; print_simd("b=Starting values:", *c); b = *c; x = _mm_set1_epi16(1); print_simd("x=_mm_set1_epi16(1)", x); a = _mm_and_si128(x, b); print_simd("a=_mm_and_si128(x, b)", a); x = _mm_setzero_si128(); print_simd("x=_mm_setzero_si128()", x); a = _mm_sub_epi16(x, a); print_simd("a=_mm_sub_epi16(x, a)", a); b = _mm_and_si128(a, b); print_simd("b=_mm_and_si128(a, b)", b); *c = b; print_simd("Finishing values:", *c); for (i = 0; i < 8; i++) array[i] = MOA_Random_W(16, 1); printf("\n"); c = (__m128i *) array; print_simd("b=Starting values:", *c); b = *c; b = _mm_srli_epi64(b, 4); print_simd("b=_mm_srli_epi64(b, 4)", b); *c = b; a64 = (uint64_t *) array; printf("As uint64_t: %016llx %016llx\n", (long long unsigned int) a64[1], (long long unsigned int) a64[0]); exit(0); }