[ARM/AArch64][testsuite] Add vsubl tests, put most of the code in common with vaddl...
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / advsimd-intrinsics / vaddw.c
blob95cbb310efa1c1d7224862c41c37778add51ccc3
1 #include <arm_neon.h>
2 #include "arm-neon-ref.h"
3 #include "compute-ref-data.h"
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) [] = { 0x3333, 0x3333, 0x3333, 0x3333 };
9 VECT_VAR_DECL(expected,int,32,2) [] = { 0x33333333, 0x33333333 };
10 VECT_VAR_DECL(expected,int,64,1) [] = { 0x3333333333333333 };
11 VECT_VAR_DECL(expected,uint,8,8) [] = { 0x33, 0x33, 0x33, 0x33,
12 0x33, 0x33, 0x33, 0x33 };
13 VECT_VAR_DECL(expected,uint,16,4) [] = { 0x3333, 0x3333, 0x3333, 0x3333 };
14 VECT_VAR_DECL(expected,uint,32,2) [] = { 0x33333333, 0x33333333 };
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 };
48 #define INSN_NAME vaddw
49 #define TEST_MSG "VADDW"
51 #define FNNAME1(NAME) exec_ ## NAME
52 #define FNNAME(NAME) FNNAME1(NAME)
54 void FNNAME (INSN_NAME) (void)
56 /* Basic test: y=vaddw(x1,x2), then store the result. */
57 #define TEST_VADDW1(INSN, T1, T2, W, W2, N) \
58 VECT_VAR(vector_res, T1, W2, N) = \
59 INSN##_##T2##W(VECT_VAR(vector, T1, W2, N), \
60 VECT_VAR(vector2, T1, W, N)); \
61 vst1q_##T2##W2(VECT_VAR(result, T1, W2, N), VECT_VAR(vector_res, T1, W2, N))
63 #define TEST_VADDW(INSN, T1, T2, W, W2, N) \
64 TEST_VADDW1(INSN, T1, T2, W, W2, N)
66 DECL_VARIABLE(vector, int, 16, 8);
67 DECL_VARIABLE(vector, int, 32, 4);
68 DECL_VARIABLE(vector, int, 64, 2);
69 DECL_VARIABLE(vector, uint, 16, 8);
70 DECL_VARIABLE(vector, uint, 32, 4);
71 DECL_VARIABLE(vector, uint, 64, 2);
73 DECL_VARIABLE(vector2, int, 8, 8);
74 DECL_VARIABLE(vector2, int, 16, 4);
75 DECL_VARIABLE(vector2, int, 32, 2);
76 DECL_VARIABLE(vector2, uint, 8, 8);
77 DECL_VARIABLE(vector2, uint, 16, 4);
78 DECL_VARIABLE(vector2, uint, 32, 2);
80 DECL_VARIABLE(vector_res, int, 16, 8);
81 DECL_VARIABLE(vector_res, int, 32, 4);
82 DECL_VARIABLE(vector_res, int, 64, 2);
83 DECL_VARIABLE(vector_res, uint, 16, 8);
84 DECL_VARIABLE(vector_res, uint, 32, 4);
85 DECL_VARIABLE(vector_res, uint, 64, 2);
87 clean_results ();
89 /* Initialize input "vector" from "buffer". */
90 VLOAD(vector, buffer, q, int, s, 16, 8);
91 VLOAD(vector, buffer, q, int, s, 32, 4);
92 VLOAD(vector, buffer, q, int, s, 64, 2);
93 VLOAD(vector, buffer, q, uint, u, 16, 8);
94 VLOAD(vector, buffer, q, uint, u, 32, 4);
95 VLOAD(vector, buffer, q, uint, u, 64, 2);
97 /* Choose init value arbitrarily. */
98 VDUP(vector2, , int, s, 8, 8, -13);
99 VDUP(vector2, , int, s, 16, 4, -14);
100 VDUP(vector2, , int, s, 32, 2, -16);
101 VDUP(vector2, , uint, u, 8, 8, 0xf3);
102 VDUP(vector2, , uint, u, 16, 4, 0xfff1);
103 VDUP(vector2, , uint, u, 32, 2, 0xfffffff0);
105 /* Execute the tests. */
106 TEST_VADDW(INSN_NAME, int, s, 8, 16, 8);
107 TEST_VADDW(INSN_NAME, int, s, 16, 32, 4);
108 TEST_VADDW(INSN_NAME, int, s, 32, 64, 2);
109 TEST_VADDW(INSN_NAME, uint, u, 8, 16, 8);
110 TEST_VADDW(INSN_NAME, uint, u, 16, 32, 4);
111 TEST_VADDW(INSN_NAME, uint, u, 32, 64, 2);
113 CHECK_RESULTS (TEST_MSG, "");
116 int main (void)
118 FNNAME (INSN_NAME) ();
119 return 0;