arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/vec_rnx_conversions_ref.c
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/vec_rnx_conversions_ref.cRaw
 1#include <memory.h>
 2
 3#include "vec_rnx_arithmetic_private.h"
 4#include "zn_arithmetic_private.h"
 5
 6EXPORT void vec_rnx_to_znx32_ref(                      //
 7    const MOD_RNX* module,                             // N
 8    int32_t* res, uint64_t res_size, uint64_t res_sl,  // res
 9    const double* a, uint64_t a_size, uint64_t a_sl    // a
10) {
11  const uint64_t nn = module->n;
12  const uint64_t msize = res_size < a_size ? res_size : a_size;
13  for (uint64_t i = 0; i < msize; ++i) {
14    dbl_round_to_i32_ref(NULL, res + i * res_sl, nn, a + i * a_sl, nn);
15  }
16  for (uint64_t i = msize; i < res_size; ++i) {
17    memset(res + i * res_sl, 0, nn * sizeof(int32_t));
18  }
19}
20
21EXPORT void vec_rnx_from_znx32_ref(                   //
22    const MOD_RNX* module,                            // N
23    double* res, uint64_t res_size, uint64_t res_sl,  // res
24    const int32_t* a, uint64_t a_size, uint64_t a_sl  // a
25) {
26  const uint64_t nn = module->n;
27  const uint64_t msize = res_size < a_size ? res_size : a_size;
28  for (uint64_t i = 0; i < msize; ++i) {
29    i32_to_dbl_ref(NULL, res + i * res_sl, nn, a + i * a_sl, nn);
30  }
31  for (uint64_t i = msize; i < res_size; ++i) {
32    memset(res + i * res_sl, 0, nn * sizeof(int32_t));
33  }
34}
35EXPORT void vec_rnx_to_tnx32_ref(                      //
36    const MOD_RNX* module,                             // N
37    int32_t* res, uint64_t res_size, uint64_t res_sl,  // res
38    const double* a, uint64_t a_size, uint64_t a_sl    // a
39) {
40  const uint64_t nn = module->n;
41  const uint64_t msize = res_size < a_size ? res_size : a_size;
42  for (uint64_t i = 0; i < msize; ++i) {
43    dbl_to_tn32_ref(NULL, res + i * res_sl, nn, a + i * a_sl, nn);
44  }
45  for (uint64_t i = msize; i < res_size; ++i) {
46    memset(res + i * res_sl, 0, nn * sizeof(int32_t));
47  }
48}
49EXPORT void vec_rnx_from_tnx32_ref(                   //
50    const MOD_RNX* module,                            // N
51    double* res, uint64_t res_size, uint64_t res_sl,  // res
52    const int32_t* a, uint64_t a_size, uint64_t a_sl  // a
53) {
54  const uint64_t nn = module->n;
55  const uint64_t msize = res_size < a_size ? res_size : a_size;
56  for (uint64_t i = 0; i < msize; ++i) {
57    tn32_to_dbl_ref(NULL, res + i * res_sl, nn, a + i * a_sl, nn);
58  }
59  for (uint64_t i = msize; i < res_size; ++i) {
60    memset(res + i * res_sl, 0, nn * sizeof(int32_t));
61  }
62}
63
64static void dbl_to_tndbl_ref(         //
65    const void* UNUSED,               // N
66    double* res, uint64_t res_size,   // res
67    const double* a, uint64_t a_size  // a
68) {
69  static const double OFF_CST = INT64_C(3) << 51;
70  const uint64_t msize = res_size < a_size ? res_size : a_size;
71  for (uint64_t i = 0; i < msize; ++i) {
72    double ai = a[i] + OFF_CST;
73    res[i] = a[i] - (ai - OFF_CST);
74  }
75  memset(res + msize, 0, (res_size - msize) * sizeof(double));
76}
77
78EXPORT void vec_rnx_to_tnxdbl_ref(                    //
79    const MOD_RNX* module,                            // N
80    double* res, uint64_t res_size, uint64_t res_sl,  // res
81    const double* a, uint64_t a_size, uint64_t a_sl   // a
82) {
83  const uint64_t nn = module->n;
84  const uint64_t msize = res_size < a_size ? res_size : a_size;
85  for (uint64_t i = 0; i < msize; ++i) {
86    dbl_to_tndbl_ref(NULL, res + i * res_sl, nn, a + i * a_sl, nn);
87  }
88  for (uint64_t i = msize; i < res_size; ++i) {
89    memset(res + i * res_sl, 0, nn * sizeof(int32_t));
90  }
91}