1818// aligned. Unaligned pointers may risk seg-faulting.
1919//
2020
21- #if defined __SSE2__ || (_MSC_VER && (_M_IX86 || _M_X64 ))
21+ #if defined __SSE2__ || (_MSC_VER && (_M_IX86 || _M_X64 ) && !defined( _M_ARM64EC ) )
2222# define IMF_HAVE_SSE2 1
2323# include <emmintrin.h>
2424# include <mmintrin.h>
3535# define IMF_HAVE_NEON_AARCH64 1
3636#endif
3737
38+ #if defined(_M_ARM64 ) || defined(_M_ARM64EC )
39+ # define IMF_HAVE_NEON_WINDOWS_ARM64 1
40+ #endif
41+
42+ #if defined(IMF_HAVE_NEON_AARCH64 ) || defined(IMF_HAVE_NEON_WINDOWS_ARM64 )
43+ # define IMF_HAVE_NEON_ARM64 1
44+ #endif
45+
46+ #if defined(IMF_HAVE_NEON_ARM64 )
47+ # if defined(_MSC_VER )
48+ # define NEON_RESTRICT __restrict
49+ # else
50+ # define NEON_RESTRICT __restrict__
51+ # endif
52+ #endif
53+
3854#include "internal_coding.h"
3955
4056#if defined(OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX ) && \
@@ -357,7 +373,7 @@ convertFloatToHalf64_scalar (uint16_t* dst, float* src)
357373 dst [i ] = float_to_half (src [i ]);
358374}
359375
360- #ifdef IMF_HAVE_NEON_AARCH64
376+ #ifdef IMF_HAVE_NEON_ARM64
361377
362378void
363379convertFloatToHalf64_neon (uint16_t * dst , float * src )
@@ -786,36 +802,50 @@ fromHalfZigZag_f16c (uint16_t* src, float* dst)
786802#endif /* defined IMF_HAVE_GCC_INLINEASM_X86_64 */
787803}
788804
789- #ifdef IMF_HAVE_NEON_AARCH64
805+ #ifdef IMF_HAVE_NEON_ARM64
790806
791807void
792- fromHalfZigZag_neon (uint16_t * __restrict__ src , float * __restrict__ dst )
808+ fromHalfZigZag_neon (uint16_t * NEON_RESTRICT src , float * NEON_RESTRICT dst )
793809{
810+ # if defined(_MSC_VER )
811+ static const uint8_t res_tbl_data [4 ][16 ] = {
812+ {0 , 1 , 5 , 6 , 14 , 15 , 27 , 28 , 2 , 4 , 7 , 13 , 16 , 26 , 29 , 42 },
813+ {3 , 8 , 12 , 17 , 25 , 30 , 41 , 43 , 9 , 11 , 18 , 24 , 31 , 40 , 44 , 53 },
814+ {10 , 19 , 23 , 32 , 39 , 45 , 52 , 54 , 20 , 22 , 33 , 38 , 46 , 51 , 55 , 60 },
815+ {21 , 34 , 37 , 47 , 50 , 56 , 59 , 61 , 35 , 36 , 48 , 49 , 57 , 58 , 62 , 63 }};
816+
817+ uint8x16_t res_tbl [4 ];
818+ for (int i = 0 ; i < 4 ; i ++ )
819+ {
820+ res_tbl [i ] = vld1q_u8 (res_tbl_data [i ]);
821+ }
822+
823+ # else
794824 uint8x16_t res_tbl [4 ] = {
795825 {0 , 1 , 5 , 6 , 14 , 15 , 27 , 28 , 2 , 4 , 7 , 13 , 16 , 26 , 29 , 42 },
796826 {3 , 8 , 12 , 17 , 25 , 30 , 41 , 43 , 9 , 11 , 18 , 24 , 31 , 40 , 44 , 53 },
797827 {10 , 19 , 23 , 32 , 39 , 45 , 52 , 54 , 20 , 22 , 33 , 38 , 46 , 51 , 55 , 60 },
798828 {21 , 34 , 37 , 47 , 50 , 56 , 59 , 61 , 35 , 36 , 48 , 49 , 57 , 58 , 62 , 63 }};
829+ # endif
799830
800831 uint8x16x4_t vec_input_l , vec_input_h ;
801-
802832 for (int i = 0 ; i < 4 ; i ++ )
803833 {
804834 uint8x16x2_t vec_in_u8 = vld2q_u8 ((uint8_t * ) (src + 16 * i ));
805835 vec_input_l .val [i ] = vec_in_u8 .val [0 ];
806836 vec_input_h .val [i ] = vec_in_u8 .val [1 ];
807837 }
808-
809838# pragma unroll(4)
810839 for (int i = 0 ; i < 4 ; i ++ )
811840 {
812- uint8x16_t res_vec_l , res_vec_h ;
813- res_vec_l = vqtbl4q_u8 (vec_input_l , res_tbl [i ]);
814- res_vec_h = vqtbl4q_u8 ( vec_input_h , res_tbl [ i ]);
841+ uint8x16_t res_vec_l = vqtbl4q_u8 ( vec_input_l , res_tbl [ i ]) ;
842+ uint8x16_t res_vec_h = vqtbl4q_u8 (vec_input_h , res_tbl [i ]);
843+
815844 float16x8_t res_vec_l_f16 =
816845 vreinterpretq_f16_u8 (vzip1q_u8 (res_vec_l , res_vec_h ));
817846 float16x8_t res_vec_h_f16 =
818847 vreinterpretq_f16_u8 (vzip2q_u8 (res_vec_l , res_vec_h ));
848+
819849 vst1q_f32 (dst + i * 16 , vcvt_f32_f16 (vget_low_f16 (res_vec_l_f16 )));
820850 vst1q_f32 (dst + i * 16 + 4 , vcvt_high_f32_f16 (res_vec_l_f16 ));
821851 vst1q_f32 (
@@ -824,7 +854,7 @@ fromHalfZigZag_neon (uint16_t* __restrict__ src, float* __restrict__ dst)
824854 }
825855}
826856
827- #endif // IMF_HAVE_NEON_AARCH64
857+ #endif //IMF_HAVE_NEON_ARM64
828858
829859//
830860// Inverse 8x8 DCT, only inverting the DC. This assumes that
@@ -2315,7 +2345,7 @@ initializeFuncs (void)
23152345 if (done ) return ;
23162346 done = 1 ;
23172347
2318- #ifdef IMF_HAVE_NEON_AARCH64
2348+ #ifdef IMF_HAVE_NEON_ARM64
23192349 {
23202350 convertFloatToHalf64 = convertFloatToHalf64_neon ;
23212351 fromHalfZigZag = fromHalfZigZag_neon ;
0 commit comments