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