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