1/* Template file for binary scalar operator validation.
2
3   This file is meant to be included by test files for binary scalar
4   operations.  */
5
6/* Check for required settings.  */
7
8#ifndef INSN_NAME
9#error INSN_NAME (the intrinsic to test) must be defined.
10#endif
11
12#ifndef INPUT_TYPE
13#error INPUT_TYPE (basic type of an input value) must be defined.
14#endif
15
16#ifndef OUTPUT_TYPE
17#error OUTPUT_TYPE (basic type of an output value) must be defined.
18#endif
19
20#ifndef OUTPUT_TYPE_SIZE
21#error OUTPUT_TYPE_SIZE (size in bits of an output value) must be defined.
22#endif
23
24/* Optional settings:
25
26   INPUT_1: Input values for the first parameter.  Must be of type INPUT_TYPE.
27   INPUT_2: Input values for the first parameter.  Must be of type
28   INPUT_TYPE.  */
29
30#ifndef TEST_MSG
31#define TEST_MSG "unnamed test"
32#endif
33
34/* The test framework.  */
35
36#include <stdio.h>
37
38extern void abort ();
39
40#define INFF __builtin_inf ()
41
42/* Stringify a macro.  */
43#define STR0(A) #A
44#define STR(A) STR0 (A)
45
46/* Macro concatenation.  */
47#define CAT0(A, B) A##B
48#define CAT(A, B) CAT0 (A, B)
49
50/* Format strings for error reporting.  */
51#define FMT16 "0x%04x"
52#define FMT32 "0x%08x"
53#define FMT CAT (FMT,OUTPUT_TYPE_SIZE)
54
55/* Type construction: forms TS_t, where T is the base type and S the size in
56   bits.  */
57#define MK_TYPE0(T, S) T##S##_t
58#define MK_TYPE(T, S) MK_TYPE0 (T, S)
59
60/* Convenience types for input and output data.  */
61typedef MK_TYPE (uint, OUTPUT_TYPE_SIZE) output_hex_type;
62
63/* Conversion between typed values and their hexadecimal representation.  */
64typedef union
65{
66  OUTPUT_TYPE value;
67  output_hex_type hex;
68} output_conv_type;
69
70/* Default input values.  */
71
72float16_t input_1_float16_t[] =
73{
74  0.0, -0.0,
75  2.0, 3.1,
76  20.0, 0.40,
77  -2.3, 1.33,
78  -7.6, 0.31,
79  0.3353, 0.5,
80  1.0, 13.13,
81  -6.3, 20.0,
82  (float16_t)INFF, (float16_t)-INFF,
83};
84
85float16_t input_2_float16_t[] =
86{
87  1.0, 1.0,
88  -4.33, 100.0,
89  30.0, -0.02,
90  0.5, -7.231,
91  -6.3, 20.0,
92  -7.231, 2.3,
93  -7.6, 5.1,
94  0.31, 0.33353,
95  (float16_t)-INFF, (float16_t)INFF,
96};
97
98#ifndef INPUT_1
99#define INPUT_1 CAT (input_1_,INPUT_TYPE)
100#endif
101
102#ifndef INPUT_2
103#define INPUT_2 CAT (input_2_,INPUT_TYPE)
104#endif
105
106/* Support macros and routines for the test function.  */
107
108#define CHECK()						\
109  {								\
110    output_conv_type actual;					\
111    output_conv_type expect;					\
112								\
113    expect.hex = ((output_hex_type*)EXPECTED)[index];		\
114    actual.value = INSN_NAME ((INPUT_1)[index],			\
115			      (INPUT_2)[index]);		\
116								\
117    if (actual.hex != expect.hex)				\
118      {								\
119	fprintf (stderr,					\
120		 "ERROR in %s (%s line %d), buffer %s, "	\
121		 "index %d: got "				\
122		 FMT " != " FMT "\n",				\
123		 TEST_MSG, __FILE__, __LINE__,			\
124		 STR (EXPECTED), index,				\
125		 actual.hex, expect.hex);			\
126	abort ();						\
127      }								\
128    fprintf (stderr, "CHECKED %s %s\n",				\
129	     STR (EXPECTED), TEST_MSG);				\
130  }
131
132#define FNNAME1(NAME) exec_ ## NAME
133#define FNNAME(NAME) FNNAME1 (NAME)
134
135/* The test function.  */
136
137void
138FNNAME (INSN_NAME) (void)
139{
140  /* Basic test: y[i] = OP (x[i]), for each INPUT[i], then compare the result
141     against EXPECTED[i].  */
142
143  const int num_tests = sizeof (INPUT_1) / sizeof (INPUT_1[0]);
144  int index;
145
146  for (index = 0; index < num_tests; index++)
147    CHECK ();
148
149#ifdef EXTRA_TESTS
150  EXTRA_TESTS ();
151#endif
152}
153
154int
155main (void)
156{
157  FNNAME (INSN_NAME) ();
158
159  return 0;
160}
161