Path: blob/main/contrib/arm-optimized-routines/math/test/rtest/wrappers.c
48375 views
/*1* wrappers.c - wrappers to modify output of MPFR/MPC test functions2*3* Copyright (c) 2014-2019, Arm Limited.4* SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception5*/67#include <assert.h>8#include <stddef.h>9#include <stdint.h>1011#include "intern.h"1213void wrapper_init(wrapperctx *ctx)14{15int i;16ctx->nops = ctx->nresults = 0;17for (i = 0; i < 2; i++) {18ctx->mpfr_ops[i] = NULL;19ctx->mpc_ops[i] = NULL;20ctx->ieee_ops[i] = NULL;21}22ctx->mpfr_result = NULL;23ctx->mpc_result = NULL;24ctx->ieee_result = NULL;25ctx->need_regen = 0;26}2728void wrapper_op_real(wrapperctx *ctx, const mpfr_t r,29int size, const uint32 *ieee)30{31assert(ctx->nops < 2);32ctx->mpfr_ops[ctx->nops] = r;33ctx->ieee_ops[ctx->nops] = ieee;34ctx->size_ops[ctx->nops] = size;35ctx->nops++;36}3738void wrapper_op_complex(wrapperctx *ctx, const mpc_t c,39int size, const uint32 *ieee)40{41assert(ctx->nops < 2);42ctx->mpc_ops[ctx->nops] = c;43ctx->ieee_ops[ctx->nops] = ieee;44ctx->size_ops[ctx->nops] = size;45ctx->nops++;46}4748void wrapper_result_real(wrapperctx *ctx, mpfr_t r,49int size, uint32 *ieee)50{51assert(ctx->nresults < 1);52ctx->mpfr_result = r;53ctx->ieee_result = ieee;54ctx->size_result = size;55ctx->nresults++;56}5758void wrapper_result_complex(wrapperctx *ctx, mpc_t c,59int size, uint32 *ieee)60{61assert(ctx->nresults < 1);62ctx->mpc_result = c;63ctx->ieee_result = ieee;64ctx->size_result = size;65ctx->nresults++;66}6768int wrapper_run(wrapperctx *ctx, wrapperfunc wrappers[MAXWRAPPERS])69{70int i;71for (i = 0; i < MAXWRAPPERS && wrappers[i]; i++)72wrappers[i](ctx);73universal_wrapper(ctx);74return ctx->need_regen;75}7677mpfr_srcptr wrapper_get_mpfr(wrapperctx *ctx, int op)78{79if (op < 0) {80assert(ctx->mpfr_result);81return ctx->mpfr_result;82} else {83assert(ctx->mpfr_ops[op]);84return ctx->mpfr_ops[op];85}86}8788const uint32 *wrapper_get_ieee(wrapperctx *ctx, int op)89{90if (op < 0) {91assert(ctx->mpfr_result);92return ctx->ieee_result;93} else {94assert(ctx->mpfr_ops[op]);95return ctx->ieee_ops[op];96}97}9899int wrapper_get_nops(wrapperctx *ctx)100{101return ctx->nops;102}103104int wrapper_get_size(wrapperctx *ctx, int op)105{106if (op < 0) {107assert(ctx->mpfr_result || ctx->mpc_result);108return ctx->size_result;109} else {110assert(ctx->mpfr_ops[op] || ctx->mpc_ops[op]);111return ctx->size_ops[op];112}113}114115int wrapper_is_complex(wrapperctx *ctx, int op)116{117if (op < 0) {118assert(ctx->mpfr_result || ctx->mpc_result);119return ctx->mpc_result != NULL;120} else {121assert(ctx->mpfr_ops[op] || ctx->mpc_ops[op]);122return ctx->mpc_ops[op] != NULL;123}124}125126mpc_srcptr wrapper_get_mpc(wrapperctx *ctx, int op)127{128if (op < 0) {129assert(ctx->mpc_result);130return ctx->mpc_result;131} else {132assert(ctx->mpc_ops[op]);133return ctx->mpc_ops[op];134}135}136137mpfr_srcptr wrapper_get_mpfr_r(wrapperctx *ctx, int op)138{139if (op < 0) {140assert(ctx->mpc_result);141return mpc_realref(ctx->mpc_result);142} else {143assert(ctx->mpc_ops[op]);144return mpc_realref(ctx->mpc_ops[op]);145}146}147148mpfr_srcptr wrapper_get_mpfr_i(wrapperctx *ctx, int op)149{150if (op < 0) {151assert(ctx->mpc_result);152return mpc_imagref(ctx->mpc_result);153} else {154assert(ctx->mpc_ops[op]);155return mpc_imagref(ctx->mpc_ops[op]);156}157}158159const uint32 *wrapper_get_ieee_r(wrapperctx *ctx, int op)160{161if (op < 0) {162assert(ctx->mpc_result);163return ctx->ieee_result;164} else {165assert(ctx->mpc_ops[op]);166return ctx->ieee_ops[op];167}168}169170const uint32 *wrapper_get_ieee_i(wrapperctx *ctx, int op)171{172if (op < 0) {173assert(ctx->mpc_result);174return ctx->ieee_result + 4;175} else {176assert(ctx->mpc_ops[op]);177return ctx->ieee_ops[op] + 2;178}179}180181void wrapper_set_sign(wrapperctx *ctx, uint32 sign)182{183assert(ctx->mpfr_result);184ctx->ieee_result[0] |= (sign & 0x80000000U);185}186187void wrapper_set_sign_r(wrapperctx *ctx, uint32 sign)188{189assert(ctx->mpc_result);190ctx->ieee_result[0] |= (sign & 0x80000000U);191}192193void wrapper_set_sign_i(wrapperctx *ctx, uint32 sign)194{195assert(ctx->mpc_result);196ctx->ieee_result[4] |= (sign & 0x80000000U);197}198199void wrapper_set_nan(wrapperctx *ctx)200{201assert(ctx->mpfr_result);202mpfr_set_nan(ctx->mpfr_result);203ctx->need_regen = 1;204}205206void wrapper_set_nan_r(wrapperctx *ctx)207{208assert(ctx->mpc_result);209mpfr_set_nan(mpc_realref(ctx->mpc_result)); /* FIXME: better way? */210ctx->need_regen = 1;211}212213void wrapper_set_nan_i(wrapperctx *ctx)214{215assert(ctx->mpc_result);216mpfr_set_nan(mpc_imagref(ctx->mpc_result)); /* FIXME: better way? */217ctx->need_regen = 1;218}219220void wrapper_set_int(wrapperctx *ctx, int val)221{222assert(ctx->mpfr_result);223mpfr_set_si(ctx->mpfr_result, val, GMP_RNDN);224ctx->need_regen = 1;225}226227void wrapper_set_int_r(wrapperctx *ctx, int val)228{229assert(ctx->mpc_result);230mpfr_set_si(mpc_realref(ctx->mpc_result), val, GMP_RNDN);231ctx->need_regen = 1;232}233234void wrapper_set_int_i(wrapperctx *ctx, int val)235{236assert(ctx->mpc_result);237mpfr_set_si(mpc_realref(ctx->mpc_result), val, GMP_RNDN);238ctx->need_regen = 1;239}240241void wrapper_set_mpfr(wrapperctx *ctx, const mpfr_t val)242{243assert(ctx->mpfr_result);244mpfr_set(ctx->mpfr_result, val, GMP_RNDN);245ctx->need_regen = 1;246}247248void wrapper_set_mpfr_r(wrapperctx *ctx, const mpfr_t val)249{250assert(ctx->mpc_result);251mpfr_set(mpc_realref(ctx->mpc_result), val, GMP_RNDN);252ctx->need_regen = 1;253}254255void wrapper_set_mpfr_i(wrapperctx *ctx, const mpfr_t val)256{257assert(ctx->mpc_result);258mpfr_set(mpc_realref(ctx->mpc_result), val, GMP_RNDN);259ctx->need_regen = 1;260}261262263