xref: /freebsd-src/contrib/arm-optimized-routines/math/test/rtest/wrappers.c (revision 072a4ba82a01476eaee33781ccd241033eefcf0b)
131914882SAlex Richardson /*
231914882SAlex Richardson  * wrappers.c - wrappers to modify output of MPFR/MPC test functions
331914882SAlex Richardson  *
431914882SAlex Richardson  * Copyright (c) 2014-2019, Arm Limited.
5*072a4ba8SAndrew Turner  * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
631914882SAlex Richardson  */
731914882SAlex Richardson 
831914882SAlex Richardson #include <assert.h>
931914882SAlex Richardson #include <stddef.h>
1031914882SAlex Richardson #include <stdint.h>
1131914882SAlex Richardson 
1231914882SAlex Richardson #include "intern.h"
1331914882SAlex Richardson 
wrapper_init(wrapperctx * ctx)1431914882SAlex Richardson void wrapper_init(wrapperctx *ctx)
1531914882SAlex Richardson {
1631914882SAlex Richardson     int i;
1731914882SAlex Richardson     ctx->nops = ctx->nresults = 0;
1831914882SAlex Richardson     for (i = 0; i < 2; i++) {
1931914882SAlex Richardson         ctx->mpfr_ops[i] = NULL;
2031914882SAlex Richardson         ctx->mpc_ops[i] = NULL;
2131914882SAlex Richardson         ctx->ieee_ops[i] = NULL;
2231914882SAlex Richardson     }
2331914882SAlex Richardson     ctx->mpfr_result = NULL;
2431914882SAlex Richardson     ctx->mpc_result = NULL;
2531914882SAlex Richardson     ctx->ieee_result = NULL;
2631914882SAlex Richardson     ctx->need_regen = 0;
2731914882SAlex Richardson }
2831914882SAlex Richardson 
wrapper_op_real(wrapperctx * ctx,const mpfr_t r,int size,const uint32 * ieee)2931914882SAlex Richardson void wrapper_op_real(wrapperctx *ctx, const mpfr_t r,
3031914882SAlex Richardson                      int size, const uint32 *ieee)
3131914882SAlex Richardson {
3231914882SAlex Richardson     assert(ctx->nops < 2);
3331914882SAlex Richardson     ctx->mpfr_ops[ctx->nops] = r;
3431914882SAlex Richardson     ctx->ieee_ops[ctx->nops] = ieee;
3531914882SAlex Richardson     ctx->size_ops[ctx->nops] = size;
3631914882SAlex Richardson     ctx->nops++;
3731914882SAlex Richardson }
3831914882SAlex Richardson 
wrapper_op_complex(wrapperctx * ctx,const mpc_t c,int size,const uint32 * ieee)3931914882SAlex Richardson void wrapper_op_complex(wrapperctx *ctx, const mpc_t c,
4031914882SAlex Richardson                         int size, const uint32 *ieee)
4131914882SAlex Richardson {
4231914882SAlex Richardson     assert(ctx->nops < 2);
4331914882SAlex Richardson     ctx->mpc_ops[ctx->nops] = c;
4431914882SAlex Richardson     ctx->ieee_ops[ctx->nops] = ieee;
4531914882SAlex Richardson     ctx->size_ops[ctx->nops] = size;
4631914882SAlex Richardson     ctx->nops++;
4731914882SAlex Richardson }
4831914882SAlex Richardson 
wrapper_result_real(wrapperctx * ctx,mpfr_t r,int size,uint32 * ieee)4931914882SAlex Richardson void wrapper_result_real(wrapperctx *ctx, mpfr_t r,
5031914882SAlex Richardson                          int size, uint32 *ieee)
5131914882SAlex Richardson {
5231914882SAlex Richardson     assert(ctx->nresults < 1);
5331914882SAlex Richardson     ctx->mpfr_result = r;
5431914882SAlex Richardson     ctx->ieee_result = ieee;
5531914882SAlex Richardson     ctx->size_result = size;
5631914882SAlex Richardson     ctx->nresults++;
5731914882SAlex Richardson }
5831914882SAlex Richardson 
wrapper_result_complex(wrapperctx * ctx,mpc_t c,int size,uint32 * ieee)5931914882SAlex Richardson void wrapper_result_complex(wrapperctx *ctx, mpc_t c,
6031914882SAlex Richardson                             int size, uint32 *ieee)
6131914882SAlex Richardson {
6231914882SAlex Richardson     assert(ctx->nresults < 1);
6331914882SAlex Richardson     ctx->mpc_result = c;
6431914882SAlex Richardson     ctx->ieee_result = ieee;
6531914882SAlex Richardson     ctx->size_result = size;
6631914882SAlex Richardson     ctx->nresults++;
6731914882SAlex Richardson }
6831914882SAlex Richardson 
wrapper_run(wrapperctx * ctx,wrapperfunc wrappers[MAXWRAPPERS])6931914882SAlex Richardson int wrapper_run(wrapperctx *ctx, wrapperfunc wrappers[MAXWRAPPERS])
7031914882SAlex Richardson {
7131914882SAlex Richardson     int i;
7231914882SAlex Richardson     for (i = 0; i < MAXWRAPPERS && wrappers[i]; i++)
7331914882SAlex Richardson         wrappers[i](ctx);
7431914882SAlex Richardson     universal_wrapper(ctx);
7531914882SAlex Richardson     return ctx->need_regen;
7631914882SAlex Richardson }
7731914882SAlex Richardson 
wrapper_get_mpfr(wrapperctx * ctx,int op)7831914882SAlex Richardson mpfr_srcptr wrapper_get_mpfr(wrapperctx *ctx, int op)
7931914882SAlex Richardson {
8031914882SAlex Richardson     if (op < 0) {
8131914882SAlex Richardson         assert(ctx->mpfr_result);
8231914882SAlex Richardson         return ctx->mpfr_result;
8331914882SAlex Richardson     } else {
8431914882SAlex Richardson         assert(ctx->mpfr_ops[op]);
8531914882SAlex Richardson         return ctx->mpfr_ops[op];
8631914882SAlex Richardson     }
8731914882SAlex Richardson }
8831914882SAlex Richardson 
wrapper_get_ieee(wrapperctx * ctx,int op)8931914882SAlex Richardson const uint32 *wrapper_get_ieee(wrapperctx *ctx, int op)
9031914882SAlex Richardson {
9131914882SAlex Richardson     if (op < 0) {
9231914882SAlex Richardson         assert(ctx->mpfr_result);
9331914882SAlex Richardson         return ctx->ieee_result;
9431914882SAlex Richardson     } else {
9531914882SAlex Richardson         assert(ctx->mpfr_ops[op]);
9631914882SAlex Richardson         return ctx->ieee_ops[op];
9731914882SAlex Richardson     }
9831914882SAlex Richardson }
9931914882SAlex Richardson 
wrapper_get_nops(wrapperctx * ctx)10031914882SAlex Richardson int wrapper_get_nops(wrapperctx *ctx)
10131914882SAlex Richardson {
10231914882SAlex Richardson     return ctx->nops;
10331914882SAlex Richardson }
10431914882SAlex Richardson 
wrapper_get_size(wrapperctx * ctx,int op)10531914882SAlex Richardson int wrapper_get_size(wrapperctx *ctx, int op)
10631914882SAlex Richardson {
10731914882SAlex Richardson     if (op < 0) {
10831914882SAlex Richardson         assert(ctx->mpfr_result || ctx->mpc_result);
10931914882SAlex Richardson         return ctx->size_result;
11031914882SAlex Richardson     } else {
11131914882SAlex Richardson         assert(ctx->mpfr_ops[op] || ctx->mpc_ops[op]);
11231914882SAlex Richardson         return ctx->size_ops[op];
11331914882SAlex Richardson     }
11431914882SAlex Richardson }
11531914882SAlex Richardson 
wrapper_is_complex(wrapperctx * ctx,int op)11631914882SAlex Richardson int wrapper_is_complex(wrapperctx *ctx, int op)
11731914882SAlex Richardson {
11831914882SAlex Richardson     if (op < 0) {
11931914882SAlex Richardson         assert(ctx->mpfr_result || ctx->mpc_result);
12031914882SAlex Richardson         return ctx->mpc_result != NULL;
12131914882SAlex Richardson     } else {
12231914882SAlex Richardson         assert(ctx->mpfr_ops[op] || ctx->mpc_ops[op]);
12331914882SAlex Richardson         return ctx->mpc_ops[op] != NULL;
12431914882SAlex Richardson     }
12531914882SAlex Richardson }
12631914882SAlex Richardson 
wrapper_get_mpc(wrapperctx * ctx,int op)12731914882SAlex Richardson mpc_srcptr wrapper_get_mpc(wrapperctx *ctx, int op)
12831914882SAlex Richardson {
12931914882SAlex Richardson     if (op < 0) {
13031914882SAlex Richardson         assert(ctx->mpc_result);
13131914882SAlex Richardson         return ctx->mpc_result;
13231914882SAlex Richardson     } else {
13331914882SAlex Richardson         assert(ctx->mpc_ops[op]);
13431914882SAlex Richardson         return ctx->mpc_ops[op];
13531914882SAlex Richardson     }
13631914882SAlex Richardson }
13731914882SAlex Richardson 
wrapper_get_mpfr_r(wrapperctx * ctx,int op)13831914882SAlex Richardson mpfr_srcptr wrapper_get_mpfr_r(wrapperctx *ctx, int op)
13931914882SAlex Richardson {
14031914882SAlex Richardson     if (op < 0) {
14131914882SAlex Richardson         assert(ctx->mpc_result);
14231914882SAlex Richardson         return mpc_realref(ctx->mpc_result);
14331914882SAlex Richardson     } else {
14431914882SAlex Richardson         assert(ctx->mpc_ops[op]);
14531914882SAlex Richardson         return mpc_realref(ctx->mpc_ops[op]);
14631914882SAlex Richardson     }
14731914882SAlex Richardson }
14831914882SAlex Richardson 
wrapper_get_mpfr_i(wrapperctx * ctx,int op)14931914882SAlex Richardson mpfr_srcptr wrapper_get_mpfr_i(wrapperctx *ctx, int op)
15031914882SAlex Richardson {
15131914882SAlex Richardson     if (op < 0) {
15231914882SAlex Richardson         assert(ctx->mpc_result);
15331914882SAlex Richardson         return mpc_imagref(ctx->mpc_result);
15431914882SAlex Richardson     } else {
15531914882SAlex Richardson         assert(ctx->mpc_ops[op]);
15631914882SAlex Richardson         return mpc_imagref(ctx->mpc_ops[op]);
15731914882SAlex Richardson     }
15831914882SAlex Richardson }
15931914882SAlex Richardson 
wrapper_get_ieee_r(wrapperctx * ctx,int op)16031914882SAlex Richardson const uint32 *wrapper_get_ieee_r(wrapperctx *ctx, int op)
16131914882SAlex Richardson {
16231914882SAlex Richardson     if (op < 0) {
16331914882SAlex Richardson         assert(ctx->mpc_result);
16431914882SAlex Richardson         return ctx->ieee_result;
16531914882SAlex Richardson     } else {
16631914882SAlex Richardson         assert(ctx->mpc_ops[op]);
16731914882SAlex Richardson         return ctx->ieee_ops[op];
16831914882SAlex Richardson     }
16931914882SAlex Richardson }
17031914882SAlex Richardson 
wrapper_get_ieee_i(wrapperctx * ctx,int op)17131914882SAlex Richardson const uint32 *wrapper_get_ieee_i(wrapperctx *ctx, int op)
17231914882SAlex Richardson {
17331914882SAlex Richardson     if (op < 0) {
17431914882SAlex Richardson         assert(ctx->mpc_result);
17531914882SAlex Richardson         return ctx->ieee_result + 4;
17631914882SAlex Richardson     } else {
17731914882SAlex Richardson         assert(ctx->mpc_ops[op]);
17831914882SAlex Richardson         return ctx->ieee_ops[op] + 2;
17931914882SAlex Richardson     }
18031914882SAlex Richardson }
18131914882SAlex Richardson 
wrapper_set_sign(wrapperctx * ctx,uint32 sign)18231914882SAlex Richardson void wrapper_set_sign(wrapperctx *ctx, uint32 sign)
18331914882SAlex Richardson {
18431914882SAlex Richardson     assert(ctx->mpfr_result);
18531914882SAlex Richardson     ctx->ieee_result[0] |= (sign & 0x80000000U);
18631914882SAlex Richardson }
18731914882SAlex Richardson 
wrapper_set_sign_r(wrapperctx * ctx,uint32 sign)18831914882SAlex Richardson void wrapper_set_sign_r(wrapperctx *ctx, uint32 sign)
18931914882SAlex Richardson {
19031914882SAlex Richardson     assert(ctx->mpc_result);
19131914882SAlex Richardson     ctx->ieee_result[0] |= (sign & 0x80000000U);
19231914882SAlex Richardson }
19331914882SAlex Richardson 
wrapper_set_sign_i(wrapperctx * ctx,uint32 sign)19431914882SAlex Richardson void wrapper_set_sign_i(wrapperctx *ctx, uint32 sign)
19531914882SAlex Richardson {
19631914882SAlex Richardson     assert(ctx->mpc_result);
19731914882SAlex Richardson     ctx->ieee_result[4] |= (sign & 0x80000000U);
19831914882SAlex Richardson }
19931914882SAlex Richardson 
wrapper_set_nan(wrapperctx * ctx)20031914882SAlex Richardson void wrapper_set_nan(wrapperctx *ctx)
20131914882SAlex Richardson {
20231914882SAlex Richardson     assert(ctx->mpfr_result);
20331914882SAlex Richardson     mpfr_set_nan(ctx->mpfr_result);
20431914882SAlex Richardson     ctx->need_regen = 1;
20531914882SAlex Richardson }
20631914882SAlex Richardson 
wrapper_set_nan_r(wrapperctx * ctx)20731914882SAlex Richardson void wrapper_set_nan_r(wrapperctx *ctx)
20831914882SAlex Richardson {
20931914882SAlex Richardson     assert(ctx->mpc_result);
21031914882SAlex Richardson     mpfr_set_nan(mpc_realref(ctx->mpc_result)); /* FIXME: better way? */
21131914882SAlex Richardson     ctx->need_regen = 1;
21231914882SAlex Richardson }
21331914882SAlex Richardson 
wrapper_set_nan_i(wrapperctx * ctx)21431914882SAlex Richardson void wrapper_set_nan_i(wrapperctx *ctx)
21531914882SAlex Richardson {
21631914882SAlex Richardson     assert(ctx->mpc_result);
21731914882SAlex Richardson     mpfr_set_nan(mpc_imagref(ctx->mpc_result)); /* FIXME: better way? */
21831914882SAlex Richardson     ctx->need_regen = 1;
21931914882SAlex Richardson }
22031914882SAlex Richardson 
wrapper_set_int(wrapperctx * ctx,int val)22131914882SAlex Richardson void wrapper_set_int(wrapperctx *ctx, int val)
22231914882SAlex Richardson {
22331914882SAlex Richardson     assert(ctx->mpfr_result);
22431914882SAlex Richardson     mpfr_set_si(ctx->mpfr_result, val, GMP_RNDN);
22531914882SAlex Richardson     ctx->need_regen = 1;
22631914882SAlex Richardson }
22731914882SAlex Richardson 
wrapper_set_int_r(wrapperctx * ctx,int val)22831914882SAlex Richardson void wrapper_set_int_r(wrapperctx *ctx, int val)
22931914882SAlex Richardson {
23031914882SAlex Richardson     assert(ctx->mpc_result);
23131914882SAlex Richardson     mpfr_set_si(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
23231914882SAlex Richardson     ctx->need_regen = 1;
23331914882SAlex Richardson }
23431914882SAlex Richardson 
wrapper_set_int_i(wrapperctx * ctx,int val)23531914882SAlex Richardson void wrapper_set_int_i(wrapperctx *ctx, int val)
23631914882SAlex Richardson {
23731914882SAlex Richardson     assert(ctx->mpc_result);
23831914882SAlex Richardson     mpfr_set_si(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
23931914882SAlex Richardson     ctx->need_regen = 1;
24031914882SAlex Richardson }
24131914882SAlex Richardson 
wrapper_set_mpfr(wrapperctx * ctx,const mpfr_t val)24231914882SAlex Richardson void wrapper_set_mpfr(wrapperctx *ctx, const mpfr_t val)
24331914882SAlex Richardson {
24431914882SAlex Richardson     assert(ctx->mpfr_result);
24531914882SAlex Richardson     mpfr_set(ctx->mpfr_result, val, GMP_RNDN);
24631914882SAlex Richardson     ctx->need_regen = 1;
24731914882SAlex Richardson }
24831914882SAlex Richardson 
wrapper_set_mpfr_r(wrapperctx * ctx,const mpfr_t val)24931914882SAlex Richardson void wrapper_set_mpfr_r(wrapperctx *ctx, const mpfr_t val)
25031914882SAlex Richardson {
25131914882SAlex Richardson     assert(ctx->mpc_result);
25231914882SAlex Richardson     mpfr_set(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
25331914882SAlex Richardson     ctx->need_regen = 1;
25431914882SAlex Richardson }
25531914882SAlex Richardson 
wrapper_set_mpfr_i(wrapperctx * ctx,const mpfr_t val)25631914882SAlex Richardson void wrapper_set_mpfr_i(wrapperctx *ctx, const mpfr_t val)
25731914882SAlex Richardson {
25831914882SAlex Richardson     assert(ctx->mpc_result);
25931914882SAlex Richardson     mpfr_set(mpc_realref(ctx->mpc_result), val, GMP_RNDN);
26031914882SAlex Richardson     ctx->need_regen = 1;
26131914882SAlex Richardson }
262