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}