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