1*f3782652STreehugger Robot /*
2*f3782652STreehugger Robot
3*f3782652STreehugger Robot Copyright (c) 2009, 2010, 2011 STMicroelectronics
4*f3782652STreehugger Robot Written by Christophe Lyon
5*f3782652STreehugger Robot
6*f3782652STreehugger Robot Permission is hereby granted, free of charge, to any person obtaining a copy
7*f3782652STreehugger Robot of this software and associated documentation files (the "Software"), to deal
8*f3782652STreehugger Robot in the Software without restriction, including without limitation the rights
9*f3782652STreehugger Robot to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10*f3782652STreehugger Robot copies of the Software, and to permit persons to whom the Software is
11*f3782652STreehugger Robot furnished to do so, subject to the following conditions:
12*f3782652STreehugger Robot
13*f3782652STreehugger Robot The above copyright notice and this permission notice shall be included in
14*f3782652STreehugger Robot all copies or substantial portions of the Software.
15*f3782652STreehugger Robot
16*f3782652STreehugger Robot THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*f3782652STreehugger Robot IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*f3782652STreehugger Robot FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*f3782652STreehugger Robot AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*f3782652STreehugger Robot LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*f3782652STreehugger Robot OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22*f3782652STreehugger Robot THE SOFTWARE.
23*f3782652STreehugger Robot
24*f3782652STreehugger Robot */
25*f3782652STreehugger Robot
26*f3782652STreehugger Robot #if defined(__arm__) || defined(__aarch64__)
27*f3782652STreehugger Robot #include <arm_neon.h>
28*f3782652STreehugger Robot #else
29*f3782652STreehugger Robot #include "stm-arm-neon.h"
30*f3782652STreehugger Robot #endif
31*f3782652STreehugger Robot
32*f3782652STreehugger Robot #include "stm-arm-neon-ref.h"
33*f3782652STreehugger Robot
34*f3782652STreehugger Robot #if defined(__cplusplus)
35*f3782652STreehugger Robot #include <cstdint>
36*f3782652STreehugger Robot #else
37*f3782652STreehugger Robot #if defined(_MSC_VER)
38*f3782652STreehugger Robot #include "msstdint.h"
39*f3782652STreehugger Robot #else
40*f3782652STreehugger Robot #include <stdint.h>
41*f3782652STreehugger Robot #endif
42*f3782652STreehugger Robot #endif
43*f3782652STreehugger Robot
44*f3782652STreehugger Robot #ifndef INSN_NAME
45*f3782652STreehugger Robot #define INSN_NAME vaddhn
46*f3782652STreehugger Robot #define TEST_MSG "VADDHN"
47*f3782652STreehugger Robot #endif
48*f3782652STreehugger Robot
49*f3782652STreehugger Robot #define FNNAME1(NAME) void exec_ ## NAME (void)
50*f3782652STreehugger Robot #define FNNAME(NAME) FNNAME1(NAME)
51*f3782652STreehugger Robot
FNNAME(INSN_NAME)52*f3782652STreehugger Robot FNNAME (INSN_NAME)
53*f3782652STreehugger Robot {
54*f3782652STreehugger Robot /* Basic test: vec64=vaddhn(vec128_a, vec128_b), then store the result. */
55*f3782652STreehugger Robot #define TEST_VADDHN1(INSN, T1, T2, W, W2, N) \
56*f3782652STreehugger Robot VECT_VAR(vector64, T1, W2, N) = INSN##_##T2##W(VECT_VAR(vector1, T1, W, N), \
57*f3782652STreehugger Robot VECT_VAR(vector2, T1, W, N)); \
58*f3782652STreehugger Robot vst1_##T2##W2(VECT_VAR(result, T1, W2, N), VECT_VAR(vector64, T1, W2, N))
59*f3782652STreehugger Robot
60*f3782652STreehugger Robot #define TEST_VADDHN(INSN, T1, T2, W, W2, N) \
61*f3782652STreehugger Robot TEST_VADDHN1(INSN, T1, T2, W, W2, N)
62*f3782652STreehugger Robot
63*f3782652STreehugger Robot /* With ARM RVCT, we need to declare variables before any executable
64*f3782652STreehugger Robot statement */
65*f3782652STreehugger Robot DECL_VARIABLE_64BITS_VARIANTS(vector64);
66*f3782652STreehugger Robot DECL_VARIABLE_128BITS_VARIANTS(vector1);
67*f3782652STreehugger Robot DECL_VARIABLE_128BITS_VARIANTS(vector2);
68*f3782652STreehugger Robot
69*f3782652STreehugger Robot clean_results ();
70*f3782652STreehugger Robot
71*f3782652STreehugger Robot /* Fill input vector1 and vector2 with arbitrary values */
72*f3782652STreehugger Robot VDUP(vector1, q, int, s, 16, 8, 50*(UINT8_MAX+1));
73*f3782652STreehugger Robot VDUP(vector1, q, int, s, 32, 4, 50*(UINT16_MAX+1));
74*f3782652STreehugger Robot VDUP(vector1, q, int, s, 64, 2, 24*((uint64_t)UINT32_MAX+1));
75*f3782652STreehugger Robot VDUP(vector1, q, uint, u, 16, 8, 3*(UINT8_MAX+1));
76*f3782652STreehugger Robot VDUP(vector1, q, uint, u, 32, 4, 55*(UINT16_MAX+1));
77*f3782652STreehugger Robot VDUP(vector1, q, uint, u, 64, 2, 3*((uint64_t)UINT32_MAX+1));
78*f3782652STreehugger Robot
79*f3782652STreehugger Robot VDUP(vector2, q, int, s, 16, 8, (uint16_t)UINT8_MAX);
80*f3782652STreehugger Robot VDUP(vector2, q, int, s, 32, 4, (uint32_t)UINT16_MAX);
81*f3782652STreehugger Robot VDUP(vector2, q, int, s, 64, 2, (uint64_t)UINT32_MAX);
82*f3782652STreehugger Robot VDUP(vector2, q, uint, u, 16, 8, (uint16_t)UINT8_MAX);
83*f3782652STreehugger Robot VDUP(vector2, q, uint, u, 32, 4, (uint32_t)UINT16_MAX);
84*f3782652STreehugger Robot VDUP(vector2, q, uint, u, 64, 2, (uint64_t)UINT32_MAX);
85*f3782652STreehugger Robot
86*f3782652STreehugger Robot TEST_VADDHN(INSN_NAME, int, s, 16, 8, 8);
87*f3782652STreehugger Robot TEST_VADDHN(INSN_NAME, int, s, 32, 16, 4);
88*f3782652STreehugger Robot TEST_VADDHN(INSN_NAME, int, s, 64, 32, 2);
89*f3782652STreehugger Robot TEST_VADDHN(INSN_NAME, uint, u, 16, 8, 8);
90*f3782652STreehugger Robot TEST_VADDHN(INSN_NAME, uint, u, 32, 16, 4);
91*f3782652STreehugger Robot TEST_VADDHN(INSN_NAME, uint, u, 64, 32, 2);
92*f3782652STreehugger Robot
93*f3782652STreehugger Robot dump_results_hex (TEST_MSG);
94*f3782652STreehugger Robot }
95