@@ -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>
10181018static 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>
12781244static 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