@@ -283,7 +283,7 @@ quad_generic_binop_2out_strided_loop_aligned(PyArrayMethod_Context *context, cha
283283}
284284
285285// todo: I'll preferrable get all this code duplication in templates later
286- // Special resolve descriptors for ldexp (QuadPrecDType, int32 ) -> QuadPrecDType
286+ // resolve descriptors for ldexp (QuadPrecDType, int ) -> QuadPrecDType
287287static NPY_CASTING
288288quad_ldexp_resolve_descriptors (PyObject *self, PyArray_DTypeMeta *const dtypes[],
289289 PyArray_Descr *const given_descrs[],
@@ -296,13 +296,9 @@ quad_ldexp_resolve_descriptors(PyObject *self, PyArray_DTypeMeta *const dtypes[]
296296 Py_INCREF (given_descrs[0 ]);
297297 loop_descrs[0 ] = given_descrs[0 ];
298298
299- // Input 1: int (no need to incref, it's a builtin dtype)
300- if (given_descrs[1 ] == NULL ) {
301- loop_descrs[1 ] = PyArray_DescrFromType (NPY_INT32);
302- } else {
303- Py_INCREF (given_descrs[1 ]);
304- loop_descrs[1 ] = given_descrs[1 ];
305- }
299+ // Input 1: Use NPY_INTP (int64 on 64-bit, int32 on 32-bit) to match platform integer size
300+ // This ensures we can handle the full range of PyArray_PyLongDType without data loss
301+ loop_descrs[1 ] = PyArray_DescrFromType (NPY_INTP);
306302
307303 // Output: QuadPrecDType with same backend as input
308304 if (given_descrs[2 ] == NULL ) {
@@ -322,7 +318,8 @@ quad_ldexp_resolve_descriptors(PyObject *self, PyArray_DTypeMeta *const dtypes[]
322318 loop_descrs[2 ] = given_descrs[2 ];
323319 }
324320 }
325- return NPY_NO_CASTING;
321+ // Return SAFE_CASTING to allow conversion from other integer types to intp
322+ return NPY_SAFE_CASTING;
326323}
327324
328325// Strided loop for ldexp (unaligned)
@@ -333,9 +330,9 @@ quad_ldexp_strided_loop_unaligned(PyArrayMethod_Context *context, char *const da
333330 NpyAuxData *auxdata)
334331{
335332 npy_intp N = dimensions[0 ];
336- char *in1_ptr = data[0 ]; // quad
337- char *in2_ptr = data[1 ]; // int32
338- char *out_ptr = data[2 ]; // quad
333+ char *in1_ptr = data[0 ];
334+ char *in2_ptr = data[1 ];
335+ char *out_ptr = data[2 ];
339336 npy_intp in1_stride = strides[0 ];
340337 npy_intp in2_stride = strides[1 ];
341338 npy_intp out_stride = strides[2 ];
@@ -345,14 +342,17 @@ quad_ldexp_strided_loop_unaligned(PyArrayMethod_Context *context, char *const da
345342 size_t elem_size = (backend == BACKEND_SLEEF) ? sizeof (Sleef_quad) : sizeof (long double );
346343
347344 quad_value in1, out;
348- int in2;
345+ npy_intp in2_intp; // Platform-native integer (int64 on 64-bit, int32 on 32-bit)
349346 while (N--) {
350347 memcpy (&in1, in1_ptr, elem_size);
351- memcpy (&in2, in2_ptr, sizeof (int ));
348+ memcpy (&in2_intp, in2_ptr, sizeof (npy_intp));
349+
350+ int exp_value = (int )in2_intp;
351+
352352 if (backend == BACKEND_SLEEF) {
353- out.sleef_value = sleef_op (&in1.sleef_value , &in2 );
353+ out.sleef_value = sleef_op (&in1.sleef_value , &exp_value );
354354 } else {
355- out.longdouble_value = longdouble_op (&in1.longdouble_value , &in2 );
355+ out.longdouble_value = longdouble_op (&in1.longdouble_value , &exp_value );
356356 }
357357 memcpy (out_ptr, &out, elem_size);
358358
@@ -371,9 +371,9 @@ quad_ldexp_strided_loop_aligned(PyArrayMethod_Context *context, char *const data
371371 NpyAuxData *auxdata)
372372{
373373 npy_intp N = dimensions[0 ];
374- char *in1_ptr = data[0 ]; // quad
375- char *in2_ptr = data[1 ]; // int32
376- char *out_ptr = data[2 ]; // quad
374+ char *in1_ptr = data[0 ];
375+ char *in2_ptr = data[1 ];
376+ char *out_ptr = data[2 ];
377377 npy_intp in1_stride = strides[0 ];
378378 npy_intp in2_stride = strides[1 ];
379379 npy_intp out_stride = strides[2 ];
@@ -382,10 +382,13 @@ quad_ldexp_strided_loop_aligned(PyArrayMethod_Context *context, char *const data
382382 QuadBackendType backend = descr->backend ;
383383
384384 while (N--) {
385+ npy_intp exp_intp = *(npy_intp *)in2_ptr;
386+ int exp_value = (int )exp_intp;
387+
385388 if (backend == BACKEND_SLEEF) {
386- *(Sleef_quad *)out_ptr = sleef_op ((Sleef_quad *)in1_ptr, ( int *)in2_ptr );
389+ *(Sleef_quad *)out_ptr = sleef_op ((Sleef_quad *)in1_ptr, &exp_value );
387390 } else {
388- *(long double *)out_ptr = longdouble_op ((long double *)in1_ptr, ( int *)in2_ptr );
391+ *(long double *)out_ptr = longdouble_op ((long double *)in1_ptr, &exp_value );
389392 }
390393
391394 in1_ptr += in1_stride;
0 commit comments