blob: 66c89068f610e0a7ed7ffed4ff36a84db6617e78 [file] [log] [blame]
/* Template file for unary scalar operator validation.
This file is meant to be included by test files for unary scalar
operations. */
/* Check for required settings. */
#ifndef INSN_NAME
#error INSN_NAME (the intrinsic to test) must be defined.
#endif
#ifndef INPUT_TYPE
#error INPUT_TYPE (basic type of an input value) must be defined.
#endif
#ifndef SCALAR_OPERANDS
#ifndef EXPECTED
#error EXPECTED (an array of expected output values) must be defined.
#endif
#endif
#ifndef OUTPUT_TYPE
#error OUTPUT_TYPE (basic type of an output value) must be defined.
#endif
#ifndef OUTPUT_TYPE_SIZE
#error OUTPUT_TYPE_SIZE (size in bits of an output value) must be defined.
#endif
/* Optional settings. */
/* SCALAR_OPERANDS: Defined iff the intrinsic has a scalar operand.
SCALAR_1, SCALAR_2, .., SCALAR_4: If SCALAR_OPERANDS is defined, SCALAR_<n>
is the scalar and EXPECTED_<n> is array of expected values.
INPUT: Input values for the first parameter. Must be of type INPUT_TYPE. */
/* Additional comments for the error message. */
#ifndef COMMENT
#define COMMENT ""
#endif
#ifndef TEST_MSG
#define TEST_MSG "unnamed test"
#endif
/* The test framework. */
#include <stdio.h>
extern void abort ();
#define INFF __builtin_inf ()
/* Stringify a macro. */
#define STR0(A) #A
#define STR(A) STR0 (A)
/* Macro concatenation. */
#define CAT0(A, B) A##B
#define CAT(A, B) CAT0 (A, B)
/* Format strings for error reporting. */
#define FMT16 "0x%04x"
#define FMT32 "0x%08x"
#define FMT64 "0x%016x"
#define FMT CAT (FMT,OUTPUT_TYPE_SIZE)
/* Type construction: forms TS_t, where T is the base type and S the size in
bits. */
#define MK_TYPE0(T, S) T##S##_t
#define MK_TYPE(T, S) MK_TYPE0 (T, S)
/* Convenience types for input and output data. */
typedef MK_TYPE (uint, OUTPUT_TYPE_SIZE) output_hex_type;
/* Conversion between typed values and their hexadecimal representation. */
typedef union
{
OUTPUT_TYPE value;
output_hex_type hex;
} output_conv_type;
/* Default input values. */
float16_t input_1_float16_t[] =
{
0.0, -0.0,
2.0, 3.1,
20.0, 0.40,
-2.3, 1.33,
-7.6, 0.31,
0.3353, 0.5,
1.0, 13.13,
-6.3, 20.0,
(float16_t)INFF, (float16_t)-INFF,
};
#ifndef INPUT
#define INPUT CAT(input_1_,INPUT_TYPE)
#endif
/* Support macros and routines for the test function. */
#define CHECK() \
{ \
output_conv_type actual; \
output_conv_type expect; \
\
expect.hex = ((output_hex_type*)EXPECTED)[index]; \
actual.value = INSN_NAME ((INPUT)[index]); \
\
if (actual.hex != expect.hex) \
{ \
fprintf (stderr, \
"ERROR in %s (%s line %d), buffer %s, " \
"index %d: got " \
FMT " != " FMT "\n", \
TEST_MSG, __FILE__, __LINE__, \
STR (EXPECTED), index, \
actual.hex, expect.hex); \
abort (); \
} \
fprintf (stderr, "CHECKED %s %s\n", \
STR (EXPECTED), TEST_MSG); \
}
#define CHECK_N(SCALAR, EXPECTED) \
{ \
output_conv_type actual; \
output_conv_type expect; \
\
expect.hex \
= ((output_hex_type*)EXPECTED)[index]; \
actual.value = INSN_NAME ((INPUT)[index], (SCALAR)); \
\
if (actual.hex != expect.hex) \
{ \
fprintf (stderr, \
"ERROR in %s (%s line %d), buffer %s, " \
"index %d: got " \
FMT " != " FMT "\n", \
TEST_MSG, __FILE__, __LINE__, \
STR (EXPECTED), index, \
actual.hex, expect.hex); \
abort (); \
} \
fprintf (stderr, "CHECKED %s %s\n", \
STR (EXPECTED), TEST_MSG); \
}
#define FNNAME1(NAME) exec_ ## NAME
#define FNNAME(NAME) FNNAME1 (NAME)
/* The test function. */
void
FNNAME (INSN_NAME) (void)
{
/* Basic test: y[i] = OP (x[i]), for each INPUT[i], then compare the result
against EXPECTED[i]. */
const int num_tests = sizeof (INPUT) / sizeof (INPUT[0]);
int index;
for (index = 0; index < num_tests; index++)
{
#if defined (SCALAR_OPERANDS)
#ifdef SCALAR_1
CHECK_N (SCALAR_1, EXPECTED_1);
#endif
#ifdef SCALAR_2
CHECK_N (SCALAR_2, EXPECTED_2);
#endif
#ifdef SCALAR_3
CHECK_N (SCALAR_3, EXPECTED_3);
#endif
#ifdef SCALAR_4
CHECK_N (SCALAR_4, EXPECTED_4);
#endif
#else /* !defined (SCALAR_OPERAND). */
CHECK ();
#endif
}
#ifdef EXTRA_TESTS
EXTRA_TESTS ();
#endif
}
int
main (void)
{
FNNAME (INSN_NAME) ();
return 0;
}