1IF(CMAKE_SYSTEM_NAME MATCHES "Linux") 2 message("-- <FindZVECTOR>") 3 4 SET(VECTORIZATION_CODE " 5 #include <vecintrin.h> 6 using vuint32 = __attribute__ ((vector_size (16))) unsigned int; 7 using vfloat32 = __attribute__ ((vector_size (16))) float; 8 vfloat32 vsel_ext(vuint32 o, vfloat32 x, vfloat32 y) 9 { 10 return vec_sel(y, x, o); 11 } 12 int main(){ 13 vfloat32 h1 ={3.f, 4.f, 5.f, 6.f}; 14 vfloat32 h2 = {9.f, 8.f, 11.f, 12.f}; 15 vuint32 selector= {0xFFFFFFFF, 0, 0xFFFFFFFF, 0xFFFFFFFF}; 16 vfloat32 hf = vsel_ext(selector, h1,h2); 17 int ret = (int)(hf[0]*1000+hf[1]*100+hf[2]*10+hf[3]); 18 return (ret == 3856) ? 0 : -1; 19 } 20 ") 21 22 SET(ARCH_SIMD_TEST_FLAGS " -mvx -mzvector") 23 SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) 24 SET(CMAKE_REQUIRED_FLAGS "${ARCH_SIMD_TEST_FLAGS}") 25 # Do compilation check instead of runtime check 26 # in case it is compiled on older hardware 27 # or crosscompiled 28 CHECK_CXX_SOURCE_COMPILES("${VECTORIZATION_CODE}" COMPILE_OUT_ZVECTOR) 29 SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) 30 if(COMPILE_OUT_ZVECTOR) 31 message("-- ZVECTOR flags were set.") 32 set(CXX_ZVECTOR_FOUND TRUE) 33 SET(CXX_ZVECTOR_FLAGS "${ARCH_SIMD_TEST_FLAGS}" ) 34 else() 35 message("-- ZVECTOR flags were NOT set.") 36 endif() 37 message("-- </FindZVECTOR>") 38 39endif() 40