New Advanced SIMD intrinsics tests.
[platform/upstream/gcc49.git] / gcc / testsuite / gcc.target / aarch64 / advsimd-intrinsics / vaddw.c
1 #include <arm_neon.h>
2 #include "arm-neon-ref.h"
3 #include "compute-ref-data.h"
4
5 /* Expected results.  */
6 VECT_VAR_DECL(expected,int,8,8) [] = { 0x33, 0x33, 0x33, 0x33,
7                                        0x33, 0x33, 0x33, 0x33 };
8 VECT_VAR_DECL(expected,int,16,4) [] = { 0x33, 0x33, 0x33, 0x33 };
9 VECT_VAR_DECL(expected,int,32,2) [] = { 0x33, 0x33 };
10 VECT_VAR_DECL(expected,int,64,1) [] = { 0x3333333333333333 };
11 VECT_VAR_DECL(expected,uint,8,8) [] = { 0x3, 0x3, 0x3, 0x3,
12                                         0x3, 0x3, 0x3, 0x3 };
13 VECT_VAR_DECL(expected,uint,16,4) [] = { 0x37, 0x37, 0x37, 0x37 };
14 VECT_VAR_DECL(expected,uint,32,2) [] = { 0x3, 0x3 };
15 VECT_VAR_DECL(expected,uint,64,1) [] = { 0x3333333333333333 };
16 VECT_VAR_DECL(expected,poly,8,8) [] = { 0x33, 0x33, 0x33, 0x33,
17                                         0x33, 0x33, 0x33, 0x33 };
18 VECT_VAR_DECL(expected,poly,16,4) [] = { 0x3333, 0x3333, 0x3333, 0x3333 };
19 VECT_VAR_DECL(expected,hfloat,32,2) [] = { 0x33333333, 0x33333333 };
20 VECT_VAR_DECL(expected,int,8,16) [] = { 0x33, 0x33, 0x33, 0x33,
21                                         0x33, 0x33, 0x33, 0x33,
22                                         0x33, 0x33, 0x33, 0x33,
23                                         0x33, 0x33, 0x33, 0x33 };
24 VECT_VAR_DECL(expected,int,16,8) [] = {  0xffe3, 0xffe4, 0xffe5, 0xffe6,
25                                          0xffe7, 0xffe8, 0xffe9, 0xffea };
26 VECT_VAR_DECL(expected,int,32,4) [] = { 0xffffffe2, 0xffffffe3,
27                                         0xffffffe4, 0xffffffe5 };
28 VECT_VAR_DECL(expected,int,64,2) [] = { 0xffffffffffffffe0,
29                                         0xffffffffffffffe1 };
30 VECT_VAR_DECL(expected,uint,8,16) [] = { 0x33, 0x33, 0x33, 0x33,
31                                          0x33, 0x33, 0x33, 0x33,
32                                          0x33, 0x33, 0x33, 0x33,
33                                          0x33, 0x33, 0x33, 0x33 };
34 VECT_VAR_DECL(expected,uint,16,8) [] = { 0xe3, 0xe4, 0xe5, 0xe6,
35                                          0xe7, 0xe8, 0xe9, 0xea };
36 VECT_VAR_DECL(expected,uint,32,4) [] = { 0xffe1, 0xffe2,
37                                          0xffe3, 0xffe4 };
38 VECT_VAR_DECL(expected,uint,64,2) [] = { 0xffffffe0, 0xffffffe1 };
39 VECT_VAR_DECL(expected,poly,8,16) [] = { 0x33, 0x33, 0x33, 0x33,
40                                          0x33, 0x33, 0x33, 0x33,
41                                          0x33, 0x33, 0x33, 0x33,
42                                          0x33, 0x33, 0x33, 0x33 };
43 VECT_VAR_DECL(expected,poly,16,8) [] = { 0x3333, 0x3333, 0x3333, 0x3333,
44                                          0x3333, 0x3333, 0x3333, 0x3333 };
45 VECT_VAR_DECL(expected,hfloat,32,4) [] = { 0x33333333, 0x33333333,
46                                            0x33333333, 0x33333333 };
47
48 #ifndef INSN_NAME
49 #define INSN_NAME vaddw
50 #define TEST_MSG "VADDW"
51 #endif
52
53 #define FNNAME1(NAME) void exec_ ## NAME (void)
54 #define FNNAME(NAME) FNNAME1(NAME)
55
56 FNNAME (INSN_NAME)
57 {
58   /* Basic test: y=vaddw(x1,x2), then store the result.  */
59 #define TEST_VADDW1(INSN, T1, T2, W, W2, N)                             \
60   VECT_VAR(vector_res, T1, W2, N) =                                     \
61     INSN##_##T2##W(VECT_VAR(vector, T1, W2, N),                         \
62                    VECT_VAR(vector2, T1, W, N));                        \
63   vst1q_##T2##W2(VECT_VAR(result, T1, W2, N), VECT_VAR(vector_res, T1, W2, N))
64
65 #define TEST_VADDW(INSN, T1, T2, W, W2, N)      \
66   TEST_VADDW1(INSN, T1, T2, W, W2, N)
67
68   DECL_VARIABLE(vector, int, 16, 8);
69   DECL_VARIABLE(vector, int, 32, 4);
70   DECL_VARIABLE(vector, int, 64, 2);
71   DECL_VARIABLE(vector, uint, 16, 8);
72   DECL_VARIABLE(vector, uint, 32, 4);
73   DECL_VARIABLE(vector, uint, 64, 2);
74
75   DECL_VARIABLE(vector2, int, 8, 8);
76   DECL_VARIABLE(vector2, int, 16, 4);
77   DECL_VARIABLE(vector2, int, 32, 2);
78   DECL_VARIABLE(vector2, uint, 8, 8);
79   DECL_VARIABLE(vector2, uint, 16, 4);
80   DECL_VARIABLE(vector2, uint, 32, 2);
81
82   DECL_VARIABLE(vector_res, int, 16, 8);
83   DECL_VARIABLE(vector_res, int, 32, 4);
84   DECL_VARIABLE(vector_res, int, 64, 2);
85   DECL_VARIABLE(vector_res, uint, 16, 8);
86   DECL_VARIABLE(vector_res, uint, 32, 4);
87   DECL_VARIABLE(vector_res, uint, 64, 2);
88
89   clean_results ();
90
91   /* Initialize input "vector" from "buffer".  */
92   VLOAD(vector, buffer, q, int, s, 16, 8);
93   VLOAD(vector, buffer, q, int, s, 32, 4);
94   VLOAD(vector, buffer, q, int, s, 64, 2);
95   VLOAD(vector, buffer, q, uint, u, 16, 8);
96   VLOAD(vector, buffer, q, uint, u, 32, 4);
97   VLOAD(vector, buffer, q, uint, u, 64, 2);
98
99   /* Choose init value arbitrarily.  */
100   VDUP(vector2, , int, s, 8, 8, -13);
101   VDUP(vector2, , int, s, 16, 4, -14);
102   VDUP(vector2, , int, s, 32, 2, -16);
103   VDUP(vector2, , uint, u, 8, 8, 0xf3);
104   VDUP(vector2, , uint, u, 16, 4, 0xfff1);
105   VDUP(vector2, , uint, u, 32, 2, 0xfffffff0);
106
107   /* Execute the tests.  */
108   TEST_VADDW(INSN_NAME, int, s, 8, 16, 8);
109   TEST_VADDW(INSN_NAME, int, s, 16, 32, 4);
110   TEST_VADDW(INSN_NAME, int, s, 32, 64, 2);
111   TEST_VADDW(INSN_NAME, uint, u, 8, 16, 8);
112   TEST_VADDW(INSN_NAME, uint, u, 16, 32, 4);
113   TEST_VADDW(INSN_NAME, uint, u, 32, 64, 2);
114
115   CHECK_RESULTS (TEST_MSG, "");
116 }
117
118 int main (void)
119 {
120   FNNAME (INSN_NAME);
121   return 0;
122 }