1 /*
2  * intern.h
3  *
4  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5  * See https://llvm.org/LICENSE.txt for license information.
6  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7  */
8 
9 #ifndef mathtest_intern_h
10 #define mathtest_intern_h
11 
12 #include <mpfr.h>
13 #include <mpc.h>
14 
15 #include "types.h"
16 #include "wrappers.h"
17 
18 /* Generic function pointer. */
19 typedef void (*funcptr)(void);
20 
21 /* Pointers to test function types. */
22 typedef int    (*testfunc1)(mpfr_t, mpfr_t, mpfr_rnd_t);
23 typedef int    (*testfunc2)(mpfr_t, mpfr_t, mpfr_t, mpfr_rnd_t);
24 typedef int    (*testrred)(mpfr_t, mpfr_t, int *);
25 typedef char * (*testsemi1)(uint32 *, uint32 *);
26 typedef char * (*testsemi2)(uint32 *, uint32 *, uint32 *);
27 typedef char * (*testsemi2f)(uint32 *, uint32 *, uint32 *);
28 typedef char * (*testldexp)(uint32 *, uint32 *, uint32 *);
29 typedef char * (*testfrexp)(uint32 *, uint32 *, uint32 *);
30 typedef char * (*testmodf)(uint32 *, uint32 *, uint32 *);
31 typedef char * (*testclassify)(uint32 *, uint32 *);
32 typedef char * (*testclassifyf)(uint32 *, uint32 *);
33 
34 typedef int    (*testfunc1c)(mpc_t, mpc_t, mpc_rnd_t);
35 typedef int    (*testfunc2c)(mpc_t, mpc_t, mpc_t, mpc_rnd_t);
36 
37 typedef int    (*testfunc1cr)(mpfr_t, mpc_t, mpfr_rnd_t);
38 
39 /* Pointer to a function that generates random test cases. */
40 typedef void (*casegen)(uint32 *, uint32, uint32);
41 
42 /*
43  * List of testable functions, their types, and their testable range.
44  */
45 enum {
46     args1,                             /* afloat-based, one argument */
47     args1f,                            /* same as args1 but in single prec */
48     args2,                             /* afloat-based, two arguments */
49     args2f,                            /* same as args2 but in single prec */
50     rred,                              /* afloat-based, one arg, aux return */
51     rredf,                             /* same as rred but in single prec */
52     semi1,                             /* seminumerical, one argument */
53     semi1f,                            /* seminumerical, 1 arg, float */
54     semi2,                             /* seminumerical, two arguments */
55     semi2f,                            /* seminumerical, 2 args, floats */
56     t_ldexp,                           /* dbl * int -> dbl */
57     t_ldexpf,                          /* sgl * int -> sgl */
58     t_frexp,                           /* dbl -> dbl * int */
59     t_frexpf,                          /* sgl -> sgl * int */
60     t_modf,                            /* dbl -> dbl * dbl */
61     t_modff,                           /* sgl -> sgl * sgl */
62     classify,                          /* classify double: dbl -> int */
63     classifyf,                         /* classify float: flt -> int */
64     compare,                           /* compare doubles, returns int */
65     comparef,                          /* compare floats, returns int */
66 
67     args1c,                            /* acomplex-base, one argument */
68     args2c,
69     args1fc,
70     args2fc,
71     args1cr,                           /* dbl-complex -> complex */
72     args1fcr                           /* sgl-complex -> complex */
73 };
74 
75 typedef struct __testable Testable;
76 struct __testable {
77     char *name;
78     funcptr func;
79     int type;
80     wrapperfunc wrappers[MAXWRAPPERS];
81     casegen cases; /* complex functions use the same casegen for both real and complex args */
82     uint32 caseparam1, caseparam2;
83 };
84 
85 extern Testable functions[];
86 extern const int nfunctions;
87 
88 extern void init_pi(void);
89 
90 int nargs_(Testable* f);
91 
92 #endif
93