Skip to content

Commit 277ee7b

Browse files
committed
refactor aligned/unaligned into templates
1 parent 95a253a commit 277ee7b

1 file changed

Lines changed: 16 additions & 85 deletions

File tree

quaddtype/numpy_quaddtype/src/casts.cpp

Lines changed: 16 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,39 +1014,11 @@ numpy_to_quad_resolve_descriptors(PyObject *NPY_UNUSED(self), PyArray_DTypeMeta
10141014
return static_cast<NPY_CASTING>(NPY_SAFE_CASTING | NPY_SAME_VALUE_CASTING_FLAG);
10151015
}
10161016

1017-
template <typename T>
1017+
template <bool Aligned, typename T>
10181018
static int
1019-
numpy_to_quad_strided_loop_unaligned(PyArrayMethod_Context *context, char *const data[],
1020-
npy_intp const dimensions[], npy_intp const strides[],
1021-
void *NPY_UNUSED(auxdata))
1022-
{
1023-
npy_intp N = dimensions[0];
1024-
char *in_ptr = data[0];
1025-
char *out_ptr = data[1];
1026-
1027-
QuadPrecDTypeObject *descr_out = (QuadPrecDTypeObject *)context->descriptors[1];
1028-
QuadBackendType backend = descr_out->backend;
1029-
size_t elem_size = (backend == BACKEND_SLEEF) ? sizeof(Sleef_quad) : sizeof(long double);
1030-
1031-
while (N--) {
1032-
typename NpyType<T>::TYPE in_val;
1033-
quad_value out_val;
1034-
1035-
memcpy(&in_val, in_ptr, sizeof(typename NpyType<T>::TYPE));
1036-
out_val = to_quad<T>(in_val, backend);
1037-
memcpy(out_ptr, &out_val, elem_size);
1038-
1039-
in_ptr += strides[0];
1040-
out_ptr += strides[1];
1041-
}
1042-
return 0;
1043-
}
1044-
1045-
template <typename T>
1046-
static int
1047-
numpy_to_quad_strided_loop_aligned(PyArrayMethod_Context *context, char *const data[],
1048-
npy_intp const dimensions[], npy_intp const strides[],
1049-
void *NPY_UNUSED(auxdata))
1019+
numpy_to_quad_strided_loop(PyArrayMethod_Context *context, char *const data[],
1020+
npy_intp const dimensions[], npy_intp const strides[],
1021+
void *NPY_UNUSED(auxdata))
10501022
{
10511023
npy_intp N = dimensions[0];
10521024
char *in_ptr = data[0];
@@ -1056,15 +1028,9 @@ numpy_to_quad_strided_loop_aligned(PyArrayMethod_Context *context, char *const d
10561028
QuadBackendType backend = descr_out->backend;
10571029

10581030
while (N--) {
1059-
typename NpyType<T>::TYPE in_val = *(typename NpyType<T>::TYPE *)in_ptr;
1031+
typename NpyType<T>::TYPE in_val = load<Aligned, typename NpyType<T>::TYPE>(in_ptr);
10601032
quad_value out_val = to_quad<T>(in_val, backend);
1061-
1062-
if (backend == BACKEND_SLEEF) {
1063-
*(Sleef_quad *)(out_ptr) = out_val.sleef_value;
1064-
}
1065-
else {
1066-
*(long double *)(out_ptr) = out_val.longdouble_value;
1067-
}
1033+
store_quad<Aligned>(out_ptr, out_val, backend);
10681034

10691035
in_ptr += strides[0];
10701036
out_ptr += strides[1];
@@ -1274,39 +1240,11 @@ quad_to_numpy_resolve_descriptors(PyObject *NPY_UNUSED(self), PyArray_DTypeMeta
12741240
return NPY_UNSAFE_CASTING;
12751241
}
12761242

1277-
template <typename T>
1243+
template <bool Aligned, typename T>
12781244
static int
1279-
quad_to_numpy_strided_loop_unaligned(PyArrayMethod_Context *context, char *const data[],
1280-
npy_intp const dimensions[], npy_intp const strides[],
1281-
void *NPY_UNUSED(auxdata))
1282-
{
1283-
npy_intp N = dimensions[0];
1284-
char *in_ptr = data[0];
1285-
char *out_ptr = data[1];
1286-
1287-
QuadPrecDTypeObject *quad_descr = (QuadPrecDTypeObject *)context->descriptors[0];
1288-
QuadBackendType backend = quad_descr->backend;
1289-
1290-
size_t elem_size = (backend == BACKEND_SLEEF) ? sizeof(Sleef_quad) : sizeof(long double);
1291-
1292-
while (N--) {
1293-
quad_value in_val;
1294-
memcpy(&in_val, in_ptr, elem_size);
1295-
1296-
typename NpyType<T>::TYPE out_val = from_quad<T>(in_val, backend);
1297-
memcpy(out_ptr, &out_val, sizeof(typename NpyType<T>::TYPE));
1298-
1299-
in_ptr += strides[0];
1300-
out_ptr += strides[1];
1301-
}
1302-
return 0;
1303-
}
1304-
1305-
template <typename T>
1306-
static int
1307-
quad_to_numpy_strided_loop_aligned(PyArrayMethod_Context *context, char *const data[],
1308-
npy_intp const dimensions[], npy_intp const strides[],
1309-
void *NPY_UNUSED(auxdata))
1245+
quad_to_numpy_strided_loop(PyArrayMethod_Context *context, char *const data[],
1246+
npy_intp const dimensions[], npy_intp const strides[],
1247+
void *NPY_UNUSED(auxdata))
13101248
{
13111249
npy_intp N = dimensions[0];
13121250
char *in_ptr = data[0];
@@ -1316,16 +1254,9 @@ quad_to_numpy_strided_loop_aligned(PyArrayMethod_Context *context, char *const d
13161254
QuadBackendType backend = quad_descr->backend;
13171255

13181256
while (N--) {
1319-
quad_value in_val;
1320-
if (backend == BACKEND_SLEEF) {
1321-
in_val.sleef_value = *(Sleef_quad *)in_ptr;
1322-
}
1323-
else {
1324-
in_val.longdouble_value = *(long double *)in_ptr;
1325-
}
1326-
1257+
quad_value in_val = load_quad<Aligned>(in_ptr, backend);
13271258
typename NpyType<T>::TYPE out_val = from_quad<T>(in_val, backend);
1328-
*(typename NpyType<T>::TYPE *)(out_ptr) = out_val;
1259+
store<Aligned, typename NpyType<T>::TYPE>(out_ptr, out_val);
13291260

13301261
in_ptr += strides[0];
13311262
out_ptr += strides[1];
@@ -1358,8 +1289,8 @@ add_cast_from(PyArray_DTypeMeta *to)
13581289

13591290
PyType_Slot *slots = new PyType_Slot[]{
13601291
{NPY_METH_resolve_descriptors, (void *)&quad_to_numpy_resolve_descriptors<T>},
1361-
{NPY_METH_strided_loop, (void *)&quad_to_numpy_strided_loop_aligned<T>},
1362-
{NPY_METH_unaligned_strided_loop, (void *)&quad_to_numpy_strided_loop_unaligned<T>},
1292+
{NPY_METH_strided_loop, (void *)&quad_to_numpy_strided_loop<true, T>},
1293+
{NPY_METH_unaligned_strided_loop, (void *)&quad_to_numpy_strided_loop<false, T>},
13631294
{0, nullptr}};
13641295

13651296
PyArrayMethod_Spec *spec = new PyArrayMethod_Spec{
@@ -1382,8 +1313,8 @@ add_cast_to(PyArray_DTypeMeta *from)
13821313

13831314
PyType_Slot *slots = new PyType_Slot[]{
13841315
{NPY_METH_resolve_descriptors, (void *)&numpy_to_quad_resolve_descriptors<T>},
1385-
{NPY_METH_strided_loop, (void *)&numpy_to_quad_strided_loop_aligned<T>},
1386-
{NPY_METH_unaligned_strided_loop, (void *)&numpy_to_quad_strided_loop_unaligned<T>},
1316+
{NPY_METH_strided_loop, (void *)&numpy_to_quad_strided_loop<true, T>},
1317+
{NPY_METH_unaligned_strided_loop, (void *)&numpy_to_quad_strided_loop<false, T>},
13871318
{0, nullptr}};
13881319

13891320
PyArrayMethod_Spec *spec = new PyArrayMethod_Spec{

0 commit comments

Comments
 (0)