1073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon/*
2073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
3c94d4c1e27bb7e2b2869cc230872669df1459533Christophe LyonCopyright (c) 2009, 2010, 2011, 2012 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
26073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon/* Template file for binary saturating operator validation */
27073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
281775be0bcaa673c19bb1f60f0c1bce1b91cdb414Christophe Lyon#if defined(__arm__) || defined(__aarch64__)
29073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#include <arm_neon.h>
30073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#else
310dab5f72da4b2434882b51b44ac377af9e3160feChristophe Lyon#include "stm-arm-neon.h"
32073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#endif
33073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
34073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#include "stm-arm-neon-ref.h"
35073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
36073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define FNNAME1(NAME) void exec_ ## NAME (void)
37073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define FNNAME(NAME) FNNAME1(NAME)
38073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
39073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonFNNAME (INSN_NAME)
40073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon{
41073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  /* vector_res = OP(vector1,vector2), then store the result.  */
42eb8034b39a424f157b7117141e23cdad329d5cc0Christophe Lyon
434a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon#define TEST_BINARY_SAT_OP1(INSN, Q, T1, T2, W, N)		\
44c1cc7826d74587e0dc1c855810633a219b161ab3Christophe Lyon  Set_Neon_Cumulative_Sat(0, VECT_VAR(vector_res, T1, W, N));	\
454a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon  VECT_VAR(vector_res, T1, W, N) =				\
464a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon    INSN##Q##_##T2##W(VECT_VAR(vector1, T1, W, N),		\
474a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon		      VECT_VAR(vector2, T1, W, N));		\
484a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon  vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N),			\
494a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon		    VECT_VAR(vector_res, T1, W, N));		\
504a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon  dump_neon_cumulative_sat(TEST_MSG, xSTR(INSN##Q##_##T2##W),	\
514a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon			   xSTR(T1), W, N)
52073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
53073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define TEST_BINARY_SAT_OP(INSN, Q, T1, T2, W, N)	\
54073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP1(INSN, Q, T1, T2, W, N)
55073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
56073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  /* With ARM RVCT, we need to declare variables before any executable
57073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon     statement */
58073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  DECL_VARIABLE_ALL_VARIANTS(vector1);
59073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  DECL_VARIABLE_ALL_VARIANTS(vector2);
60073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  DECL_VARIABLE_ALL_VARIANTS(vector_res);
61073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
62073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  clean_results ();
63073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
64073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  /* Initialize input "vector1" from "buffer"  */
65f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  TEST_MACRO_ALL_VARIANTS_2_5(VLOAD, vector1, buffer);
66073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
67073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  /* Choose arbitrary initialization values */
68f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , int, s, 8, 8, 0x11);
69f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , int, s, 16, 4, 0x22);
70f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , int, s, 32, 2, 0x33);
71f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , int, s, 64, 1, 0x44);
72f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , uint, u, 8, 8, 0x55);
73f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , uint, u, 16, 4, 0x66);
74f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , uint, u, 32, 2, 0x77);
75f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, , uint, u, 64, 1, 0x88);
76f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon
77f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, int, s, 8, 16, 0x11);
78f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, int, s, 16, 8, 0x22);
79f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, int, s, 32, 4, 0x33);
80f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, int, s, 64, 2, 0x44);
81f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, uint, u, 8, 16, 0x55);
82f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, uint, u, 16, 8, 0x66);
83f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, uint, u, 32, 4, 0x77);
84f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon  VDUP(vector2, q, uint, u, 64, 2, 0x88);
85073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
864a6e5cc95176769664bc9e56d4e7c92b7a2fc816Christophe Lyon  fprintf(ref_file, "\n%s cumulative saturation output:\n", TEST_MSG);
87073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , int, s, 8, 8);
88073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , int, s, 16, 4);
89073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , int, s, 32, 2);
90073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , int, s, 64, 1);
91073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , uint, u, 8, 8);
92073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , uint, u, 16, 4);
93073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , uint, u, 32, 2);
94073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, , uint, u, 64, 1);
95073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
96073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, int, s, 8, 16);
97073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, int, s, 16, 8);
98073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, int, s, 32, 4);
99073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, int, s, 64, 2);
100073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, uint, u, 8, 16);
101073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, uint, u, 16, 8);
102073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, uint, u, 32, 4);
103073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  TEST_BINARY_SAT_OP(INSN_NAME, q, uint, u, 64, 2);
104073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
105073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  dump_results_hex (TEST_MSG);
106073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon
107073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#ifdef EXTRA_TESTS
108073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon  EXTRA_TESTS();
109073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#endif
110073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon}
111