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,16,4) [] = { 0xffd1, 0xffd6, 0xffdb, 0xffe0 };
7 VECT_VAR_DECL(expected,int,32,2) [] = { 0xffffffd1, 0xffffffd6 };
8 VECT_VAR_DECL(expected,int,64,1) [] = { 0xffffffffffffffd1 };
9 VECT_VAR_DECL(expected,uint,16,4) [] = { 0x1d1, 0x1d6, 0x1db, 0x1e0 };
10 VECT_VAR_DECL(expected,uint,32,2) [] = { 0x1ffd1, 0x1ffd6 };
11 VECT_VAR_DECL(expected,uint,64,1) [] = { 0x1ffffffd1 };
12 VECT_VAR_DECL(expected,int,16,8) [] = { 0xffd1, 0xffd6, 0xffdb, 0xffe0,
13 					0xffe5, 0xffea, 0xffef, 0xfff4 };
14 VECT_VAR_DECL(expected,int,32,4) [] = { 0xffffffd1, 0xffffffd6,
15 					0xffffffdb, 0xffffffe0 };
16 VECT_VAR_DECL(expected,int,64,2) [] = { 0xffffffffffffffd1, 0xffffffffffffffd6 };
17 VECT_VAR_DECL(expected,uint,16,8) [] = { 0x1d1, 0x1d6, 0x1db, 0x1e0,
18 					 0x1e5, 0x1ea, 0x1ef, 0x1f4 };
19 VECT_VAR_DECL(expected,uint,32,4) [] = { 0x1ffd1, 0x1ffd6, 0x1ffdb, 0x1ffe0 };
20 VECT_VAR_DECL(expected,uint,64,2) [] = { 0x1ffffffd1, 0x1ffffffd6 };
21 
22 #define INSN_NAME vpadal
23 #define TEST_MSG "VPADAL/VPADALQ"
24 
25 #define FNNAME1(NAME) void exec_ ## NAME (void)
26 #define FNNAME(NAME) FNNAME1(NAME)
27 
FNNAME(INSN_NAME)28 FNNAME (INSN_NAME)
29 {
30   /* Basic test: y=OP(x), then store the result.  */
31 #define TEST_VPADAL1(INSN, Q, T1, T2, W, N, W2, N2)			\
32   VECT_VAR(vector_res, T1, W2, N2) =					\
33     INSN##Q##_##T2##W(VECT_VAR(vector, T1, W2, N2), VECT_VAR(vector2, T1, W, N)); \
34   vst1##Q##_##T2##W2(VECT_VAR(result, T1, W2, N2),			\
35 		     VECT_VAR(vector_res, T1, W2, N2))
36 
37 #define TEST_VPADAL(INSN, Q, T1, T2, W, N, W2, N2)	\
38   TEST_VPADAL1(INSN, Q, T1, T2, W, N, W2, N2)
39 
40   DECL_VARIABLE(vector, int, 16, 4);
41   DECL_VARIABLE(vector, int, 32, 2);
42   DECL_VARIABLE(vector, int, 64, 1);
43   DECL_VARIABLE(vector, uint, 16, 4);
44   DECL_VARIABLE(vector, uint, 32, 2);
45   DECL_VARIABLE(vector, uint, 64, 1);
46   DECL_VARIABLE(vector, int, 16, 8);
47   DECL_VARIABLE(vector, int, 32, 4);
48   DECL_VARIABLE(vector, int, 64, 2);
49   DECL_VARIABLE(vector, uint, 16, 8);
50   DECL_VARIABLE(vector, uint, 32, 4);
51   DECL_VARIABLE(vector, uint, 64, 2);
52 
53   DECL_VARIABLE(vector2, int, 8, 8);
54   DECL_VARIABLE(vector2, int, 16, 4);
55   DECL_VARIABLE(vector2, int, 32, 2);
56   DECL_VARIABLE(vector2, uint, 8, 8);
57   DECL_VARIABLE(vector2, uint, 16, 4);
58   DECL_VARIABLE(vector2, uint, 32, 2);
59   DECL_VARIABLE(vector2, int, 8, 16);
60   DECL_VARIABLE(vector2, int, 16, 8);
61   DECL_VARIABLE(vector2, int, 32, 4);
62   DECL_VARIABLE(vector2, uint, 8, 16);
63   DECL_VARIABLE(vector2, uint, 16, 8);
64   DECL_VARIABLE(vector2, uint, 32, 4);
65 
66   DECL_VARIABLE(vector_res, int, 16, 4);
67   DECL_VARIABLE(vector_res, int, 32, 2);
68   DECL_VARIABLE(vector_res, int, 64, 1);
69   DECL_VARIABLE(vector_res, uint, 16, 4);
70   DECL_VARIABLE(vector_res, uint, 32, 2);
71   DECL_VARIABLE(vector_res, uint, 64, 1);
72   DECL_VARIABLE(vector_res, int, 16, 8);
73   DECL_VARIABLE(vector_res, int, 32, 4);
74   DECL_VARIABLE(vector_res, int, 64, 2);
75   DECL_VARIABLE(vector_res, uint, 16, 8);
76   DECL_VARIABLE(vector_res, uint, 32, 4);
77   DECL_VARIABLE(vector_res, uint, 64, 2);
78 
79   clean_results ();
80 
81   /* Initialize input "vector" from "buffer".  */
82   VLOAD(vector, buffer, , int, s, 16, 4);
83   VLOAD(vector, buffer, , int, s, 32, 2);
84   VLOAD(vector, buffer, , int, s, 64, 1);
85   VLOAD(vector, buffer, , uint, u, 16, 4);
86   VLOAD(vector, buffer, , uint, u, 32, 2);
87   VLOAD(vector, buffer, , uint, u, 64, 1);
88   VLOAD(vector, buffer, q, int, s, 16, 8);
89   VLOAD(vector, buffer, q, int, s, 32, 4);
90   VLOAD(vector, buffer, q, int, s, 64, 2);
91   VLOAD(vector, buffer, q, uint, u, 16, 8);
92   VLOAD(vector, buffer, q, uint, u, 32, 4);
93   VLOAD(vector, buffer, q, uint, u, 64, 2);
94 
95   /* Initialize input "vector2" from "buffer".  */
96   VLOAD(vector2, buffer, , int, s, 8, 8);
97   VLOAD(vector2, buffer, , int, s, 16, 4);
98   VLOAD(vector2, buffer, , int, s, 32, 2);
99   VLOAD(vector2, buffer, , uint, u, 8, 8);
100   VLOAD(vector2, buffer, , uint, u, 16, 4);
101   VLOAD(vector2, buffer, , uint, u, 32, 2);
102   VLOAD(vector2, buffer, q, int, s, 8, 16);
103   VLOAD(vector2, buffer, q, int, s, 16, 8);
104   VLOAD(vector2, buffer, q, int, s, 32, 4);
105   VLOAD(vector2, buffer, q, uint, u, 8, 16);
106   VLOAD(vector2, buffer, q, uint, u, 16, 8);
107   VLOAD(vector2, buffer, q, uint, u, 32, 4);
108 
109   /* Apply a unary operator named INSN_NAME.  */
110   TEST_VPADAL(INSN_NAME, , int, s, 8, 8, 16, 4);
111   TEST_VPADAL(INSN_NAME, , int, s, 16, 4, 32, 2);
112   TEST_VPADAL(INSN_NAME, , int, s, 32, 2, 64 ,1);
113   TEST_VPADAL(INSN_NAME, , uint, u, 8, 8, 16, 4);
114   TEST_VPADAL(INSN_NAME, , uint, u, 16, 4, 32, 2);
115   TEST_VPADAL(INSN_NAME, , uint, u, 32, 2, 64, 1);
116   TEST_VPADAL(INSN_NAME, q, int, s, 8, 16, 16, 8);
117   TEST_VPADAL(INSN_NAME, q, int, s, 16, 8, 32, 4);
118   TEST_VPADAL(INSN_NAME, q, int, s, 32, 4, 64 ,2);
119   TEST_VPADAL(INSN_NAME, q, uint, u, 8, 16, 16, 8);
120   TEST_VPADAL(INSN_NAME, q, uint, u, 16, 8, 32, 4);
121   TEST_VPADAL(INSN_NAME, q, uint, u, 32, 4, 64, 2);
122 
123   CHECK(TEST_MSG, int, 16, 4, PRIx16, expected, "");
124   CHECK(TEST_MSG, int, 32, 2, PRIx32, expected, "");
125   CHECK(TEST_MSG, int, 64, 1, PRIx64, expected, "");
126   CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected, "");
127   CHECK(TEST_MSG, uint, 32, 2, PRIx32, expected, "");
128   CHECK(TEST_MSG, uint, 64, 1, PRIx64, expected, "");
129   CHECK(TEST_MSG, int, 16, 8, PRIx16, expected, "");
130   CHECK(TEST_MSG, int, 32, 4, PRIx32, expected, "");
131   CHECK(TEST_MSG, int, 64, 2, PRIx64, expected, "");
132   CHECK(TEST_MSG, uint, 16, 8, PRIx16, expected, "");
133   CHECK(TEST_MSG, uint, 32, 4, PRIx32, expected, "");
134   CHECK(TEST_MSG, uint, 64, 2, PRIx64, expected, "");
135 }
136 
main(void)137 int main (void)
138 {
139   exec_vpadal ();
140   return 0;
141 }
142