1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <stdio.h>
2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaotypedef unsigned char v16i8 __attribute__((ext_vector_type(16)));
4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaotypedef short         v8i16 __attribute__((ext_vector_type(16)));
5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaotypedef int           v4i32 __attribute__((ext_vector_type(4)));
6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaotypedef float         v4f32 __attribute__((ext_vector_type(4)));
7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaotypedef long long     v2i64 __attribute__((ext_vector_type(2)));
8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaotypedef double        v2f64 __attribute__((ext_vector_type(2)));
9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid print_v16i8(const char *str, const v16i8 v) {
11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  union {
12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    unsigned char elts[16];
13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    v16i8 vec;
14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  } tv;
15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  tv.vec = v;
16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  printf("%s = { %hhu, %hhu, %hhu, %hhu, %hhu, %hhu, %hhu, "
17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                "%hhu, %hhu, %hhu, %hhu, %hhu, %hhu, %hhu, "
18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao		"%hhu, %hhu }\n",
19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	str, tv.elts[0], tv.elts[1], tv.elts[2], tv.elts[3], tv.elts[4], tv.elts[5],
20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	tv.elts[6], tv.elts[7], tv.elts[8], tv.elts[9], tv.elts[10], tv.elts[11],
21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	tv.elts[12], tv.elts[13], tv.elts[14], tv.elts[15]);
22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid print_v16i8_hex(const char *str, const v16i8 v) {
25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  union {
26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    unsigned char elts[16];
27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    v16i8 vec;
28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  } tv;
29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  tv.vec = v;
30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  printf("%s = { 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, "
31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                "0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, 0x%02hhx, "
32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao		"0x%02hhx, 0x%02hhx }\n",
33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	str, tv.elts[0], tv.elts[1], tv.elts[2], tv.elts[3], tv.elts[4], tv.elts[5],
34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	tv.elts[6], tv.elts[7], tv.elts[8], tv.elts[9], tv.elts[10], tv.elts[11],
35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	tv.elts[12], tv.elts[13], tv.elts[14], tv.elts[15]);
36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid print_v8i16_hex(const char *str, v8i16 v) {
39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  union {
40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    short elts[8];
41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao    v8i16 vec;
42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  } tv;
43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  tv.vec = v;
44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  printf("%s = { 0x%04hx, 0x%04hx, 0x%04hx, 0x%04hx, 0x%04hx, "
45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                "0x%04hx, 0x%04hx, 0x%04hx }\n",
46e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	str, tv.elts[0], tv.elts[1], tv.elts[2], tv.elts[3], tv.elts[4],
47e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao	tv.elts[5], tv.elts[6], tv.elts[7]);
48e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
49e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
50e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid print_v4i32(const char *str, v4i32 v) {
51e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  printf("%s = { %d, %d, %d, %d }\n", str, v.x, v.y, v.z, v.w);
52e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
53e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
54e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid print_v4f32(const char *str, v4f32 v) {
55e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  printf("%s = { %f, %f, %f, %f }\n", str, v.x, v.y, v.z, v.w);
56e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
57e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
58e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid print_v2i64(const char *str, v2i64 v) {
59e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  printf("%s = { %lld, %lld }\n", str, v.x, v.y);
60e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
61e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
62e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid print_v2f64(const char *str, v2f64 v) {
63e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  printf("%s = { %g, %g }\n", str, v.x, v.y);
64e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
65e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
66e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/*----------------------------------------------------------------------*/
67e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
68e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov16i8 v16i8_mpy(v16i8 v1, v16i8 v2) {
69e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return v1 * v2;
70e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
71e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
72e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov16i8 v16i8_add(v16i8 v1, v16i8 v2) {
73e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return v1 + v2;
74e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
75e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
76e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4i32 v4i32_shuffle_1(v4i32 a) {
77e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4i32 c2 = a.yzwx;
78e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
79e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
80e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
81e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4i32 v4i32_shuffle_2(v4i32 a) {
82e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4i32 c2 = a.zwxy;
83e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
84e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
85e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
86e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4i32 v4i32_shuffle_3(v4i32 a) {
87e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4i32 c2 = a.wxyz;
88e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
89e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
90e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
91e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4i32 v4i32_shuffle_4(v4i32 a) {
92e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4i32 c2 = a.xyzw;
93e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
94e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
95e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
96e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4i32 v4i32_shuffle_5(v4i32 a) {
97e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4i32 c2 = a.xwzy;
98e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
99e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
100e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
101e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4f32 v4f32_shuffle_1(v4f32 a) {
102e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4f32 c2 = a.yzwx;
103e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
104e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
105e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
106e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4f32 v4f32_shuffle_2(v4f32 a) {
107e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4f32 c2 = a.zwxy;
108e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
109e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
110e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
111e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4f32 v4f32_shuffle_3(v4f32 a) {
112e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4f32 c2 = a.wxyz;
113e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
114e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
115e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
116e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4f32 v4f32_shuffle_4(v4f32 a) {
117e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4f32 c2 = a.xyzw;
118e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
119e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
120e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
121e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov4f32 v4f32_shuffle_5(v4f32 a) {
122e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4f32 c2 = a.xwzy;
123e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
124e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
125e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
126e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov2i64 v2i64_shuffle(v2i64 a) {
127e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v2i64 c2 = a.yx;
128e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
129e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
130e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
131e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaov2f64 v2f64_shuffle(v2f64 a) {
132e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v2f64 c2 = a.yx;
133e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return c2;
134e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
135e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
136e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoint main(void) {
137e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v16i8 v00 = { 0xf4, 0xad, 0x01, 0xe9, 0x51, 0x78, 0xc1, 0x8a,
138e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                0x94, 0x7c, 0x49, 0x6c, 0x21, 0x32, 0xb2, 0x04 };
139e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v16i8 va0 = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
140e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 };
141e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v16i8 va1 = { 0x11, 0x83, 0x4b, 0x63, 0xff, 0x90, 0x32, 0xe5,
142e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                0x5a, 0xaa, 0x20, 0x01, 0x0d, 0x15, 0x77, 0x05 };
143e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v8i16 v01 = { 0x1a87, 0x0a14, 0x5014, 0xfff0,
144e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                0xe194, 0x0184, 0x801e, 0x5940 };
145e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4i32 v1 = { 1, 2, 3, 4 };
146e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v4f32 v2 = { 1.0, 2.0, 3.0, 4.0 };
147e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v2i64 v3 = { 691043ll, 910301513ll };
148e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  v2f64 v4 = { 5.8e56, 9.103e-62 };
149e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
150e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  puts("---- vector tests start ----");
151e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
152e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v16i8_hex("v00                        ", v00);
153e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v16i8_hex("va0                        ", va0);
154e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v16i8_hex("va1                        ", va1);
155e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v16i8_hex("va0 x va1                  ", v16i8_mpy(va0, va1));
156e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v16i8_hex("va0 + va1                  ", v16i8_add(va0, va1));
157e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v8i16_hex("v01                        ", v01);
158e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
159e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4i32("v4i32_shuffle_1(1, 2, 3, 4)", v4i32_shuffle_1(v1));
160e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4i32("v4i32_shuffle_2(1, 2, 3, 4)", v4i32_shuffle_2(v1));
161e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4i32("v4i32_shuffle_3(1, 2, 3, 4)", v4i32_shuffle_3(v1));
162e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4i32("v4i32_shuffle_4(1, 2, 3, 4)", v4i32_shuffle_4(v1));
163e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4i32("v4i32_shuffle_5(1, 2, 3, 4)", v4i32_shuffle_5(v1));
164e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
165e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4f32("v4f32_shuffle_1(1, 2, 3, 4)", v4f32_shuffle_1(v2));
166e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4f32("v4f32_shuffle_2(1, 2, 3, 4)", v4f32_shuffle_2(v2));
167e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4f32("v4f32_shuffle_3(1, 2, 3, 4)", v4f32_shuffle_3(v2));
168e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4f32("v4f32_shuffle_4(1, 2, 3, 4)", v4f32_shuffle_4(v2));
169e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v4f32("v4f32_shuffle_5(1, 2, 3, 4)", v4f32_shuffle_5(v2));
170e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
171e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v2i64("v3                         ", v3);
172e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v2i64("v2i64_shuffle              ", v2i64_shuffle(v3));
173e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v2f64("v4                         ", v4);
174e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  print_v2f64("v2f64_shuffle              ", v2f64_shuffle(v4));
175e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
176e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  puts("---- vector tests end ----");
177e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
178e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  return 0;
179e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
180