2014-10-24 Christophe Lyon <christophe.lyon@linaro.org>
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / advsimd-intrinsics / vaddl.c
blob861abec8e7bf7fe5fb8106eace42ed526c7b4f7a
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) [] = { 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) [] = { 0x1e3, 0x1e4, 0x1e5, 0x1e6,
35 0x1e7, 0x1e8, 0x1e9, 0x1ea };
36 VECT_VAR_DECL(expected,uint,32,4) [] = { 0x1ffe1, 0x1ffe2,
37 0x1ffe3, 0x1ffe4 };
38 VECT_VAR_DECL(expected,uint,64,2) [] = { 0x1ffffffe0, 0x1ffffffe1 };
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 #ifndef INSN_NAME
49 #define INSN_NAME vaddl
50 #define TEST_MSG "VADDL"
51 #endif
53 #define FNNAME1(NAME) void exec_ ## NAME (void)
54 #define FNNAME(NAME) FNNAME1(NAME)
56 FNNAME (INSN_NAME)
58 /* Basic test: y=vaddl(x1,x2), then store the result. */
59 #define TEST_VADDL1(INSN, T1, T2, W, W2, N) \
60 VECT_VAR(vector_res, T1, W2, N) = \
61 INSN##_##T2##W(VECT_VAR(vector, T1, W, 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))
65 #define TEST_VADDL(INSN, T1, T2, W, W2, N) \
66 TEST_VADDL1(INSN, T1, T2, W, W2, N)
68 DECL_VARIABLE(vector, int, 8, 8);
69 DECL_VARIABLE(vector, int, 16, 4);
70 DECL_VARIABLE(vector, int, 32, 2);
71 DECL_VARIABLE(vector, uint, 8, 8);
72 DECL_VARIABLE(vector, uint, 16, 4);
73 DECL_VARIABLE(vector, uint, 32, 2);
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);
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);
89 clean_results ();
91 /* Initialize input "vector" from "buffer". */
92 VLOAD(vector, buffer, , int, s, 8, 8);
93 VLOAD(vector, buffer, , int, s, 16, 4);
94 VLOAD(vector, buffer, , int, s, 32, 2);
95 VLOAD(vector, buffer, , uint, u, 8, 8);
96 VLOAD(vector, buffer, , uint, u, 16, 4);
97 VLOAD(vector, buffer, , uint, u, 32, 2);
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);
107 /* Execute the tests. */
108 TEST_VADDL(INSN_NAME, int, s, 8, 16, 8);
109 TEST_VADDL(INSN_NAME, int, s, 16, 32, 4);
110 TEST_VADDL(INSN_NAME, int, s, 32, 64, 2);
111 TEST_VADDL(INSN_NAME, uint, u, 8, 16, 8);
112 TEST_VADDL(INSN_NAME, uint, u, 16, 32, 4);
113 TEST_VADDL(INSN_NAME, uint, u, 32, 64, 2);
115 CHECK_RESULTS (TEST_MSG, "");
118 int main (void)
120 FNNAME (INSN_NAME);
121 return 0;