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,
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,
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) [] = { 0xe3, 0xe4, 0xe5, 0xe6,
35 0xe7, 0xe8, 0xe9, 0xea };
36 VECT_VAR_DECL(expected,uint,32,4) [] = { 0xffe1, 0xffe2,
38 VECT_VAR_DECL(expected,uint,64,2) [] = { 0xffffffe0, 0xffffffe1 };
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 };
49 #define INSN_NAME vaddw
50 #define TEST_MSG "VADDW"
53 #define FNNAME1(NAME) void exec_ ## NAME (void)
54 #define FNNAME(NAME) FNNAME1(NAME)
58 /* Basic test: y=vaddw(x1,x2), then store the result. */
59 #define TEST_VADDW1(INSN, T1, T2, W, W2, N) \
60 VECT_VAR(vector_res, T1, W2, N) = \
61 INSN##_##T2##W(VECT_VAR(vector, T1, W2, 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_VADDW(INSN, T1, T2, W, W2, N) \
66 TEST_VADDW1(INSN, T1, T2, W, W2, N)
68 DECL_VARIABLE(vector, int, 16, 8);
69 DECL_VARIABLE(vector, int, 32, 4);
70 DECL_VARIABLE(vector, int, 64, 2);
71 DECL_VARIABLE(vector, uint, 16, 8);
72 DECL_VARIABLE(vector, uint, 32, 4);
73 DECL_VARIABLE(vector, uint, 64, 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);
91 /* Initialize input "vector" from "buffer". */
92 VLOAD(vector, buffer, q, int, s, 16, 8);
93 VLOAD(vector, buffer, q, int, s, 32, 4);
94 VLOAD(vector, buffer, q, int, s, 64, 2);
95 VLOAD(vector, buffer, q, uint, u, 16, 8);
96 VLOAD(vector, buffer, q, uint, u, 32, 4);
97 VLOAD(vector, buffer, q, uint, u, 64, 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_VADDW(INSN_NAME, int, s, 8, 16, 8);
109 TEST_VADDW(INSN_NAME, int, s, 16, 32, 4);
110 TEST_VADDW(INSN_NAME, int, s, 32, 64, 2);
111 TEST_VADDW(INSN_NAME, uint, u, 8, 16, 8);
112 TEST_VADDW(INSN_NAME, uint, u, 16, 32, 4);
113 TEST_VADDW(INSN_NAME, uint, u, 32, 64, 2);
115 CHECK_RESULTS (TEST_MSG, "");