1073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon/*
2073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
3073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonCopyright (c) 2009, 2010, 2011 STMicroelectronics
4073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonWritten by Christophe Lyon
5073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
6073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonPermission is hereby granted, free of charge, to any person obtaining a copy
7073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonof this software and associated documentation files (the "Software"), to deal
8073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonin the Software without restriction, including without limitation the rights
9073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonto use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyoncopies of the Software, and to permit persons to whom the Software is
11073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonfurnished to do so, subject to the following conditions:
12073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
13073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonThe above copyright notice and this permission notice shall be included in
14073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonall copies or substantial portions of the Software.
15073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
16073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonTHE SOFTWARE.
23073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
24073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon*/
25073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
261775be0bcaa673c19bb1f60f0c1bce1b91cdb414Christophe Lyon#if defined(__arm__) || defined(__aarch64__)
27073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#include <arm_neon.h>
28073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#else
290dab5f72da4b2434882b51b44ac377af9e3160feChristophe Lyon#include "stm-arm-neon.h"
30073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#endif
31073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
32073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#include "stm-arm-neon-ref.h"
33073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
346f4d36f3deebf87b2710b5b7b5b30e8b2b60c285Christophe Lyon#if defined(__cplusplus)
356f4d36f3deebf87b2710b5b7b5b30e8b2b60c285Christophe Lyon#include <cstdint>
366f4d36f3deebf87b2710b5b7b5b30e8b2b60c285Christophe Lyon#else
37f3c80a50bd8b39a0a6d565448a0b1c921a902eb8Christophe Lyon#if defined(_MSC_VER)
38f3c80a50bd8b39a0a6d565448a0b1c921a902eb8Christophe Lyon#include "msstdint.h"
39f3c80a50bd8b39a0a6d565448a0b1c921a902eb8Christophe Lyon#else
40073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#include <stdint.h>
416f4d36f3deebf87b2710b5b7b5b30e8b2b60c285Christophe Lyon#endif
42f3c80a50bd8b39a0a6d565448a0b1c921a902eb8Christophe Lyon#endif
43073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
44073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#ifndef INSN_NAME
45073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define INSN_NAME vaddhn
46073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define TEST_MSG "VADDHN"
47073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#endif
48073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
49073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define FNNAME1(NAME) void exec_ ## NAME (void)
50073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define FNNAME(NAME) FNNAME1(NAME)
51073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
52073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonFNNAME (INSN_NAME)
53073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon{
54073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  /* Basic test: vec64=vaddhn(vec128_a, vec128_b), then store the result.  */
55073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define TEST_VADDHN1(INSN, T1, T2, W, W2, N)				\
56073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  VECT_VAR(vector64, T1, W2, N) = INSN##_##T2##W(VECT_VAR(vector1, T1, W, N), \
57073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon						 VECT_VAR(vector2, T1, W, N)); \
58073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  vst1_##T2##W2(VECT_VAR(result, T1, W2, N), VECT_VAR(vector64, T1, W2, N))
59073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
60073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define TEST_VADDHN(INSN, T1, T2, W, W2, N)				\
61073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_VADDHN1(INSN, T1, T2, W, W2, N)
62073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
63073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  /* With ARM RVCT, we need to declare variables before any executable
64073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon     statement */
65073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  DECL_VARIABLE_64BITS_VARIANTS(vector64);
66073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  DECL_VARIABLE_128BITS_VARIANTS(vector1);
67073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  DECL_VARIABLE_128BITS_VARIANTS(vector2);
68073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
69073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  clean_results ();
70073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
71073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  /* Fill input vector1 and vector2 with arbitrary values */
72f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector1, q, int, s, 16, 8, 50*(UINT8_MAX+1));
73f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector1, q, int, s, 32, 4, 50*(UINT16_MAX+1));
74f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector1, q, int, s, 64, 2, 24*((uint64_t)UINT32_MAX+1));
75f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector1, q, uint, u, 16, 8, 3*(UINT8_MAX+1));
76f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector1, q, uint, u, 32, 4, 55*(UINT16_MAX+1));
77f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector1, q, uint, u, 64, 2, 3*((uint64_t)UINT32_MAX+1));
78f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon
79f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, int, s, 16, 8, (uint16_t)UINT8_MAX);
80f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, int, s, 32, 4, (uint32_t)UINT16_MAX);
81f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, int, s, 64, 2, (uint64_t)UINT32_MAX);
82f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, uint, u, 16, 8, (uint16_t)UINT8_MAX);
83f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, uint, u, 32, 4, (uint32_t)UINT16_MAX);
84f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, uint, u, 64, 2, (uint64_t)UINT32_MAX);
85073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
86073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_VADDHN(INSN_NAME, int, s, 16, 8, 8);
87073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_VADDHN(INSN_NAME, int, s, 32, 16, 4);
88073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_VADDHN(INSN_NAME, int, s, 64, 32, 2);
89073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_VADDHN(INSN_NAME, uint, u, 16, 8, 8);
90073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_VADDHN(INSN_NAME, uint, u, 32, 16, 4);
91073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_VADDHN(INSN_NAME, uint, u, 64, 32, 2);
92073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
93073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  dump_results_hex (TEST_MSG);
94073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon}
95