Skip to content

Commit 77bc322

Browse files
niyas-saitmattipcharris
authored
ENH: Add support for windows on arm targets (numpy#19513)
* add support for windows on arm targets * Philox: Use _umulh intrinsic for ARM64 target * CPU Detection: Refactor to avoid separate pre-processor definition for WoA * adapt test_dragon4 to avoid using pow (**) to workaround issue in windows C RT for arm64 * Update numpy/core/include/numpy/npy_cpu.h Co-authored-by: Matti Picus <[email protected]> * add release note for numpy windows/arm64 support * Update 19513.new_feature.rst Co-authored-by: Matti Picus <[email protected]> Co-authored-by: Charles Harris <[email protected]>
1 parent 2a86270 commit 77bc322

File tree

4 files changed

+17
-5
lines changed

4 files changed

+17
-5
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Preliminary support for `windows/arm64` target
2+
----------------------------------------------
3+
``numpy`` added support for windows/arm64 target. Please note
4+
``OpenBLAS`` support is not yet available for windows/arm64 target.

numpy/core/include/numpy/npy_cpu.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@
6363
#define NPY_CPU_HPPA
6464
#elif defined(__alpha__)
6565
#define NPY_CPU_ALPHA
66-
#elif defined(__arm__) || defined(__aarch64__)
66+
#elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM64)
67+
/* _M_ARM64 is defined in MSVC for ARM64 compilation on Windows */
6768
#if defined(__ARMEB__) || defined(__AARCH64EB__)
6869
#if defined(__ARM_32BIT_STATE)
6970
#define NPY_CPU_ARMEB_AARCH32
@@ -72,10 +73,10 @@
7273
#else
7374
#define NPY_CPU_ARMEB
7475
#endif
75-
#elif defined(__ARMEL__) || defined(__AARCH64EL__)
76+
#elif defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
7677
#if defined(__ARM_32BIT_STATE)
7778
#define NPY_CPU_ARMEL_AARCH32
78-
#elif defined(__ARM_64BIT_STATE)
79+
#elif defined(__ARM_64BIT_STATE) || defined(_M_ARM64)
7980
#define NPY_CPU_ARMEL_AARCH64
8081
#else
8182
#define NPY_CPU_ARMEL

numpy/core/tests/test_scalarprint.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ def test_dragon4(self):
154154
"0.00000000000000000000000000000000000000000000140129846432"
155155
"4817070923729583289916131280261941876515771757068283889791"
156156
"08268586060148663818836212158203125")
157-
assert_equal(fpos64(0.5**(1022 + 52), unique=False, precision=1074),
157+
158+
assert_equal(fpos64(5e-324, unique=False, precision=1074),
158159
"0.00000000000000000000000000000000000000000000000000000000"
159160
"0000000000000000000000000000000000000000000000000000000000"
160161
"0000000000000000000000000000000000000000000000000000000000"

numpy/random/src/philox/philox.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,16 @@ static NPY_INLINE uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *hip) {
3333
return (uint64_t)product;
3434
}
3535
#else
36-
#ifdef _WIN32
36+
#if defined(_WIN32)
3737
#include <intrin.h>
3838
#if defined(_WIN64) && defined(_M_AMD64)
3939
#pragma intrinsic(_umul128)
40+
#elif defined(_WIN64) && defined(_M_ARM64)
41+
#pragma intrinsic(__umulh)
42+
static NPY_INLINE uint64_t _umul128(uint64_t a, uint64_t b, uint64_t *high) {
43+
*high = __umulh(a, b);
44+
return a * b;
45+
}
4046
#else
4147
#pragma intrinsic(__emulu)
4248
static NPY_INLINE uint64_t _umul128(uint64_t a, uint64_t b, uint64_t *high) {

0 commit comments

Comments
 (0)