1 #include <arm_neon.h>
2 #include "arm-neon-ref.h"
3 #include "compute-ref-data.h"
4 #include <math.h>
5
6 /* Expected results. */
7 VECT_VAR_DECL(expected,int,8,8) [] = { 0x11, 0x10, 0xf, 0xe,
8 0xd, 0xc, 0xb, 0xa };
9 VECT_VAR_DECL(expected,int,16,4) [] = { 0x3, 0x2, 0x1, 0x0 };
10 VECT_VAR_DECL(expected,int,32,2) [] = { 0x18, 0x17 };
11 VECT_VAR_DECL(expected,uint,8,8) [] = { 0xef, 0xf0, 0xf1, 0xf2,
12 0xf3, 0xf4, 0xf5, 0xf6 };
13 VECT_VAR_DECL(expected,uint,16,4) [] = { 0xffe3, 0xffe4, 0xffe5, 0xffe6 };
14 VECT_VAR_DECL(expected,uint,32,2) [] = { 0xffffffe8, 0xffffffe9 };
15 VECT_VAR_DECL(expected,hfloat,32,2) [] = { 0x41c26666, 0x41ba6666 };
16 VECT_VAR_DECL(expected,int,8,16) [] = { 0x1a, 0x19, 0x18, 0x17,
17 0x16, 0x15, 0x14, 0x13,
18 0x12, 0x11, 0x10, 0xf,
19 0xe, 0xd, 0xc, 0xb };
20 VECT_VAR_DECL(expected,int,16,8) [] = { 0x4, 0x3, 0x2, 0x1,
21 0x0, 0x1, 0x2, 0x3 };
22 VECT_VAR_DECL(expected,int,32,4) [] = { 0x30, 0x2f, 0x2e, 0x2d };
23 VECT_VAR_DECL(expected,uint,8,16) [] = { 0xe6, 0xe7, 0xe8, 0xe9,
24 0xea, 0xeb, 0xec, 0xed,
25 0xee, 0xef, 0xf0, 0xf1,
26 0xf2, 0xf3, 0xf4, 0xf5 };
27 VECT_VAR_DECL(expected,uint,16,8) [] = { 0xffe4, 0xffe5, 0xffe6, 0xffe7,
28 0xffe8, 0xffe9, 0xffea, 0xffeb };
29 VECT_VAR_DECL(expected,uint,32,4) [] = { 0xffffffd0, 0xffffffd1,
30 0xffffffd2, 0xffffffd3 };
31 VECT_VAR_DECL(expected,hfloat,32,4) [] = { 0x42407ae1, 0x423c7ae1,
32 0x42387ae1, 0x42347ae1 };
33 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
34 VECT_VAR_DECL(expected, hfloat, 16, 4) [] = { 0x4e13, 0x4dd3,
35 0x4d93, 0x4d53 };
36 VECT_VAR_DECL(expected, hfloat, 16, 8) [] = { 0x5204, 0x51e4, 0x51c4, 0x51a4,
37 0x5184, 0x5164, 0x5144, 0x5124 };
38 #endif
39
40 /* Additional expected results for float32 variants with specially
41 chosen input values. */
42 VECT_VAR_DECL(expected_float32,hfloat,32,4) [] = { 0x0, 0x0, 0x0, 0x0 };
43 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
44 VECT_VAR_DECL(expected_float16, hfloat, 16, 8) [] = { 0x0, 0x0, 0x0, 0x0,
45 0x0, 0x0, 0x0, 0x0 };
46 #endif
47
48 #define TEST_MSG "VABD/VABDQ"
exec_vabd(void)49 void exec_vabd (void)
50 {
51 /* Basic test: v4=vabd(v1,v2), then store the result. */
52 #define TEST_VABD(Q, T1, T2, W, N) \
53 VECT_VAR(vector_res, T1, W, N) = \
54 vabd##Q##_##T2##W(VECT_VAR(vector1, T1, W, N), \
55 VECT_VAR(vector2, T1, W, N)); \
56 vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, W, N))
57
58 #define DECL_VABD_VAR(VAR) \
59 DECL_VARIABLE(VAR, int, 8, 8); \
60 DECL_VARIABLE(VAR, int, 16, 4); \
61 DECL_VARIABLE(VAR, int, 32, 2); \
62 DECL_VARIABLE(VAR, uint, 8, 8); \
63 DECL_VARIABLE(VAR, uint, 16, 4); \
64 DECL_VARIABLE(VAR, uint, 32, 2); \
65 DECL_VARIABLE(VAR, float, 32, 2); \
66 DECL_VARIABLE(VAR, int, 8, 16); \
67 DECL_VARIABLE(VAR, int, 16, 8); \
68 DECL_VARIABLE(VAR, int, 32, 4); \
69 DECL_VARIABLE(VAR, uint, 8, 16); \
70 DECL_VARIABLE(VAR, uint, 16, 8); \
71 DECL_VARIABLE(VAR, uint, 32, 4); \
72 DECL_VARIABLE(VAR, float, 32, 4)
73
74 DECL_VABD_VAR(vector1);
75 DECL_VABD_VAR(vector2);
76 DECL_VABD_VAR(vector_res);
77
78 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
79 DECL_VARIABLE(vector1, float, 16, 4);
80 DECL_VARIABLE(vector1, float, 16, 8);
81
82 DECL_VARIABLE(vector2, float, 16, 4);
83 DECL_VARIABLE(vector2, float, 16, 8);
84
85 DECL_VARIABLE(vector_res, float, 16, 4);
86 DECL_VARIABLE(vector_res, float, 16, 8);
87 #endif
88
89 clean_results ();
90
91 /* Initialize input "vector1" from "buffer". */
92 VLOAD(vector1, buffer, , int, s, 8, 8);
93 VLOAD(vector1, buffer, , int, s, 16, 4);
94 VLOAD(vector1, buffer, , int, s, 32, 2);
95 VLOAD(vector1, buffer, , uint, u, 8, 8);
96 VLOAD(vector1, buffer, , uint, u, 16, 4);
97 VLOAD(vector1, buffer, , uint, u, 32, 2);
98 VLOAD(vector1, buffer, , float, f, 32, 2);
99 VLOAD(vector1, buffer, q, int, s, 8, 16);
100 VLOAD(vector1, buffer, q, int, s, 16, 8);
101 VLOAD(vector1, buffer, q, int, s, 32, 4);
102 VLOAD(vector1, buffer, q, uint, u, 8, 16);
103 VLOAD(vector1, buffer, q, uint, u, 16, 8);
104 VLOAD(vector1, buffer, q, uint, u, 32, 4);
105 VLOAD(vector1, buffer, q, float, f, 32, 4);
106 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
107 VLOAD(vector1, buffer, , float, f, 16, 4);
108 VLOAD(vector1, buffer, , float, f, 16, 4);
109 VLOAD(vector1, buffer, q, float, f, 16, 8);
110 VLOAD(vector1, buffer, q, float, f, 16, 8);
111 #endif
112
113 /* Choose init value arbitrarily. */
114 VDUP(vector2, , int, s, 8, 8, 1);
115 VDUP(vector2, , int, s, 16, 4, -13);
116 VDUP(vector2, , int, s, 32, 2, 8);
117 VDUP(vector2, , uint, u, 8, 8, 1);
118 VDUP(vector2, , uint, u, 16, 4, 13);
119 VDUP(vector2, , uint, u, 32, 2, 8);
120 VDUP(vector2, , float, f, 32, 2, 8.3f);
121 VDUP(vector2, q, int, s, 8, 16, 10);
122 VDUP(vector2, q, int, s, 16, 8, -12);
123 VDUP(vector2, q, int, s, 32, 4, 32);
124 VDUP(vector2, q, uint, u, 8, 16, 10);
125 VDUP(vector2, q, uint, u, 16, 8, 12);
126 VDUP(vector2, q, uint, u, 32, 4, 32);
127 VDUP(vector2, q, float, f, 32, 4, 32.12f);
128 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
129 VDUP(vector2, , float, f, 16, 4, 8.3f);
130 VDUP(vector2, q, float, f, 16, 8, 32.12f);
131 #endif
132
133 /* Execute the tests. */
134 TEST_VABD(, int, s, 8, 8);
135 TEST_VABD(, int, s, 16, 4);
136 TEST_VABD(, int, s, 32, 2);
137 TEST_VABD(, uint, u, 8, 8);
138 TEST_VABD(, uint, u, 16, 4);
139 TEST_VABD(, uint, u, 32, 2);
140 TEST_VABD(, float, f, 32, 2);
141 TEST_VABD(q, int, s, 8, 16);
142 TEST_VABD(q, int, s, 16, 8);
143 TEST_VABD(q, int, s, 32, 4);
144 TEST_VABD(q, uint, u, 8, 16);
145 TEST_VABD(q, uint, u, 16, 8);
146 TEST_VABD(q, uint, u, 32, 4);
147 TEST_VABD(q, float, f, 32, 4);
148
149 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
150 TEST_VABD(, float, f, 16, 4);
151 TEST_VABD(q, float, f, 16, 8);
152 #endif
153
154 CHECK(TEST_MSG, int, 8, 8, PRIx8, expected, "");
155 CHECK(TEST_MSG, int, 16, 4, PRIx16, expected, "");
156 CHECK(TEST_MSG, int, 32, 2, PRIx32, expected, "");
157 CHECK(TEST_MSG, uint, 8, 8, PRIx8, expected, "");
158 CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected, "");
159 CHECK(TEST_MSG, uint, 32, 2, PRIx32, expected, "");
160 CHECK_FP(TEST_MSG, float, 32, 2, PRIx32, expected, "");
161 CHECK(TEST_MSG, int, 8, 16, PRIx8, expected, "");
162 CHECK(TEST_MSG, int, 16, 8, PRIx16, expected, "");
163 CHECK(TEST_MSG, int, 32, 4, PRIx32, expected, "");
164 CHECK(TEST_MSG, uint, 8, 16, PRIx8, expected, "");
165 CHECK(TEST_MSG, uint, 16, 8, PRIx16, expected, "");
166 CHECK(TEST_MSG, uint, 32, 4, PRIx32, expected, "");
167 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected, "");
168 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
169 CHECK_FP(TEST_MSG, float, 16, 4, PRIx16, expected, "");
170 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected, "");
171 #endif
172
173 /* Extra FP tests with special values (-0.0, ....) */
174 VDUP(vector1, q, float, f, 32, 4, -0.0f);
175 VDUP(vector2, q, float, f, 32, 4, 0.0);
176 TEST_VABD(q, float, f, 32, 4);
177 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_float32, " FP special (-0.0)");
178
179 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
180 VDUP(vector1, q, float, f, 16, 8, -0.0f);
181 VDUP(vector2, q, float, f, 16, 8, 0.0);
182 TEST_VABD(q, float, f, 16, 8);
183 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_float16,
184 " FP special (-0.0)");
185 #endif
186
187 /* Extra FP tests with special values (-0.0, ....) */
188 VDUP(vector1, q, float, f, 32, 4, 0.0f);
189 VDUP(vector2, q, float, f, 32, 4, -0.0);
190 TEST_VABD(q, float, f, 32, 4);
191 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_float32, " FP special (-0.0)");
192
193 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
194 VDUP(vector1, q, float, f, 16, 8, 0.0f);
195 VDUP(vector2, q, float, f, 16, 8, -0.0);
196 TEST_VABD(q, float, f, 16, 8);
197 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_float16,
198 " FP special (-0.0)");
199 #endif
200 }
201
main(void)202 int main (void)
203 {
204 exec_vabd ();
205 return 0;
206 }
207