arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim4/reim4_fftvec_conv_ref.c
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim4/reim4_fftvec_conv_ref.cRaw
  1#include <errno.h>
  2#include <memory.h>
  3#include <stdlib.h>
  4#include <string.h>
  5
  6#include "../commons_private.h"
  7#include "reim4_fftvec_internal.h"
  8#include "reim4_fftvec_private.h"
  9
 10EXPORT void reim4_from_cplx_ref(const REIM4_FROM_CPLX_PRECOMP* tables, double* r, const void* a) {
 11  const double* x = (double*)a;
 12  const uint64_t m = tables->m;
 13  for (uint64_t i = 0; i < m / 4; ++i) {
 14    double r0 = x[0];
 15    double i0 = x[1];
 16    double r1 = x[2];
 17    double i1 = x[3];
 18    double r2 = x[4];
 19    double i2 = x[5];
 20    double r3 = x[6];
 21    double i3 = x[7];
 22    r[0] = r0;
 23    r[1] = r2;
 24    r[2] = r1;
 25    r[3] = r3;
 26    r[4] = i0;
 27    r[5] = i2;
 28    r[6] = i1;
 29    r[7] = i3;
 30    x += 8;
 31    r += 8;
 32  }
 33}
 34
 35void* init_reim4_from_cplx_precomp(REIM4_FROM_CPLX_PRECOMP* res, uint32_t nn) {
 36  res->m = nn / 2;
 37  if (CPU_SUPPORTS("fma")) {
 38    if (nn >= 4) {
 39      res->function = reim4_from_cplx_fma;
 40    } else {
 41      res->function = reim4_from_cplx_ref;
 42    }
 43  } else {
 44    res->function = reim4_from_cplx_ref;
 45  }
 46  return res;
 47}
 48
 49EXPORT REIM4_FROM_CPLX_PRECOMP* new_reim4_from_cplx_precomp(uint32_t m) {
 50  REIM4_FROM_CPLX_PRECOMP* res = malloc(sizeof(*res));
 51  if (!res) return spqlios_error(strerror(errno));
 52  return spqlios_keep_or_free(res, init_reim4_from_cplx_precomp(res, m));
 53}
 54
 55EXPORT void reim4_from_cplx_simple(uint32_t m, double* r, const void* a) {
 56  static REIM4_FROM_CPLX_PRECOMP precomp[32];
 57  REIM4_FROM_CPLX_PRECOMP* p = precomp + log2m(m);
 58  if (!p->function) {
 59    if (!init_reim4_from_cplx_precomp(p, m)) abort();
 60  }
 61  p->function(p, r, a);
 62}
 63
 64EXPORT void reim4_to_cplx_ref(const REIM4_TO_CPLX_PRECOMP* tables, void* r, const double* a) {
 65  double* y = (double*)r;
 66  const uint64_t m = tables->m;
 67  for (uint64_t i = 0; i < m / 4; ++i) {
 68    double r0 = a[0];
 69    double r2 = a[1];
 70    double r1 = a[2];
 71    double r3 = a[3];
 72    double i0 = a[4];
 73    double i2 = a[5];
 74    double i1 = a[6];
 75    double i3 = a[7];
 76    y[0] = r0;
 77    y[1] = i0;
 78    y[2] = r1;
 79    y[3] = i1;
 80    y[4] = r2;
 81    y[5] = i2;
 82    y[6] = r3;
 83    y[7] = i3;
 84    a += 8;
 85    y += 8;
 86  }
 87}
 88
 89void* init_reim4_to_cplx_precomp(REIM4_TO_CPLX_PRECOMP* res, uint32_t m) {
 90  res->m = m;
 91  if (CPU_SUPPORTS("fma")) {
 92    if (m >= 2) {
 93      res->function = reim4_to_cplx_fma;
 94    } else {
 95      res->function = reim4_to_cplx_ref;
 96    }
 97  } else {
 98    res->function = reim4_to_cplx_ref;
 99  }
100  return res;
101}
102
103EXPORT REIM4_TO_CPLX_PRECOMP* new_reim4_to_cplx_precomp(uint32_t m) {
104  REIM4_TO_CPLX_PRECOMP* res = malloc(sizeof(*res));
105  if (!res) return spqlios_error(strerror(errno));
106  return spqlios_keep_or_free(res, init_reim4_to_cplx_precomp(res, m));
107}
108
109EXPORT void reim4_to_cplx_simple(uint32_t m, void* r, const double* a) {
110  static REIM4_TO_CPLX_PRECOMP precomp[32];
111  REIM4_TO_CPLX_PRECOMP* p = precomp + log2m(m);
112  if (!p->function) {
113    if (!init_reim4_to_cplx_precomp(p, m)) abort();
114  }
115  p->function(p, r, a);
116}