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,8) [] = { 0x11, 0x10, 0xf, 0xe,
7 0xd, 0xc, 0xb, 0xa };
8 VECT_VAR_DECL(expected,int,32,4) [] = { 0x3, 0x2, 0x1, 0x0 };
9 VECT_VAR_DECL(expected,int,64,2) [] = { 0x18, 0x17 };
10 VECT_VAR_DECL(expected,uint,16,8) [] = { 0xef, 0xf0, 0xf1, 0xf2,
11 0xf3, 0xf4, 0xf5, 0xf6 };
12 VECT_VAR_DECL(expected,uint,32,4) [] = { 0xffe3, 0xffe4, 0xffe5, 0xffe6 };
13 VECT_VAR_DECL(expected,uint,64,2) [] = { 0xffffffe8,
14 0xffffffe9 };
15
16 #define TEST_MSG "VABDL"
exec_vabdl(void)17 void exec_vabdl (void)
18 {
19 /* Basic test: v4=vabdl(v1,v2), then store the result. */
20 #define TEST_VABDL(T1, T2, W, W2, N) \
21 VECT_VAR(vector_res, T1, W2, N) = \
22 vabdl_##T2##W(VECT_VAR(vector1, T1, W, N), \
23 VECT_VAR(vector2, T1, W, N)); \
24 vst1q_##T2##W2(VECT_VAR(result, T1, W2, N), VECT_VAR(vector_res, T1, W2, N))
25
26 #define DECL_VABDL_VAR_LONG(VAR) \
27 DECL_VARIABLE(VAR, int, 16, 8); \
28 DECL_VARIABLE(VAR, int, 32, 4); \
29 DECL_VARIABLE(VAR, int, 64, 2); \
30 DECL_VARIABLE(VAR, uint, 16, 8); \
31 DECL_VARIABLE(VAR, uint, 32, 4); \
32 DECL_VARIABLE(VAR, uint, 64, 2)
33
34 #define DECL_VABDL_VAR_SHORT(VAR) \
35 DECL_VARIABLE(VAR, int, 8, 8); \
36 DECL_VARIABLE(VAR, int, 16, 4); \
37 DECL_VARIABLE(VAR, int, 32, 2); \
38 DECL_VARIABLE(VAR, uint, 8, 8); \
39 DECL_VARIABLE(VAR, uint, 16, 4); \
40 DECL_VARIABLE(VAR, uint, 32, 2)
41
42 DECL_VABDL_VAR_SHORT(vector1);
43 DECL_VABDL_VAR_SHORT(vector2);
44 DECL_VABDL_VAR_LONG(vector_res);
45
46 clean_results ();
47
48 /* Initialize input "vector1" from "buffer". */
49 VLOAD(vector1, buffer, , int, s, 8, 8);
50 VLOAD(vector1, buffer, , int, s, 16, 4);
51 VLOAD(vector1, buffer, , int, s, 32, 2);
52 VLOAD(vector1, buffer, , uint, u, 8, 8);
53 VLOAD(vector1, buffer, , uint, u, 16, 4);
54 VLOAD(vector1, buffer, , uint, u, 32, 2);
55
56 /* Choose init value arbitrarily. */
57 VDUP(vector2, , int, s, 8, 8, 1);
58 VDUP(vector2, , int, s, 16, 4, -13);
59 VDUP(vector2, , int, s, 32, 2, 8);
60 VDUP(vector2, , uint, u, 8, 8, 1);
61 VDUP(vector2, , uint, u, 16, 4, 13);
62 VDUP(vector2, , uint, u, 32, 2, 8);
63
64 /* Execute the tests. */
65 TEST_VABDL(int, s, 8, 16, 8);
66 TEST_VABDL(int, s, 16, 32, 4);
67 TEST_VABDL(int, s, 32, 64, 2);
68 TEST_VABDL(uint, u, 8, 16, 8);
69 TEST_VABDL(uint, u, 16, 32, 4);
70 TEST_VABDL(uint, u, 32, 64, 2);
71
72 CHECK(TEST_MSG, int, 16, 8, PRIx16, expected, "");
73 CHECK(TEST_MSG, int, 32, 4, PRIx32, expected, "");
74 CHECK(TEST_MSG, int, 64, 2, PRIx64, expected, "");
75 CHECK(TEST_MSG, uint, 16, 8, PRIx16, expected, "");
76 CHECK(TEST_MSG, uint, 32, 4, PRIx32, expected, "");
77 CHECK(TEST_MSG, uint, 64, 2, PRIx64, expected, "");
78 }
79
main(void)80 int main (void)
81 {
82 exec_vabdl ();
83 return 0;
84 }
85