Skip to content

Commit a652985

Browse files
committed
added multi backend support to scalar operations
1 parent 8408227 commit a652985

File tree

5 files changed

+332
-75
lines changed

5 files changed

+332
-75
lines changed

quaddtype/meson.build

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ py = py_mod.find_installation()
55

66
c = meson.get_compiler('c')
77

8-
sleef_dep = c.find_library('sleef', dirs:['/usr/local/lib'])
9-
sleefquad_dep = c.find_library('sleefquad', dirs:['/usr/local/lib'])
8+
sleef_dep = c.find_library('sleef')
9+
sleefquad_dep = c.find_library('sleefquad')
1010

1111
incdir_numpy = run_command(py,
1212
[
@@ -31,9 +31,9 @@ srcs = [
3131
'numpy_quaddtype/src/dtype.h',
3232
'numpy_quaddtype/src/dtype.c',
3333
'numpy_quaddtype/src/quaddtype_main.c',
34-
# 'numpy_quaddtype/src/scalar_ops.h',
35-
# 'numpy_quaddtype/src/scalar_ops.cpp',
36-
# 'numpy_quaddtype/src/ops.hpp',
34+
'numpy_quaddtype/src/scalar_ops.h',
35+
'numpy_quaddtype/src/scalar_ops.cpp',
36+
'numpy_quaddtype/src/ops.hpp',
3737
# 'numpy_quaddtype/src/umath.h',
3838
# 'numpy_quaddtype/src/umath.cpp'
3939
]

quaddtype/numpy_quaddtype/src/ops.hpp

+214-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#include <sleef.h>
22
#include <sleefquad.h>
3+
#include <cmath>
34

4-
typedef int (*unary_op_def)(Sleef_quad *, Sleef_quad *);
5+
// Unary Quad Operations
6+
typedef int (*unary_op_quad_def)(Sleef_quad *, Sleef_quad *);
57

6-
static inline int
8+
static int
79
quad_negative(Sleef_quad *op, Sleef_quad *out)
810
{
911
*out = Sleef_negq1(*op);
@@ -108,8 +110,116 @@ quad_exp2(Sleef_quad *op, Sleef_quad *out)
108110
return 0;
109111
}
110112

111-
// binary ops
112-
typedef int (*binop_def)(Sleef_quad *, Sleef_quad *, Sleef_quad *);
113+
// Unary long double operations
114+
typedef int (*unary_op_longdouble_def)(long double *, long double *);
115+
116+
static int
117+
ld_negative(long double *op, long double *out)
118+
{
119+
*out = -(*op);
120+
return 0;
121+
}
122+
123+
static int
124+
ld_positive(long double *op, long double *out)
125+
{
126+
*out = *op;
127+
return 0;
128+
}
129+
130+
static inline int
131+
ld_absolute(long double *op, long double *out)
132+
{
133+
*out = fabsl(*op);
134+
return 0;
135+
}
136+
137+
static inline int
138+
ld_rint(long double *op, long double *out)
139+
{
140+
*out = rintl(*op);
141+
return 0;
142+
}
143+
144+
static inline int
145+
ld_trunc(long double *op, long double *out)
146+
{
147+
*out = truncl(*op);
148+
return 0;
149+
}
150+
151+
static inline int
152+
ld_floor(long double *op, long double *out)
153+
{
154+
*out = floorl(*op);
155+
return 0;
156+
}
157+
158+
static inline int
159+
ld_ceil(long double *op, long double *out)
160+
{
161+
*out = ceill(*op);
162+
return 0;
163+
}
164+
165+
static inline int
166+
ld_sqrt(long double *op, long double *out)
167+
{
168+
*out = sqrtl(*op);
169+
return 0;
170+
}
171+
172+
static inline int
173+
ld_square(long double *op, long double *out)
174+
{
175+
*out = (*op) * (*op);
176+
return 0;
177+
}
178+
179+
static inline int
180+
ld_log(long double *op, long double *out)
181+
{
182+
*out = logl(*op);
183+
return 0;
184+
}
185+
186+
static inline int
187+
ld_log2(long double *op, long double *out)
188+
{
189+
*out = log2l(*op);
190+
return 0;
191+
}
192+
193+
static inline int
194+
ld_log10(long double *op, long double *out)
195+
{
196+
*out = log10l(*op);
197+
return 0;
198+
}
199+
200+
static inline int
201+
ld_log1p(long double *op, long double *out)
202+
{
203+
*out = log1pl(*op);
204+
return 0;
205+
}
206+
207+
static inline int
208+
ld_exp(long double *op, long double *out)
209+
{
210+
*out = expl(*op);
211+
return 0;
212+
}
213+
214+
static inline int
215+
ld_exp2(long double *op, long double *out)
216+
{
217+
*out = exp2l(*op);
218+
return 0;
219+
}
220+
221+
// Binary Quad operations
222+
typedef int (*binary_op_quad_def)(Sleef_quad *, Sleef_quad *, Sleef_quad *);
113223

114224
static inline int
115225
quad_add(Sleef_quad *out, Sleef_quad *in1, Sleef_quad *in2)
@@ -167,8 +277,67 @@ quad_maximum(Sleef_quad *out, Sleef_quad *in1, Sleef_quad *in2)
167277
return 0;
168278
}
169279

170-
// comparison functions
171-
typedef npy_bool (*cmp_def)(const Sleef_quad *, const Sleef_quad *);
280+
// Binary long double operations
281+
typedef int (*binary_op_longdouble_def)(long double *, long double *, long double *);
282+
283+
static inline int
284+
ld_add(long double *out, long double *in1, long double *in2)
285+
{
286+
*out = (*in1) + (*in2);
287+
return 0;
288+
}
289+
290+
static inline int
291+
ld_sub(long double *out, long double *in1, long double *in2)
292+
{
293+
*out = (*in1) - (*in2);
294+
return 0;
295+
}
296+
297+
static inline int
298+
ld_mul(long double *res, long double *a, long double *b)
299+
{
300+
*res = (*a) * (*b);
301+
return 0;
302+
}
303+
304+
static inline int
305+
ld_div(long double *res, long double *a, long double *b)
306+
{
307+
*res = (*a) / (*b);
308+
return 0;
309+
}
310+
311+
static inline int
312+
ld_pow(long double *res, long double *a, long double *b)
313+
{
314+
*res = powl(*a, *b);
315+
return 0;
316+
}
317+
318+
static inline int
319+
ld_mod(long double *res, long double *a, long double *b)
320+
{
321+
*res = fmodl(*a, *b);
322+
return 0;
323+
}
324+
325+
static inline int
326+
ld_minimum(long double *out, long double *in1, long double *in2)
327+
{
328+
*out = (*in1 < *in2) ? *in1 : *in2;
329+
return 0;
330+
}
331+
332+
static inline int
333+
ld_maximum(long double *out, long double *in1, long double *in2)
334+
{
335+
*out = (*in1 > *in2) ? *in1 : *in2;
336+
return 0;
337+
}
338+
339+
// comparison quad functions
340+
typedef npy_bool (*cmp_quad_def)(const Sleef_quad *, const Sleef_quad *);
172341

173342
static inline npy_bool
174343
quad_equal(const Sleef_quad *a, const Sleef_quad *b)
@@ -204,4 +373,43 @@ static inline npy_bool
204373
quad_greaterequal(const Sleef_quad *a, const Sleef_quad *b)
205374
{
206375
return Sleef_icmpgeq1(*a, *b);
376+
}
377+
378+
// comparison quad functions
379+
typedef npy_bool (*cmp_londouble_def)(const long double *, const double *);
380+
381+
static inline npy_bool
382+
ld_equal(const long double *a, const long double *b)
383+
{
384+
return *a == *b;
385+
}
386+
387+
static inline npy_bool
388+
ld_notequal(const long double *a, const long double *b)
389+
{
390+
return *a != *b;
391+
}
392+
393+
static inline npy_bool
394+
ld_less(const long double *a, const long double *b)
395+
{
396+
return *a < *b;
397+
}
398+
399+
static inline npy_bool
400+
ld_lessequal(const long double *a, const long double *b)
401+
{
402+
return *a <= *b;
403+
}
404+
405+
static inline npy_bool
406+
ld_greater(const long double *a, const long double *b)
407+
{
408+
return *a > *b;
409+
}
410+
411+
static inline npy_bool
412+
ld_greaterequal(const long double *a, const long double *b)
413+
{
414+
return *a >= *b;
207415
}

quaddtype/numpy_quaddtype/src/scalar.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "numpy/dtype_api.h"
1313

1414
#include "scalar.h"
15-
// #include "scalar_ops.h"
15+
#include "scalar_ops.h"
1616

1717
QuadPrecisionObject *
1818
QuadPrecision_raw_new(QuadBackendType backend)
@@ -168,8 +168,8 @@ PyTypeObject QuadPrecision_Type = {
168168
.tp_dealloc = (destructor)QuadPrecision_dealloc,
169169
.tp_repr = (reprfunc)QuadPrecision_repr,
170170
.tp_str = (reprfunc)QuadPrecision_str,
171-
// .tp_as_number = &quad_as_scalar,
172-
// .tp_richcompare = (richcmpfunc)quad_richcompare
171+
.tp_as_number = &quad_as_scalar,
172+
.tp_richcompare = (richcmpfunc)quad_richcompare
173173

174174
};
175175

0 commit comments

Comments
 (0)