Home | History | Annotate | Line # | Download | only in crc32vx
      1 # check if we compile for IBM s390x
      2 #
      3 CHECK_C_SOURCE_COMPILES("
      4 #ifndef __s390x__
      5     #error
      6 #endif
      7 int main() {return 0;}
      8 " HAS_S390X_SUPPORT)
      9 
     10 #
     11 # Check for IBM S390X - VX extensions
     12 #
     13 if(ZLIB_WITH_CRC32VX AND HAS_S390X_SUPPORT)
     14     # preset the compiler specific flags
     15     if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
     16         set(VGFMAFLAG "-fzvector")
     17     else()
     18         set(VGFMAFLAG "-mzarch")
     19     endif(CMAKE_C_COMPILER_ID STREQUAL "Clang")
     20 
     21     set(S390X_VX_TEST
     22         "#ifndef __s390x__ \n\
     23         #error \n\
     24         #endif \n\
     25         #include <vecintrin.h> \n\
     26         int main(void) { \
     27            unsigned long long a __attribute__((vector_size(16))) = { 0 }; \
     28            unsigned long long b __attribute__((vector_size(16))) = { 0 }; \
     29            unsigned char c __attribute__((vector_size(16))) = { 0 }; \
     30            c = vec_gfmsum_accum_128(a, b, c); \
     31            return c[0]; \
     32         }")
     33 
     34     # cflags already contains a valid march
     35     set(CMAKE_REQUIRED_FLAGS "${VGFMAFLAG}")
     36     check_c_source_compiles("${S390X_VX_TEST}" HAS_S390X_VX_SUPPORT)
     37     unset(CMAKE_REQUIRED_FLAGS)
     38 
     39     # or set march for our compile units
     40     if(NOT HAS_S390X_VX_SUPPORT)
     41         set(CMAKE_REQUIRED_FLAGS "${VGFMAFLAG} -march=z13")
     42         check_c_source_compiles("${S390X_VX_TEST}" HAS_Z13_S390X_VX_SUPPORT)
     43         unset(CMAKE_REQUIRED_FLAGS )
     44         list(APPEND VGFMAFLAG "-march=z13")
     45     endif(NOT HAS_S390X_VX_SUPPORT)
     46 
     47     # prepare compiling for s390x
     48     if(HAS_S390X_VX_SUPPORT OR HAS_Z13_S390X_VX_SUPPORT)
     49         if(ZLIB_BUILD_SHARED)
     50             target_sources(zlib
     51                 PRIVATE
     52                     crc32_vx.c
     53                     crc32_vx_hooks.h)
     54             target_compile_definitions(zlib PUBLIC -DHAVE_S390X_VX=1)
     55         endif(ZLIB_BUILD_SHARED)
     56         if(ZLIB_BUILD_STATIC)
     57             target_sources(zlibstatic
     58                 PRIVATE
     59                     crc32_vx.c
     60                     crc32_vx_hooks.h)
     61             target_compile_definitions(zlibstatic PUBLIC -DHAVE_S390X_VX=1)
     62         endif(ZLIB_BUILD_STATIC)
     63         set_source_files_properties(
     64             crc32_vx.c
     65             PROPERTIES COMPILE_OPTIONS "${VGFMAFLAG}")
     66     endif(HAS_S390X_VX_SUPPORT OR HAS_Z13_S390X_VX_SUPPORT)
     67 endif(ZLIB_WITH_CRC32VX AND HAS_S390X_SUPPORT)
     68