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 | |