From 3696985fc2a4d399802d79d8dcda500700f51893 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Thu, 14 Mar 2019 16:44:42 +1000 Subject: [PATCH 1/2] Add a CMake generator for target 'alias', removing a binary --- CMakeLists.txt | 1 - src/libm/CMakeLists.txt | 58 ++++++------- src/libm/generate.cmake | 176 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 33 deletions(-) create mode 100644 src/libm/generate.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index aa8a53c97..a372dc56e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,6 @@ set(TARGET_MKRENAME_GNUABI "mkrename_gnuabi") set(TARGET_MKMASKED_GNUABI "mkmasked_gnuabi") # Generates the helper executable file mkdisp needed to write the sleef header set(TARGET_MKDISP "mkdisp") -set(TARGET_MKALIAS "mkalias") # Generates static library common # Defined in src/common/CMakeLists.txt via command add_library set(TARGET_LIBCOMMON_OBJ "common") diff --git a/src/libm/CMakeLists.txt b/src/libm/CMakeLists.txt index 4b26e36da..5e1c72d61 100644 --- a/src/libm/CMakeLists.txt +++ b/src/libm/CMakeLists.txt @@ -137,10 +137,7 @@ add_custom_target(${TARGET_HEADERS} ALL # -------------------------------------------------------------------- # TARGET_MKALIAS # -------------------------------------------------------------------- -add_host_executable(${TARGET_MKALIAS} mkalias.c) -if(FORCE_AAVPCS) - host_target_AAVPCS_definitions(${TARGET_MKALIAS}) -endif() +include("generate.cmake") # -------------------------------------------------------------------- # TARGET_MKDISP @@ -151,7 +148,7 @@ add_host_executable(${TARGET_MKDISP} mkdisp.c) # Set C standard requirement (-std=gnu99 for gcc) set_target_properties( ${TARGET_MKRENAME} ${TARGET_MKRENAME_GNUABI} ${TARGET_MKDISP} - ${TARGET_MKALIAS} ${TARGET_MKMASKED_GNUABI} + ${TARGET_MKMASKED_GNUABI} PROPERTIES C_STANDARD 99 ) @@ -226,45 +223,42 @@ foreach(SIMD ${SLEEF_SUPPORTED_EXTENSIONS}) if (INDEX_ALIAS EQUAL -1) target_compile_definitions(${OBJECT_${SIMD}} PRIVATE - ENABLE_${SIMD}=1 - DORENAME=1 - ${COMMON_TARGET_DEFINITIONS} - ) + ENABLE_${SIMD}=1 + DORENAME=1 + ${COMMON_TARGET_DEFINITIONS} + ) target_compile_definitions(${OBJECTDET_${SIMD}} PRIVATE - ENABLE_${SIMD}=1 - DORENAME=1 - ${COMMON_TARGET_DEFINITIONS} - ) - else() - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h - COMMENT "Generating alias_${SIMDLC}.h" - COMMAND $ ${ALIAS_PARAMS_${SIMD}_SP} > ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h - COMMAND $ ${ALIAS_PARAMS_${SIMD}_DP} >> ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h - DEPENDS ${TARGET_MKALIAS} - ) + ENABLE_${SIMD}=1 + DORENAME=1 + ${COMMON_TARGET_DEFINITIONS} + ) + else() + file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h) + SLEEF_MKALIAS(${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h ${ALIAS_PARAMS_${SIMD}_SP}) + SLEEF_MKALIAS(${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h ${ALIAS_PARAMS_${SIMD}_DP}) + # TODO: Dependency for generated? add_custom_target(alias_${SIMDLC}.h_generated SOURCES ${CMAKE_CURRENT_BINARY_DIR}/include/alias_${SIMDLC}.h) add_dependencies(${OBJECT_${SIMD}} alias_${SIMDLC}.h_generated) add_dependencies(${OBJECTDET_${SIMD}} alias_${SIMDLC}.h_generated) target_compile_definitions(${OBJECT_${SIMD}} PRIVATE - ENABLE_${SIMD}=1 - DORENAME=1 - ${COMMON_TARGET_DEFINITIONS} - ALIAS_NO_EXT_SUFFIX=\"alias_${SIMDLC}.h\" - ) + ENABLE_${SIMD}=1 + DORENAME=1 + ${COMMON_TARGET_DEFINITIONS} + ALIAS_NO_EXT_SUFFIX=\"alias_${SIMDLC}.h\" + ) target_compile_definitions(${OBJECTDET_${SIMD}} PRIVATE - ENABLE_${SIMD}=1 - DORENAME=1 - ${COMMON_TARGET_DEFINITIONS} - ALIAS_NO_EXT_SUFFIX=\"alias_${SIMDLC}.h\" - ) + ENABLE_${SIMD}=1 + DORENAME=1 + ${COMMON_TARGET_DEFINITIONS} + ALIAS_NO_EXT_SUFFIX=\"alias_${SIMDLC}.h\" + ) endif() # Enable Vector PCS for Advanced SIMD (if supported) if(FORCE_AAVPCS AND ${SIMD} STREQUAL "ADVSIMD") target_compile_definitions(${OBJECT_${SIMD}} PRIVATE ENABLE_AAVPCS=1 - ) + ) endif() add_dependencies(${OBJECT_${SIMD}} rename${SIMD}.h_generated) diff --git a/src/libm/generate.cmake b/src/libm/generate.cmake new file mode 100644 index 000000000..186224229 --- /dev/null +++ b/src/libm/generate.cmake @@ -0,0 +1,176 @@ + # This file is designed to replace the custom binaries used to generate header files + + # This func list is used for all generation + set(FUNCLIST + "sin\;35\;0\;0\;0" + "cos\;35\;0\;0\;0" + "sincos\;35\;0\;2\;0" + "tan\;35\;0\;0\;0" + "asin\;35\;0\;0\;0" + "acos\;35\;0\;0\;0" + "atan\;35\;0\;0\;0" + "atan2\;35\;0\;1\;0" + "log\;35\;0\;0\;0" + "cbrt\;35\;0\;0\;0" + "sin\;10\;1\;0\;0" + "cos\;10\;1\;0\;0" + "sincos\;10\;1\;2\;0" + "tan\;10\;1\;0\;0" + "asin\;10\;1\;0\;0" + "acos\;10\;1\;0\;0" + "atan\;10\;1\;0\;0" + "atan2\;10\;1\;1\;0" + "log\;10\;1\;0\;0" + "cbrt\;10\;1\;0\;0" + "exp\;10\;0\;0\;0" + "pow\;10\;0\;1\;0" + "sinh\;10\;0\;0\;0" + "cosh\;10\;0\;0\;0" + "tanh\;10\;0\;0\;0" + "sinh\;35\;3\;0\;0" + "cosh\;35\;3\;0\;0" + "tanh\;35\;3\;0\;0" + + "asinh\;10\;0\;0\;0" + "acosh\;10\;0\;0\;0" + "atanh\;10\;0\;0\;0" + "exp2\;10\;0\;0\;0" + "exp10\;10\;0\;0\;0" + "expm1\;10\;0\;0\;0" + "log10\;10\;0\;0\;0" + "log2\;10\;0\;0\;0" + "log1p\;10\;0\;0\;0" + "sincospi\;5\;2\;2\;0" + "sincospi\;35\;3\;2\;0" + "sinpi\;5\;2\;0\;0" + "cospi\;5\;2\;0\;0" + "ldexp\;-1\;0\;3\;0" + "ilogb\;-1\;0\;4\;0" + + "fma\;-1\;0\;5\;0" + "sqrt\;-1\;0\;0\;0" + "sqrt\;5\;2\;0\;1" + "sqrt\;35\;3\;0\;0" + "hypot\;5\;2\;1\;0" + "hypot\;35\;3\;1\;0" + "fabs\;-1\;0\;0\;0" + "copysign\;-1\;0\;1\;0" + "fmax\;-1\;0\;1\;0" + "fmin\;-1\;0\;1\;0" + "fdim\;-1\;0\;1\;0" + "trunc\;-1\;0\;0\;0" + "floor\;-1\;0\;0\;0" + "ceil\;-1\;0\;0\;0" + "round\;-1\;0\;0\;0" + "rint\;-1\;0\;0\;0" + "nextafter\;-1\;0\;1\;0" + "frfrexp\;-1\;0\;0\;0" + "expfrexp\;-1\;0\;4\;0" + "fmod\;-1\;0\;1\;0" + "modf\;-1\;0\;6\;0" + + "lgamma\;10\;1\;0\;0" + "tgamma\;10\;1\;0\;0" + "erf\;10\;1\;0\;0" + "erfc\;15\;4\;0\;0" + + "getInt\;-1\;0\;7\;1" + "getPtr\;-1\;0\;8\;1" +) + +MACRO(SLEEF_MKALIAS FILENAME VEC_WIDTH_QUOTES VEC_FP_TYPE_QUOTES VEC_INT_TYPE_QUOTES MANGLED_ISA) + # Names come in with extra quotes from list + string(REPLACE "\"" "" VEC_WIDTH ${VEC_WIDTH_QUOTES}) + string(REPLACE "\"" "" VEC_FP_TYPE ${VEC_FP_TYPE_QUOTES}) + string(REPLACE "\"" "" VEC_INT_TYPE ${VEC_INT_TYPE_QUOTES}) + + # Determine type and write header + if (${VEC_WIDTH} LESS 0) + set(FPTYPE 1) + set(TYPESPEC "f") + # Drop the leading character, which is a negative sign + string(SUBSTRING "${VEC_WIDTH}" 1 -1 width) + set(STR "#ifdef __SLEEFSIMDSP_C__\n") + else() + set(FPTYPE 0) + set(TYPESPEC "d") + set(width "${VEC_WIDTH}") + set(STR "#ifdef __SLEEFSIMDDP_C__\n") + endif() + + if(FPTYPE) + set(RETURNTYPES ${VEC_FP_TYPE} ${VEC_FP_TYPE} "vfloat2" ${VEC_FP_TYPE} ${VEC_INT_TYPE} ${VEC_FP_TYPE} "vfloat2" "int" "void *") + else() + set(RETURNTYPES ${VEC_FP_TYPE} ${VEC_FP_TYPE} "vdouble2" ${VEC_FP_TYPE} ${VEC_INT_TYPE} ${VEC_FP_TYPE} "vdouble2" "int" "void *") + endif() + + set(ARGTYPEZERO ${VEC_FP_TYPE} "${VEC_FP_TYPE}, ${VEC_FP_TYPE}" ${VEC_FP_TYPE} "${VEC_FP_TYPE}, ${VEC_INT_TYPE}" ${VEC_FP_TYPE} "${VEC_FP_TYPE}, ${VEC_FP_TYPE}, ${VEC_FP_TYPE}" ${VEC_FP_TYPE} "int" "int") + set(ARGTYPEONE "${VEC_FP_TYPE} a0" "${VEC_FP_TYPE} a0, ${VEC_FP_TYPE} a1" "${VEC_FP_TYPE} a0" "${VEC_FP_TYPE} a0, ${VEC_INT_TYPE} a1" "${VEC_FP_TYPE} a0" "${VEC_FP_TYPE} a0, ${VEC_FP_TYPE} a1, ${VEC_FP_TYPE} a2" "${VEC_FP_TYPE} a0" "int a0" "int a0") + set(ARGTYPETWO "a0" "a0, a1" "a0" "a0, a1" "a0" "a0, a1, a2" "a0" "a0" "a0") + + + string(APPEND STR "#ifdef ENABLE_ALIAS\n") + + # Get length of ARGN which always seems to exist + string(LENGTH "${ARGN}" ARGCOUNT) + if (ARGCOUNT) + string(REPLACE "\"" "" EXTENTION ${ARGN}) + endif() + if (EXTENTION) + foreach(funcresult ${FUNCLIST}) + list(GET funcresult 0 name) + list(GET funcresult 1 ulp) + list(GET funcresult 3 funcType) + list(GET RETURNTYPES ${funcType} returnstring) + list(GET ARGTYPEZERO ${funcType} firstarg) + # This section is quite complex + set(ULPVAL "") + set(ULPVALUNDER "") + if (${ulp} GREATER 0) # CMake 3.7 required for GREATER_EQUAL + string(LENGTH ${ulp} ULPLEN) + if (${ULPLEN} LESS 2) + set(ulp "0${ulp}") + endif() + set(ULPVAL "u${ulp}") + set(ULPVALUNDER "_${ULPVAL}") + endif() + string(APPEND STR "EXPORT CONST ${returnstring} Sleef_${name}${TYPESPEC}${width}${ULPVALUNDER}(${firstarg}) __attribute__((alias(\"Sleef_${name}${TYPESPEC}${width}_${ULPVAL}${EXTENTION}\")))\;\n") + endforeach() + string(APPEND STR "\n") + endif() + string(APPEND STR "#else // #ifdef ENABLE_ALIAS\n") + + if (EXTENTION) + foreach(funcresult ${FUNCLIST}) + list(GET funcresult 0 name) + list(GET funcresult 1 ulp) + list(GET funcresult 3 funcType) + list(GET RETURNTYPES ${funcType} returnstring) + list(GET ARGTYPEONE ${funcType} secondarg) + list(GET ARGTYPETWO ${funcType} thirdarg) + # This section is quite complex + set(ULPVAL "") + set(ULPVALUNDER "") + if (${ulp} GREATER 0) # CMake 3.7 required for GREATER_EQUAL + string(LENGTH ${ulp} ULPLEN) + if (${ULPLEN} LESS 2) + set(ulp "0${ulp}") + endif() + set(ULPVAL "u${ulp}") + set(ULPVALUNDER "_${ULPVAL}") + endif() + string(APPEND STR "EXPORT CONST ${returnstring} Sleef_${name}${TYPESPEC}${width}${ULPVALUNDER}(${secondarg}) { return Sleef_${name}${TYPESPEC}${width}_${ULPVAL}${EXTENTION}(${thirdarg})\; }\n") + endforeach() + string(APPEND STR "\n") + endif() + + # Write footer + string(APPEND STR "#endif // #ifdef ENABLE_ALIAS\n") + if (FPTYPE) + string(APPEND STR "#endif // #ifdef __SLEEFSIMDSP_C__\n") + else() + string(APPEND STR "#endif // #ifdef __SLEEFSIMDDP_C__\n") + endif() + + file(APPEND ${FILENAME} ${STR}) +ENDMACRO(SLEEF_MKALIAS) From 548d755253a502e9e4a187304232dda216531aa5 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Thu, 14 Mar 2019 17:12:17 +1000 Subject: [PATCH 2/2] Add support for vectorcc --- src/libm/generate.cmake | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/libm/generate.cmake b/src/libm/generate.cmake index 186224229..f7e1b7038 100644 --- a/src/libm/generate.cmake +++ b/src/libm/generate.cmake @@ -78,11 +78,16 @@ "getPtr\;-1\;0\;8\;1" ) -MACRO(SLEEF_MKALIAS FILENAME VEC_WIDTH_QUOTES VEC_FP_TYPE_QUOTES VEC_INT_TYPE_QUOTES MANGLED_ISA) +MACRO(SLEEF_MKALIAS FILENAME FORCE_AAVPCS VEC_WIDTH_QUOTES VEC_FP_TYPE_QUOTES VEC_INT_TYPE_QUOTES MANGLED_ISA) # Names come in with extra quotes from list string(REPLACE "\"" "" VEC_WIDTH ${VEC_WIDTH_QUOTES}) string(REPLACE "\"" "" VEC_FP_TYPE ${VEC_FP_TYPE_QUOTES}) string(REPLACE "\"" "" VEC_INT_TYPE ${VEC_INT_TYPE_QUOTES}) + # Get length of ARGN which always seems to exist + string(LENGTH "${ARGN}" ARGCOUNT) + if (ARGCOUNT) + string(REPLACE "\"" "" EXTENTION ${ARGN}) + endif() # Determine type and write header if (${VEC_WIDTH} LESS 0) @@ -98,6 +103,13 @@ MACRO(SLEEF_MKALIAS FILENAME VEC_WIDTH_QUOTES VEC_FP_TYPE_QUOTES VEC_INT_TYPE_QU set(STR "#ifdef __SLEEFSIMDDP_C__\n") endif() + # This is the current condition on which AAVPCS is set + if (FORCE_AAVPCS AND NOT CMAKE_CROSSCOMPILING) + if ("${EXTENTION}" STREQUAL "advsimd") + set(VECTORCC " __attribute__((aarch64_vector_pcs))") + endif() + endif() + if(FPTYPE) set(RETURNTYPES ${VEC_FP_TYPE} ${VEC_FP_TYPE} "vfloat2" ${VEC_FP_TYPE} ${VEC_INT_TYPE} ${VEC_FP_TYPE} "vfloat2" "int" "void *") else() @@ -111,11 +123,7 @@ MACRO(SLEEF_MKALIAS FILENAME VEC_WIDTH_QUOTES VEC_FP_TYPE_QUOTES VEC_INT_TYPE_QU string(APPEND STR "#ifdef ENABLE_ALIAS\n") - # Get length of ARGN which always seems to exist - string(LENGTH "${ARGN}" ARGCOUNT) - if (ARGCOUNT) - string(REPLACE "\"" "" EXTENTION ${ARGN}) - endif() + if (EXTENTION) foreach(funcresult ${FUNCLIST}) list(GET funcresult 0 name) @@ -134,7 +142,7 @@ MACRO(SLEEF_MKALIAS FILENAME VEC_WIDTH_QUOTES VEC_FP_TYPE_QUOTES VEC_INT_TYPE_QU set(ULPVAL "u${ulp}") set(ULPVALUNDER "_${ULPVAL}") endif() - string(APPEND STR "EXPORT CONST ${returnstring} Sleef_${name}${TYPESPEC}${width}${ULPVALUNDER}(${firstarg}) __attribute__((alias(\"Sleef_${name}${TYPESPEC}${width}_${ULPVAL}${EXTENTION}\")))\;\n") + string(APPEND STR "EXPORT CONST ${returnstring} Sleef_${name}${TYPESPEC}${width}${ULPVALUNDER}(${firstarg}) __attribute__((alias(\"Sleef_${name}${TYPESPEC}${width}_${ULPVAL}${EXTENTION}\"))) ${VECTORCC}\;\n") endforeach() string(APPEND STR "\n") endif() @@ -159,7 +167,7 @@ MACRO(SLEEF_MKALIAS FILENAME VEC_WIDTH_QUOTES VEC_FP_TYPE_QUOTES VEC_INT_TYPE_QU set(ULPVAL "u${ulp}") set(ULPVALUNDER "_${ULPVAL}") endif() - string(APPEND STR "EXPORT CONST ${returnstring} Sleef_${name}${TYPESPEC}${width}${ULPVALUNDER}(${secondarg}) { return Sleef_${name}${TYPESPEC}${width}_${ULPVAL}${EXTENTION}(${thirdarg})\; }\n") + string(APPEND STR "EXPORT CONST ${returnstring} ${VECTORCC} Sleef_${name}${TYPESPEC}${width}${ULPVALUNDER}(${secondarg}) { return Sleef_${name}${TYPESPEC}${width}_${ULPVAL}${EXTENTION}(${thirdarg})\; }\n") endforeach() string(APPEND STR "\n") endif()