Skip to content

Commit bcddc64

Browse files
Fixes to build with MSVC on Windows on Arm (#278)
* Correct build issues with MSVC compiler for Windows on Arm when compiling Neon code
1 parent 67875c7 commit bcddc64

645 files changed

Lines changed: 3120 additions & 1078 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/runwinarm.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: Neon tests
2+
on:
3+
workflow_dispatch:
4+
push:
5+
branches: [winarm]
6+
7+
permissions:
8+
actions: read
9+
security-events: write
10+
11+
jobs:
12+
CI_test_run:
13+
runs-on: windows-11-arm
14+
15+
steps:
16+
- name: Checkout
17+
uses: actions/checkout@v5
18+
19+
- name: Setup Python 3.12
20+
uses: actions/setup-python@v6
21+
with:
22+
python-version: '3.12'
23+
24+
- name: Install standard tools
25+
run: |
26+
choco install gow
27+
refreshenv
28+
29+
- name: Prepare framework
30+
run: |
31+
cmd /c '"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=arm64 && C:\a\CMSIS-DSP\CMSIS-DSP\Testing\winarm_test\test.bat'
32+
33+
34+

Include/arm_math_types.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,22 +89,30 @@ extern "C"
8989
#define __ALIGNED(x) __declspec(align(x))
9090
#define __WEAK
9191
#define SECTION_NOINIT
92+
#define NO_INLINE __declspec(noinline)
93+
94+
9295
#elif defined ( __APPLE_CC__ )
9396
#include <stdint.h>
9497
#define __ALIGNED(x) __attribute__((aligned(x)))
9598
#define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
9699
#define __STATIC_INLINE static inline
97100
#define __WEAK
98101
#define SECTION_NOINIT
102+
#define NO_INLINE __attribute__ ((noinline))
99103
#elif defined (__GNUC_PYTHON__)
100104
#include <stdint.h>
101105
#define __ALIGNED(x) __attribute__((aligned(x)))
102106
#define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
103107
#define __STATIC_INLINE static inline
104108
#define __WEAK
105109
#define SECTION_NOINIT __attribute__((section(".noinit")))
110+
#define NO_INLINE __attribute__ ((noinline))
111+
106112
#else
107113
#define SECTION_NOINIT
114+
#define NO_INLINE __attribute__ ((noinline))
115+
108116
#include "cmsis_compiler.h"
109117
#endif
110118

Include/arm_neon_tables.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ extern const float32_t arm_neon_rfft_twiddles_16_f32[ARM_NEON_RFFT_TWIDDLES_16_F
4747
#define ARM_NEON_RFFT_FACTORS_16_F32_LEN 4
4848
extern const uint32_t arm_neon_rfft_factors_16_f32[ARM_NEON_RFFT_FACTORS_16_F32_LEN];
4949
#define ARM_NEON_RFFT_TWIDDLES_NEON_16_F32_LEN 0
50-
extern const float32_t arm_neon_rfft_twiddles_neon_16_f32[ARM_NEON_RFFT_TWIDDLES_NEON_16_F32_LEN];
50+
extern const float32_t *arm_neon_rfft_twiddles_neon_16_f32;
51+
5152
#define ARM_NEON_RFFT_FACTORS_NEON_16_F32_LEN 4
5253
extern const uint32_t arm_neon_rfft_factors_neon_16_f32[ARM_NEON_RFFT_FACTORS_NEON_16_F32_LEN];
5354
#define ARM_NEON_RFFT_SUPER_TWIDDLES_NEON_16_F32_LEN 24
@@ -60,7 +61,8 @@ extern const float32_t arm_neon_rfft_twiddles_32_f32[ARM_NEON_RFFT_TWIDDLES_32_F
6061
#define ARM_NEON_RFFT_FACTORS_32_F32_LEN 4
6162
extern const uint32_t arm_neon_rfft_factors_32_f32[ARM_NEON_RFFT_FACTORS_32_F32_LEN];
6263
#define ARM_NEON_RFFT_TWIDDLES_NEON_32_F32_LEN 0
63-
extern const float32_t arm_neon_rfft_twiddles_neon_32_f32[ARM_NEON_RFFT_TWIDDLES_NEON_32_F32_LEN];
64+
extern const float32_t *arm_neon_rfft_twiddles_neon_32_f32;
65+
6466
#define ARM_NEON_RFFT_FACTORS_NEON_32_F32_LEN 4
6567
extern const uint32_t arm_neon_rfft_factors_neon_32_f32[ARM_NEON_RFFT_FACTORS_NEON_32_F32_LEN];
6668
#define ARM_NEON_RFFT_SUPER_TWIDDLES_NEON_32_F32_LEN 24
@@ -160,7 +162,8 @@ extern const float32_t arm_neon_rfft_super_twiddles_neon_4096_f32[ARM_NEON_RFFT_
160162
#define ARM_NE10_OFFSET_BACKWARD_TWID_NEON_4096_F32 1020
161163

162164
#define ARM_NEON_RFFT_TWIDDLES_16_Q31_LEN 0
163-
extern const q31_t arm_neon_rfft_twiddles_16_q31[ARM_NEON_RFFT_TWIDDLES_16_Q31_LEN];
165+
extern const q31_t *arm_neon_rfft_twiddles_16_q31;
166+
164167
#define ARM_NEON_RFFT_FACTORS_16_Q31_LEN 4
165168
extern const uint32_t arm_neon_rfft_factors_16_q31[ARM_NEON_RFFT_FACTORS_16_Q31_LEN];
166169
#define ARM_NEON_RFFT_SUPER_TWIDDLES_NEON_16_Q31_LEN 8
@@ -240,7 +243,8 @@ extern const q31_t arm_neon_rfft_super_twiddles_neon_8192_q31[ARM_NEON_RFFT_SUPE
240243
#define ARM_NE10_OFFSET_BACKWARD_TWID_RFFT_8192_Q31 4092
241244

242245
#define ARM_NEON_RFFT_TWIDDLES_16_Q15_LEN 0
243-
extern const q15_t arm_neon_rfft_twiddles_16_q15[ARM_NEON_RFFT_TWIDDLES_16_Q15_LEN];
246+
extern const q15_t *arm_neon_rfft_twiddles_16_q15;
247+
244248
#define ARM_NEON_RFFT_FACTORS_16_Q15_LEN 4
245249
extern const uint32_t arm_neon_rfft_factors_16_q15[ARM_NEON_RFFT_FACTORS_16_Q15_LEN];
246250
#define ARM_NEON_RFFT_SUPER_TWIDDLES_NEON_16_Q15_LEN 8

Include/arm_neon_tables_f16.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ extern const float16_t arm_neon_rfft_twiddles_16_f16[ARM_NEON_RFFT_TWIDDLES_16_F
9292
#define ARM_NEON_RFFT_FACTORS_16_F16_LEN 4
9393
extern const uint32_t arm_neon_rfft_factors_16_f16[ARM_NEON_RFFT_FACTORS_16_F16_LEN];
9494
#define ARM_NEON_RFFT_TWIDDLES_NEON_16_F16_LEN 0
95-
extern const float16_t arm_neon_rfft_twiddles_neon_16_f16[ARM_NEON_RFFT_TWIDDLES_NEON_16_F16_LEN];
95+
extern const float16_t *arm_neon_rfft_twiddles_neon_16_f16;
96+
9697
#define ARM_NEON_RFFT_FACTORS_NEON_16_F16_LEN 4
9798
extern const uint32_t arm_neon_rfft_factors_neon_16_f16[ARM_NEON_RFFT_FACTORS_NEON_16_F16_LEN];
9899
#define ARM_NEON_RFFT_SUPER_TWIDDLES_NEON_16_F16_LEN 24
@@ -105,7 +106,8 @@ extern const float16_t arm_neon_rfft_twiddles_32_f16[ARM_NEON_RFFT_TWIDDLES_32_F
105106
#define ARM_NEON_RFFT_FACTORS_32_F16_LEN 4
106107
extern const uint32_t arm_neon_rfft_factors_32_f16[ARM_NEON_RFFT_FACTORS_32_F16_LEN];
107108
#define ARM_NEON_RFFT_TWIDDLES_NEON_32_F16_LEN 0
108-
extern const float16_t arm_neon_rfft_twiddles_neon_32_f16[ARM_NEON_RFFT_TWIDDLES_NEON_32_F16_LEN];
109+
extern const float16_t *arm_neon_rfft_twiddles_neon_32_f16;
110+
109111
#define ARM_NEON_RFFT_FACTORS_NEON_32_F16_LEN 4
110112
extern const uint32_t arm_neon_rfft_factors_neon_32_f16[ARM_NEON_RFFT_FACTORS_NEON_32_F16_LEN];
111113
#define ARM_NEON_RFFT_SUPER_TWIDDLES_NEON_32_F16_LEN 24
@@ -206,7 +208,7 @@ extern const float16_t arm_neon_rfft_super_twiddles_neon_4096_f16[ARM_NEON_RFFT_
206208

207209

208210

209-
#endif /* defined(ARM_MATH_NEON_FLOAT16) */
211+
#endif /* defined(ARM_MATH_NEON_FLOAT16) && defined(ARM_FLOAT16_SUPPORTED) */
210212

211213

212214

Include/dsp/none.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ compiler file in Core or Core_A would not make sense.
7272
count += 1U;
7373
mask = mask >> 1U;
7474
}
75-
return count;
75+
return ((uint8_t)count);
7676
}
7777

7878
__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat)

Ne10/CMSIS_NE10_fft.neonintrinsic.h

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737
#include <arm_neon.h>
3838

3939
#define NE10_CPX_ADD_NEON_F32(Z,A,B) do { \
40-
Z.val[0] = A.val[0] + B.val[0]; \
41-
Z.val[1] = A.val[1] + B.val[1]; \
40+
Z.val[0] = vaddq_f32(A.val[0], B.val[0]); \
41+
Z.val[1] = vaddq_f32(A.val[1], B.val[1]); \
4242
} while (0);
4343

4444
#define NE10_CPX_SUB_NEON_F32(Z,A,B) do { \
45-
Z.val[0] = A.val[0] - B.val[0]; \
46-
Z.val[1] = A.val[1] - B.val[1]; \
45+
Z.val[0] = vsubq_f32(A.val[0] , B.val[0]); \
46+
Z.val[1] = vsubq_f32(A.val[1] , B.val[1]); \
4747
} while (0);
4848

4949
#define NE10_CPX_MUL_NEON_F32(Z,A,B) do { \
@@ -111,16 +111,10 @@
111111
#define VDUPQ_N_F32(VAR) { VAR, VAR, VAR, VAR }
112112

113113
#define CONST_TW_81 0.70710678f
114-
#define CONST_TW_81N -0.70710678f
115-
116-
static const float32x4_t Q_TW_81 = VDUPQ_N_F32(CONST_TW_81 );
117-
static const float32x4_t Q_TW_81N = VDUPQ_N_F32(CONST_TW_81N);
114+
#define CONST_TW_81N (-0.70710678f)
118115

119116
#define DIV_TW81 1.4142136f
120-
#define DIV_TW81N -1.4142136f
121-
122-
static const float32x4_t DIV_TW81_NEON = VDUPQ_N_F32(DIV_TW81);
123-
static const float32x4_t DIV_TW81N_NEON = VDUPQ_N_F32(DIV_TW81N);
117+
#define DIV_TW81N (-1.4142136f)
124118

125119
#define NE10_RADIX8x4_R2C_NEON_KERNEL_S1(Q_OUT,Q_IN) do { \
126120
Q_OUT ## 0 = vaddq_f32 (Q_IN ## 0, Q_IN ## 4); \
@@ -131,8 +125,8 @@ static const float32x4_t DIV_TW81N_NEON = VDUPQ_N_F32(DIV_TW81N);
131125
Q_OUT ## 5 = vsubq_f32 (Q_IN ## 2, Q_IN ## 6); \
132126
Q_OUT ## 6 = vaddq_f32 (Q_IN ## 3, Q_IN ## 7); \
133127
Q_OUT ## 7 = vsubq_f32 (Q_IN ## 3, Q_IN ## 7); \
134-
Q_OUT ## 3 = vmulq_f32 (Q_OUT ## 3, Q_TW_81 ); \
135-
Q_OUT ## 7 = vmulq_f32 (Q_OUT ## 7, Q_TW_81N); \
128+
Q_OUT ## 3 = vmulq_n_f32 (Q_OUT ## 3, CONST_TW_81 ); \
129+
Q_OUT ## 7 = vmulq_n_f32 (Q_OUT ## 7, CONST_TW_81N); \
136130
} while(0);
137131

138132
#define NE10_RADIX8x4_R2C_NEON_KERNEL_S2(Q_OUT,Q_IN) do { \
@@ -172,8 +166,8 @@ static const float32x4_t DIV_TW81N_NEON = VDUPQ_N_F32(DIV_TW81N);
172166
} while (0);
173167

174168
#define NE10_RADIX8x4_C2R_NEON_KERNEL_S2(Q_OUT,Q_IN) do { \
175-
Q_IN ## 3 = vmulq_f32(Q_IN ## 3,DIV_TW81_NEON); \
176-
Q_IN ## 7 = vmulq_f32(Q_IN ## 7,DIV_TW81N_NEON); \
169+
Q_IN ## 3 = vmulq_n_f32(Q_IN ## 3,DIV_TW81); \
170+
Q_IN ## 7 = vmulq_n_f32(Q_IN ## 7,DIV_TW81N); \
177171
Q_OUT ## 0 = vaddq_f32(Q_IN ## 0, Q_IN ## 1); \
178172
Q_OUT ## 4 = vsubq_f32(Q_IN ## 0, Q_IN ## 1); \
179173
Q_OUT ## 1 = vaddq_f32(Q_IN ## 2, Q_IN ## 3); \
@@ -330,8 +324,8 @@ static const float32x4_t DIV_TW81N_NEON = VDUPQ_N_F32(DIV_TW81N);
330324

331325
#define NE10_RADIX4x4_R2C_TW_NEON_KERNEL_LAST(Q_OUT,Q_IN) do { \
332326
float32x4_t Q_TMP; \
333-
Q_IN ## 1 = vmulq_f32(Q_IN ## 1, Q_TW_81); \
334-
Q_IN ## 3 = vmulq_f32(Q_IN ## 3, Q_TW_81); \
327+
Q_IN ## 1 = vmulq_n_f32(Q_IN ## 1, CONST_TW_81); \
328+
Q_IN ## 3 = vmulq_n_f32(Q_IN ## 3, CONST_TW_81); \
335329
Q_TMP = vsubq_f32(Q_IN ## 1, Q_IN ## 3); \
336330
Q_IN ## 3 = vaddq_f32(Q_IN ## 1, Q_IN ## 3); \
337331
Q_IN ## 1 = Q_TMP; \
@@ -352,8 +346,8 @@ static const float32x4_t DIV_TW81N_NEON = VDUPQ_N_F32(DIV_TW81N);
352346
Q_TMP = vaddq_f32(Q_OUT ## 1, Q_OUT ## 3); \
353347
Q_OUT ## 3 = vsubq_f32(Q_OUT ## 3, Q_OUT ## 1); \
354348
Q_OUT ## 1 = Q_TMP; \
355-
Q_OUT ## 1 = vmulq_f32( Q_OUT ## 1, DIV_TW81_NEON); \
356-
Q_OUT ## 3 = vmulq_f32( Q_OUT ## 3, DIV_TW81_NEON); \
349+
Q_OUT ## 1 = vmulq_n_f32( Q_OUT ## 1, DIV_TW81); \
350+
Q_OUT ## 3 = vmulq_n_f32( Q_OUT ## 3, DIV_TW81); \
357351
Q_OUT ## 0 = vaddq_f32( Q_OUT ## 0, Q_OUT ## 0 ); \
358352
Q_OUT ## 2 = vaddq_f32( Q_OUT ## 2, Q_OUT ## 2 ); \
359353
} while(0);

Ne10/CMSIS_NE10_fft_generic_float16.neonintrisic.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ POSSIBILITY OF SUCH DAMAGE.
5757
*
5858
*/
5959

60+
#include "arm_compiler_specific.h"
6061
#include <arm_neon.h>
6162

6263
#include "CMSIS_NE10_types.h"

0 commit comments

Comments
 (0)