xref: /aosp_15_r20/external/pytorch/cmake/Modules/FindZVECTOR.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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