brintos

brintos / llvm-project-archived public Read only

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