arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/commons.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/commons.hRaw
 1#ifndef SPQLIOS_COMMONS_H
 2#define SPQLIOS_COMMONS_H
 3
 4#ifdef __cplusplus
 5#include <cstdint>
 6#include <cstdio>
 7#include <cstdlib>
 8#define EXPORT extern "C"
 9#define EXPORT_DECL extern "C"
10#else
11#include <stdint.h>
12#include <stdio.h>
13#include <stdlib.h>
14#define EXPORT
15#define EXPORT_DECL extern
16#define nullptr 0x0;
17#endif
18
19#define UNDEFINED()                    \
20  {                                    \
21    fprintf(stderr, "UNDEFINED!!!\n"); \
22    abort();                           \
23  }
24#define NOT_IMPLEMENTED()                    \
25  {                                          \
26    fprintf(stderr, "NOT IMPLEMENTED!!!\n"); \
27    abort();                                 \
28  }
29#define FATAL_ERROR(MESSAGE)                   \
30  {                                            \
31    fprintf(stderr, "ERROR: %s\n", (MESSAGE)); \
32    abort();                                   \
33  }
34
35EXPORT void* UNDEFINED_p_ii(int32_t n, int32_t m);
36EXPORT void* UNDEFINED_p_uu(uint32_t n, uint32_t m);
37EXPORT double* UNDEFINED_dp_pi(const void* p, int32_t n);
38EXPORT void* UNDEFINED_vp_pi(const void* p, int32_t n);
39EXPORT void* UNDEFINED_vp_pu(const void* p, uint32_t n);
40EXPORT void UNDEFINED_v_vpdp(const void* p, double* a);
41EXPORT void UNDEFINED_v_vpvp(const void* p, void* a);
42EXPORT double* NOT_IMPLEMENTED_dp_i(int32_t n);
43EXPORT void* NOT_IMPLEMENTED_vp_i(int32_t n);
44EXPORT void* NOT_IMPLEMENTED_vp_u(uint32_t n);
45EXPORT void NOT_IMPLEMENTED_v_dp(double* a);
46EXPORT void NOT_IMPLEMENTED_v_vp(void* p);
47EXPORT void NOT_IMPLEMENTED_v_idpdpdp(int32_t n, double* a, const double* b, const double* c);
48EXPORT void NOT_IMPLEMENTED_v_uvpcvpcvp(uint32_t n, void* r, const void* a, const void* b);
49EXPORT void NOT_IMPLEMENTED_v_uvpvpcvp(uint32_t n, void* a, void* b, const void* o);
50
51// windows
52
53#if defined(_WIN32) || defined(__APPLE__)
54#define __always_inline inline __attribute((always_inline))
55#endif
56
57EXPORT void spqlios_free(void* address);
58
59EXPORT void* spqlios_alloc(uint64_t size);
60EXPORT void* spqlios_alloc_custom_align(uint64_t align, uint64_t size);
61
62#define USE_LIBM_SIN_COS
63#ifndef USE_LIBM_SIN_COS
64// if at some point, we want to remove the libm dependency, we can
65// consider this:
66EXPORT double internal_accurate_cos(double x);
67EXPORT double internal_accurate_sin(double x);
68EXPORT void internal_accurate_sincos(double* rcos, double* rsin, double x);
69#define m_accurate_cos internal_accurate_cos
70#define m_accurate_sin internal_accurate_sin
71#else
72// let's use libm sin and cos
73#define m_accurate_cos cos
74#define m_accurate_sin sin
75#endif
76
77#endif  // SPQLIOS_COMMONS_H