@@ -11,10 +11,11 @@ endif()
1111set (SSE_FLAGS "-msse3" )
1212set (AVX_FLAGS "-mavx" )
1313set (AVX2_FLAGS "-mfma -mavx2" )
14+ set (NEON_FLAGS "-march=armv8-a+fp+simd" )
1415
1516find_package (BISON)
1617find_package (FLEX)
17- set (LIBPLL_BISON_FLAGS "-y - d -p pll_utree_" )
18+ set (LIBPLL_BISON_FLAGS "-d -p pll_utree_" )
1819set (LIBPLL_FLEX_FLAGS "-P pll_utree_" )
1920BISON_TARGET(parse_utree_t
2021 ${CMAKE_CURRENT_SOURCE_DIR} /parse_utree.y ${CMAKE_CURRENT_BINARY_DIR} /parse_utree.c
@@ -23,7 +24,7 @@ FLEX_TARGET(lex_utree_t
2324 ${CMAKE_CURRENT_SOURCE_DIR} /lex_utree.l ${CMAKE_CURRENT_BINARY_DIR} /lex_utree.c
2425 COMPILE_FLAGS ${LIBPLL_FLEX_FLAGS} )
2526ADD_FLEX_BISON_DEPENDENCY(lex_utree_t parse_utree_t)
26- set (LIBPLL_BISON_FLAGS "-y - d -p pll_rtree_" )
27+ set (LIBPLL_BISON_FLAGS "-d -p pll_rtree_" )
2728set (LIBPLL_FLEX_FLAGS "-P pll_rtree_" )
2829BISON_TARGET(parse_rtree_t
2930 ${CMAKE_CURRENT_SOURCE_DIR} /parse_rtree.y ${CMAKE_CURRENT_BINARY_DIR} /parse_rtree.c
@@ -104,8 +105,11 @@ endif ()
104105if (NOT DEFINED ENABLE_AVX2)
105106 SET (ENABLE_AVX2 "True" )
106107endif ()
108+ if (NOT DEFINED ENABLE_SSE2NEON)
109+ SET (ENABLE_SSE2NEON "True" )
110+ endif ()
107111
108- # check simd installed
112+ # check simd supported by the compiler
109113if (ENABLE_SSE)
110114 SET (_code " #include <immintrin.h>
111115 int main() {__m128d a = _mm_setzero_pd(); return 1;}" )
@@ -142,7 +146,18 @@ if (ENABLE_AVX2)
142146 set (ENABLE_AVX2 "False" )
143147 endif ()
144148endif ()
145-
149+ if (ENABLE_SSE2NEON)
150+ SET (_code " #include <sse2neon.h>
151+ int main() {__m128d a = _mm_setzero_pd(); return 1;}" )
152+ SET (_file ${CMAKE_CURRENT_BINARY_DIR} /testsse2neon.c)
153+ FILE (WRITE "${_file} " "${_code} " )
154+ TRY_COMPILE (SSE2NEON_COMPILED ${CMAKE_CURRENT_BINARY_DIR} ${_file}
155+ COMPILE_DEFINITIONS "${NEON_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR} " )
156+ if (NOT SSE2NEON_COMPILED)
157+ message (STATUS "Disable sse2neon simd, because not supported" )
158+ set (ENABLE_SSE2NEON "False" )
159+ endif ()
160+ endif ()
146161
147162# set simd flags
148163if (ENABLE_SSE)
@@ -151,7 +166,15 @@ if (ENABLE_SSE)
151166 message (STATUS "SSE enabled. To disable it, run cmake with -DENABLE_SSE=false" )
152167 set (LIBPLL_SOURCES ${LIBPLL_SOURCES} ${LIBPLL_SSE_SOURCES} )
153168 SET_SOURCE_FILES_PROPERTIES ( ${LIBPLL_SSE_SOURCES} PROPERTIES COMPILE_FLAGS ${SSE_FLAGS} )
169+ elseif (ENABLE_SSE2NEON)
170+ # atm either SSE or SSE2NEON kernels can be built, since the share the same function and object names
171+ add_definitions (-DHAVE_SSE3 -DHAVE_SSE2NEON)
172+ set (SIMD_FLAGS "${SIMD_FLAGS} ${NEON_FLAGS} " )
173+ message (STATUS "SSE2NEON enabled. To disable it, run cmake with -DENABLE_SSE2NEON=false" )
174+ set (LIBPLL_SOURCES ${LIBPLL_SOURCES} ${LIBPLL_SSE_SOURCES} )
175+ SET_SOURCE_FILES_PROPERTIES ( ${LIBPLL_SSE_SOURCES} PROPERTIES COMPILE_FLAGS ${NEON_FLAGS} )
154176endif ()
177+
155178if (ENABLE_AVX)
156179 add_definitions (-DHAVE_AVX)
157180 set (SIMD_FLAGS "${SIMD_FLAGS} ${AVX_FLAGS} " )
@@ -167,7 +190,9 @@ if (ENABLE_AVX2)
167190 SET_SOURCE_FILES_PROPERTIES ( ${LIBPLL_AVX2_SOURCES} PROPERTIES COMPILE_FLAGS ${AVX2_FLAGS} )
168191endif ()
169192
170- add_definitions (-DHAVE_X86INTRIN_H)
193+ if (ENABLE_SSE OR ENABLE_AVX OR ENABLE_AVX2)
194+ add_definitions (-DHAVE_X86INTRIN_H)
195+ endif ()
171196
172197set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBPLL_BASE_FLAGS} " )
173198
0 commit comments