xref: /freebsd-src/contrib/arm-optimized-routines/math/test/rtest/wrappers.c (revision 31914882fca502069810b9e9ddea4bcd8136a4f4)
1*31914882SAlex Richardson /*
2*31914882SAlex Richardson  * wrappers.c - wrappers to modify output of MPFR/MPC test functions
3*31914882SAlex Richardson  *
4*31914882SAlex Richardson  * Copyright (c) 2014-2019, Arm Limited.
5*31914882SAlex Richardson  * SPDX-License-Identifier: MIT
6*31914882SAlex Richardson  */
7*31914882SAlex Richardson 
8*31914882SAlex Richardson #include <assert.h>
9*31914882SAlex Richardson #include <stddef.h>
10*31914882SAlex Richardson #include <stdint.h>
11*31914882SAlex Richardson 
12*31914882SAlex Richardson #include "intern.h"
13*31914882SAlex Richardson 
14*31914882SAlex Richardson void wrapper_init(wrapperctx *ctx)
15*31914882SAlex Richardson {
16*31914882SAlex Richardson     int i;
17*31914882SAlex Richardson     ctx->nops = ctx->nresults = 0;
18*31914882SAlex Richardson     for (i = 0; i < 2; i++) {
19*31914882SAlex Richardson         ctx->mpfr_ops[i] = NULL;
20*31914882SAlex Richardson         ctx->mpc_ops[i] = NULL;
21*31914882SAlex Richardson         ctx->ieee_ops[i] = NULL;
22*31914882SAlex Richardson     }
23*31914882SAlex Richardson     ctx->mpfr_result = NULL;
24*31914882SAlex Richardson     ctx->mpc_result = NULL;
25*31914882SAlex Richardson     ctx->ieee_result = NULL;
26*31914882SAlex Richardson     ctx->need_regen = 0;
27*31914882SAlex Richardson }
28*31914882SAlex Richardson 
29*31914882SAlex Richardson void wrapper_op_real(wrapperctx *ctx, const mpfr_t r,
30*31914882SAlex Richardson                      int size, const uint32 *ieee)
31*31914882SAlex Richardson {
32*31914882SAlex Richardson     assert(ctx->nops < 2);
33*31914882SAlex Richardson     ctx->mpfr_ops[ctx->nops] = r;
34*31914882SAlex Richardson     ctx->ieee_ops[ctx->nops] = ieee;
35*31914882SAlex Richardson     ctx->size_ops[ctx->nops] = size;
36*31914882SAlex Richardson     ctx->nops++;
37*31914882SAlex Richardson }
38*31914882SAlex Richardson 
39*31914882SAlex Richardson void wrapper_op_complex(wrapperctx *ctx, const mpc_t c,
40*31914882SAlex Richardson                         int size, const uint32 *ieee)
41*31914882SAlex Richardson {
42*31914882SAlex Richardson     assert(ctx->nops < 2);
43*31914882SAlex Richardson     ctx->mpc_ops[ctx->nops] = c;
44*31914882SAlex Richardson     ctx->ieee_ops[ctx->nops] = ieee;
45*31914882SAlex Richardson     ctx->size_ops[ctx->nops] = size;
46*31914882SAlex Richardson     ctx->nops++;
47*31914882SAlex Richardson }
48*31914882SAlex Richardson 
49*31914882SAlex Richardson void wrapper_result_real(wrapperctx *ctx, mpfr_t r,
50*31914882SAlex Richardson                          int size, uint32 *ieee)
51*31914882SAlex Richardson {
52*31914882SAlex Richardson     assert(ctx->nresults < 1);
53*31914882SAlex Richardson     ctx->mpfr_result = r;
54*31914882SAlex Richardson     ctx->ieee_result = ieee;
55*31914882SAlex Richardson     ctx->size_result = size;
56*31914882SAlex Richardson     ctx->nresults++;
57*31914882SAlex Richardson }
58*31914882SAlex Richardson 
59*31914882SAlex Richardson void wrapper_result_complex(wrapperctx *ctx, mpc_t c,
60*31914882SAlex Richardson                             int size, uint32 *ieee)
61*31914882SAlex Richardson {
62*31914882SAlex Richardson     assert(ctx->nresults < 1);
63*31914882SAlex Richardson     ctx->mpc_result = c;
64*31914882SAlex Richardson     ctx->ieee_result = ieee;
65*31914882SAlex Richardson     ctx->size_result = size;
66*31914882SAlex Richardson     ctx->nresults++;
67*31914882SAlex Richardson }
68*31914882SAlex Richardson 
69*31914882SAlex Richardson int wrapper_run(wrapperctx *ctx, wrapperfunc wrappers[MAXWRAPPERS])
70*31914882SAlex Richardson {
71*31914882SAlex Richardson     int i;
72*31914882SAlex Richardson     for (i = 0; i < MAXWRAPPERS && wrappers[i]; i++)
73*31914882SAlex Richardson         wrappers[i](ctx);
74*31914882SAlex Richardson     universal_wrapper(ctx);
75*31914882SAlex Richardson     return ctx->need_regen;
76*31914882SAlex Richardson }
77*31914882SAlex Richardson 
78*31914882SAlex Richardson mpfr_srcptr wrapper_get_mpfr(wrapperctx *ctx, int op)
79*31914882SAlex Richardson {
80*31914882SAlex Richardson     if (op < 0) {
81*31914882SAlex Richardson         assert(ctx->mpfr_result);
82*31914882SAlex Richardson         return ctx->mpfr_result;
83*31914882SAlex Richardson     } else {
84*31914882SAlex Richardson         assert(ctx->mpfr_ops[op]);
85*31914882SAlex Richardson         return ctx->mpfr_ops[op];
86*31914882SAlex Richardson     }
87*31914882SAlex Richardson }
88*31914882SAlex Richardson 
89*31914882SAlex Richardson const uint32 *wrapper_get_ieee(wrapperctx *ctx, int op)
90*31914882SAlex Richardson {
91*31914882SAlex Richardson     if (op < 0) {
92*31914882SAlex Richardson         assert(ctx->mpfr_result);
93*31914882SAlex Richardson         return ctx->ieee_result;
94*31914882SAlex Richardson     } else {
95*31914882SAlex Richardson         assert(ctx->mpfr_ops[op]);
96*31914882SAlex Richardson         return ctx->ieee_ops[op];
97*31914882SAlex Richardson     }
98*31914882SAlex Richardson }
99*31914882SAlex Richardson 
100*31914882SAlex Richardson int wrapper_get_nops(wrapperctx *ctx)
101*31914882SAlex Richardson {
102*31914882SAlex Richardson     return ctx->nops;
103*31914882SAlex Richardson }
104*31914882SAlex Richardson 
105*31914882SAlex Richardson int wrapper_get_size(wrapperctx *ctx, int op)
106*31914882SAlex Richardson {
107*31914882SAlex Richardson     if (op < 0) {
108*31914882SAlex Richardson         assert(ctx->mpfr_result || ctx->mpc_result);
109*31914882SAlex Richardson         return ctx->size_result;
110*31914882SAlex Richardson     } else {
111*31914882SAlex Richardson         assert(ctx->mpfr_ops[op] || ctx->mpc_ops[op]);
112*31914882SAlex Richardson         return ctx->size_ops[op];
113*31914882SAlex Richardson     }
114*31914882SAlex Richardson }
115*31914882SAlex Richardson 
116*31914882SAlex Richardson int wrapper_is_complex(wrapperctx *ctx, int op)
117*31914882SAlex Richardson {
118*31914882SAlex Richardson     if (op < 0) {
119*31914882SAlex Richardson         assert(ctx->mpfr_result || ctx->mpc_result);
120*31914882SAlex Richardson         return ctx->mpc_result != NULL;
121*31914882SAlex Richardson     } else {
122*31914882SAlex Richardson         assert(ctx->mpfr_ops[op] || ctx->mpc_ops[op]);
123*31914882SAlex Richardson         return ctx->mpc_ops[op] != NULL;
124*31914882SAlex Richardson     }
125*31914882SAlex Richardson }
126*31914882SAlex Richardson 
127*31914882SAlex Richardson mpc_srcptr wrapper_get_mpc(wrapperctx *ctx, int op)
128*31914882SAlex Richardson {
129*31914882SAlex Richardson     if (op < 0) {
130*31914882SAlex Richardson         assert(ctx->mpc_result);
131*31914882SAlex Richardson         return ctx->mpc_result;
132*31914882SAlex Richardson     } else {
133*31914882SAlex Richardson         assert(ctx->mpc_ops[op]);
134*31914882SAlex Richardson         return ctx->mpc_ops[op];
135*31914882SAlex Richardson     }
136*31914882SAlex Richardson }
137*31914882SAlex Richardson 
138*31914882SAlex Richardson mpfr_srcptr wrapper_get_mpfr_r(wrapperctx *ctx, int op)
139*31914882SAlex Richardson {
140*31914882SAlex Richardson     if (op < 0) {
141*31914882SAlex Richardson         assert(ctx->mpc_result);
142*31914882SAlex Richardson         return mpc_realref(ctx->mpc_result);
143*31914882SAlex Richardson     } else {
144*31914882SAlex Richardson         assert(ctx->mpc_ops[op]);
145*31914882SAlex Richardson         return mpc_realref(ctx->mpc_ops[op]);
146*31914882SAlex Richardson     }
147*31914882SAlex Richardson }
148*31914882SAlex Richardson 
149*31914882SAlex Richardson mpfr_srcptr wrapper_get_mpfr_i(wrapperctx *ctx, int op)
150*31914882SAlex Richardson {
151*31914882SAlex Richardson     if (op < 0) {
152*31914882SAlex Richardson         assert(ctx->mpc_result);
153*31914882SAlex Richardson         return mpc_imagref(ctx->mpc_result);
154*31914882SAlex Richardson     } else {
155*31914882SAlex Richardson         assert(ctx->mpc_ops[op]);
156*31914882SAlex Richardson         return mpc_imagref(ctx->mpc_ops[op]);
157*31914882SAlex Richardson     }
158*31914882SAlex Richardson }
159*31914882SAlex Richardson 
160*31914882SAlex Richardson const uint32 *wrapper_get_ieee_r(wrapperctx *ctx, int op)
161*31914882SAlex Richardson {
162*31914882SAlex Richardson     if (op < 0) {
163*31914882SAlex Richardson         assert(ctx->mpc_result);
164*31914882SAlex Richardson         return ctx->ieee_result;
165*31914882SAlex Richardson     } else {
166*31914882SAlex Richardson         assert(ctx->mpc_ops[op]);
167*31914882SAlex Richardson         return ctx->ieee_ops[op];
168*31914882SAlex Richardson     }
169*31914882SAlex Richardson }
170*31914882SAlex Richardson 
171*31914882SAlex Richardson const uint32 *wrapper_get_ieee_i(wrapperctx *ctx, int op)
172*31914882SAlex Richardson {
173*31914882SAlex Richardson     if (op < 0) {
174*31914882SAlex Richardson         assert(ctx->mpc_result);
175*31914882SAlex Richardson         return ctx->ieee_result + 4;
176*31914882SAlex Richardson     } else {
177*31914882SAlex Richardson         assert(ctx->mpc_ops[op]);
178*31914882SAlex Richardson         return ctx->ieee_ops[op] + 2;
179*31914882SAlex Richardson     }
180*31914882SAlex Richardson }
181*31914882SAlex Richardson 
182*31914882SAlex Richardson void wrapper_set_sign(wrapperctx *ctx, uint32 sign)
183*31914882SAlex Richardson {
184*31914882SAlex Richardson     assert(ctx->mpfr_result);
185*31914882SAlex Richardson     ctx->ieee_result[0] |= (sign & 0x80000000U);
186*31914882SAlex Richardson }
187*31914882SAlex Richardson 
188*31914882SAlex Richardson void wrapper_set_sign_r(wrapperctx *ctx, uint32 sign)
189*31914882SAlex Richardson {
190*31914882SAlex Richardson     assert(ctx->mpc_result);
191*31914882SAlex Richardson     ctx->ieee_result[0] |= (sign & 0x80000000U);
192*31914882SAlex Richardson }
193*31914882SAlex Richardson 
194*31914882SAlex Richardson void wrapper_set_sign_i(wrapperctx *ctx, uint32 sign)
195*31914882SAlex Richardson {
196*31914882SAlex Richardson     assert(ctx->mpc_result);
197*31914882SAlex Richardson     ctx->ieee_result[4] |= (sign & 0x80000000U);
198*31914882SAlex Richardson }
199*31914882SAlex Richardson 
200*31914882SAlex Richardson void wrapper_set_nan(wrapperctx *ctx)
201*31914882SAlex Richardson {
202*31914882SAlex Richardson     assert(ctx->mpfr_result);
203*31914882SAlex Richardson     mpfr_set_nan(ctx->mpfr_result);
204*31914882SAlex Richardson     ctx->need_regen = 1;
205*31914882SAlex Richardson }
206*31914882SAlex Richardson 
207*31914882SAlex Richardson void wrapper_set_nan_r(wrapperctx *ctx)
208*31914882SAlex Richardson {
209*31914882SAlex Richardson     assert(ctx->mpc_result);
210*31914882SAlex Richardson     mpfr_set_nan(mpc_realref(ctx->mpc_result)); /* FIXME: better way? */
211*31914882SAlex Richardson     ctx->need_regen = 1;
212*31914882SAlex Richardson }
213*31914882SAlex Richardson 
214*31914882SAlex Richardson void wrapper_set_nan_i(wrapperctx *ctx)
215*31914882SAlex Richardson {
216*31914882SAlex Richardson     assert(ctx->mpc_result);
217*31914882SAlex Richardson     mpfr_set_nan(mpc_imagref(ctx->mpc_result)); /* FIXME: better way? */
218*31914882SAlex Richardson     ctx->need_regen = 1;
219*31914882SAlex Richardson }
220*31914882SAlex Richardson 
221*31914882SAlex Richardson void wrapper_set_int(wrapperctx *ctx, int val)
222*31914882SAlex Richardson {
223*31914882SAlex Richardson     assert(ctx->mpfr_result);
224*31914882SAlex Richardson     mpfr_set_si(ctx->mpfr_result, val, GMP_RNDN);
225*31914882SAlex Richardson     ctx->need_regen = 1;
226*31914882SAlex Richardson }
227*31914882SAlex Richardson 
228*31914882SAlex Richardson void wrapper_set_int_r(wrapperctx *ctx, int val)
229*31914882SAlex Richardson {
230*31914882SAlex Richardson     assert(ctx->mpc_result);
231*31914882SAlex Richardson     mpfr_set_si(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
232*31914882SAlex Richardson     ctx->need_regen = 1;
233*31914882SAlex Richardson }
234*31914882SAlex Richardson 
235*31914882SAlex Richardson void wrapper_set_int_i(wrapperctx *ctx, int val)
236*31914882SAlex Richardson {
237*31914882SAlex Richardson     assert(ctx->mpc_result);
238*31914882SAlex Richardson     mpfr_set_si(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
239*31914882SAlex Richardson     ctx->need_regen = 1;
240*31914882SAlex Richardson }
241*31914882SAlex Richardson 
242*31914882SAlex Richardson void wrapper_set_mpfr(wrapperctx *ctx, const mpfr_t val)
243*31914882SAlex Richardson {
244*31914882SAlex Richardson     assert(ctx->mpfr_result);
245*31914882SAlex Richardson     mpfr_set(ctx->mpfr_result, val, GMP_RNDN);
246*31914882SAlex Richardson     ctx->need_regen = 1;
247*31914882SAlex Richardson }
248*31914882SAlex Richardson 
249*31914882SAlex Richardson void wrapper_set_mpfr_r(wrapperctx *ctx, const mpfr_t val)
250*31914882SAlex Richardson {
251*31914882SAlex Richardson     assert(ctx->mpc_result);
252*31914882SAlex Richardson     mpfr_set(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
253*31914882SAlex Richardson     ctx->need_regen = 1;
254*31914882SAlex Richardson }
255*31914882SAlex Richardson 
256*31914882SAlex Richardson void wrapper_set_mpfr_i(wrapperctx *ctx, const mpfr_t val)
257*31914882SAlex Richardson {
258*31914882SAlex Richardson     assert(ctx->mpc_result);
259*31914882SAlex Richardson     mpfr_set(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
260*31914882SAlex Richardson     ctx->need_regen = 1;
261*31914882SAlex Richardson }
262