Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions packages/libsleef/meta.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package:
name: libsleef
version: 3.9.0
tag:
- library
- static_library
source:
sha256: af60856abac08a3b5e72a8d156dd71fec1f7ac23de8ee67793f45f9edcdf0908
url: https://github.com/shibatch/sleef/archive/refs/tags/3.9.0.tar.gz
patches:
- patches/0001-no-x86intrin.patch
- patches/0002-no-mfpmatch.patch
- patches/0003-fix-purecfma-scalar-x86.patch
- patches/0004-no-cpuid.patch
build:
type: static_library
script: |
mkdir build-native
cd build-native

mkdir my-install

export NATIVE_BUILD_DIR=`pwd`

BACKUP_TOOLCHAIN=${CMAKE_TOOLCHAIN_FILE}
unset CMAKE_TOOLCHAIN_FILE

cmake \
-DCMAKE_INSTALL_PREFIX=$(pwd)/my-install \
-DCMAKE_BUILD_TYPE=Release \
-DSLEEF_BUILD_QUAD=ON \
-DSLEEF_BUILD_SHARED_LIBS=OFF \
-DSLEEF_BUILD_TESTS=OFF \
-DSLEEF_BUILD_INLINE_HEADERS=OFF \
-DSLEEF_BUILD_GNUABI_LIBS=OFF \
-DSLEEF_ENABLE_TLFLOAT=OFF \
-DSLEEF_ENABLE_TESTER4=OFF \
-DSLEEF_DISABLE_FFTW=ON \
-DSLEEF_DISABLE_MPFR=ON \
-DSLEEF_DISABLE_SSL=ON \
-DSLEEF_DISABLE_OPENMP=ON \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
../

make -j ${PYODIDE_JOBS:-3}

export CMAKE_TOOLCHAIN_FILE=${BACKUP_TOOLCHAIN}

cd ..
mkdir build
cd build

emcmake cmake \
-DCMAKE_INSTALL_PREFIX=${WASM_LIBRARY_DIR} \
-DCMAKE_BUILD_TYPE=Release \
-DSLEEF_BUILD_QUAD=ON \
-DSLEEF_BUILD_SHARED_LIBS=OFF \
-DSLEEF_BUILD_TESTS=OFF \
-DSLEEF_BUILD_INLINE_HEADERS=OFF \
-DSLEEF_BUILD_GNUABI_LIBS=OFF \
-DSLEEF_ENABLE_TLFLOAT=OFF \
-DSLEEF_ENABLE_TESTER4=OFF \
-DSLEEF_DISABLE_FFTW=ON \
-DSLEEF_DISABLE_MPFR=ON \
-DSLEEF_DISABLE_SSL=ON \
-DSLEEF_DISABLE_OPENMP=ON \
-DSLEEF_DISABLE_SSE2=OFF \
-DSLEEF_DISABLE_AVX2=ON \
-DSLEEF_DISABLE_AVX512F=ON \
-DSLEEF_DISABLE_PURECFMA_SCALAR=ON \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DNATIVE_BUILD_DIR=${NATIVE_BUILD_DIR} \
-DCMAKE_C_FLAGS="-msimd128 -msse2" \
-DCMAKE_CXX_FLAGS="-msimd128 -msse2" \
../

emmake make -j ${PYODIDE_JOBS:-3}
emmake make install

mkdir -p dist
cp ${WASM_LIBRARY_DIR}/lib/libsleef* dist/
about:
home: https://github.com/shibatch/sleef
license: Boost Software License - Version 1.0
153 changes: 153 additions & 0 deletions packages/libsleef/patches/0001-no-x86intrin.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
diff --git a/Configure.cmake b/Configure.cmake
index e23f577..6741a6e 100644
--- a/Configure.cmake
+++ b/Configure.cmake
@@ -495,7 +495,7 @@ if(SLEEF_ARCH_X86 AND NOT SLEEF_DISABLE_SSE2)
#if defined(_MSC_VER)
#include <intrin.h>
#else
- #include <x86intrin.h>
+ #include <immintrin.h>
#endif
int main() {
__m128d r = _mm_mul_pd(_mm_set1_pd(1), _mm_set1_pd(2)); }"
@@ -514,7 +514,7 @@ if(SLEEF_ARCH_X86 AND NOT SLEEF_DISABLE_SSE4)
#if defined(_MSC_VER)
#include <intrin.h>
#else
- #include <x86intrin.h>
+ #include <immintrin.h>
#endif
int main() {
__m128d r = _mm_floor_sd(_mm_set1_pd(1), _mm_set1_pd(2)); }"
@@ -533,7 +533,7 @@ if(SLEEF_ARCH_X86 AND NOT SLEEF_DISABLE_AVX)
#if defined(_MSC_VER)
#include <intrin.h>
#else
- #include <x86intrin.h>
+ #include <immintrin.h>
#endif
int main() {
__m256d r = _mm256_add_pd(_mm256_set1_pd(1), _mm256_set1_pd(2));
@@ -552,7 +552,7 @@ if(SLEEF_ARCH_X86 AND NOT SLEEF_DISABLE_FMA4)
#if defined(_MSC_VER)
#include <intrin.h>
#else
- #include <x86intrin.h>
+ #include <immintrin.h>
#endif
int main() {
__m256d r = _mm256_macc_pd(_mm256_set1_pd(1), _mm256_set1_pd(2), _mm256_set1_pd(3)); }"
@@ -571,7 +571,7 @@ if(SLEEF_ARCH_X86 AND NOT SLEEF_DISABLE_AVX2)
#if defined(_MSC_VER)
#include <intrin.h>
#else
- #include <x86intrin.h>
+ #include <immintrin.h>
#endif
int main() {
__m256i r = _mm256_abs_epi32(_mm256_set1_epi32(1)); }"
@@ -595,7 +595,7 @@ if(SLEEF_ARCH_X86 AND NOT SLEEF_DISABLE_AVX512F)
#if defined(_MSC_VER)
#include <intrin.h>
#else
- #include <x86intrin.h>
+ #include <immintrin.h>
#endif
__m512 addConstant(__m512 arg) {
return _mm512_add_ps(arg, _mm512_set1_ps(1.f));
diff --git a/src/arch/helperavx.h b/src/arch/helperavx.h
index 08b81b0..5596498 100644
--- a/src/arch/helperavx.h
+++ b/src/arch/helperavx.h
@@ -42,7 +42,7 @@
#if defined(_MSC_VER)
#include <intrin.h>
#else
-#include <x86intrin.h>
+#include <immintrin.h>
#endif

#include <stdint.h>
diff --git a/src/arch/helperavx2.h b/src/arch/helperavx2.h
index 8e71de3..2872cd9 100644
--- a/src/arch/helperavx2.h
+++ b/src/arch/helperavx2.h
@@ -40,7 +40,7 @@
#if defined(_MSC_VER)
#include <intrin.h>
#else
-#include <x86intrin.h>
+#include <immintrin.h>
#endif

#include <stdint.h>
diff --git a/src/arch/helperavx2_128.h b/src/arch/helperavx2_128.h
index 2d1142b..4fa0f8f 100644
--- a/src/arch/helperavx2_128.h
+++ b/src/arch/helperavx2_128.h
@@ -40,7 +40,7 @@
#if defined(_MSC_VER)
#include <intrin.h>
#else
-#include <x86intrin.h>
+#include <immintrin.h>
#endif

#include <stdint.h>
diff --git a/src/arch/helperavx512f.h b/src/arch/helperavx512f.h
index 20c5118..2b3da9a 100644
--- a/src/arch/helperavx512f.h
+++ b/src/arch/helperavx512f.h
@@ -43,7 +43,7 @@
#if defined(_MSC_VER)
#include <intrin.h>
#else
-#include <x86intrin.h>
+#include <immintrin.h>
#endif

#include <stdint.h>
diff --git a/src/arch/helpersse2.h b/src/arch/helpersse2.h
index 349f06e..d6bee48 100644
--- a/src/arch/helpersse2.h
+++ b/src/arch/helpersse2.h
@@ -46,7 +46,7 @@
#if defined(_MSC_VER)
#include <intrin.h>
#else
-#include <x86intrin.h>
+#include <immintrin.h>
#endif

#include <stdint.h>
diff --git a/src/common/misc.h b/src/common/misc.h
index fadcd1a..c0a2bcf 100644
--- a/src/common/misc.h
+++ b/src/common/misc.h
@@ -281,9 +281,7 @@ typedef struct {
#define LIKELY(condition) (condition)
#define UNLIKELY(condition) (condition)

-#if (defined(__GNUC__) || defined(__CLANG__)) && (defined(__i386__) || defined(__x86_64__)) && !defined(SLEEF_GENHEADER)
-#include <x86intrin.h>
-#endif
+#include <immintrin.h>

#define SLEEF_INFINITY (1e+300 * 1e+300)
#define SLEEF_NAN (SLEEF_INFINITY - SLEEF_INFINITY)
diff --git a/src/libm/sleeflibm_header.h.org.in b/src/libm/sleeflibm_header.h.org.in
index abf1d0a..b9ebf33 100644
--- a/src/libm/sleeflibm_header.h.org.in
+++ b/src/libm/sleeflibm_header.h.org.in
@@ -55,9 +55,7 @@ extern "C"
#define SLEEF_IMPORT
#endif // #if (defined(__MINGW32__) || defined(__MINGW64__) || defined(__CYGWIN__) || defined(_MSC_VER)) && !defined(SLEEF_STATIC_LIBS)

-#if (defined(__GNUC__) || defined(__CLANG__)) && (defined(__i386__) || defined(__x86_64__))
-#include <x86intrin.h>
-#endif
+#include <immintrin.h>

#if (defined(_MSC_VER))
#include <intrin.h>
19 changes: 19 additions & 0 deletions packages/libsleef/patches/0002-no-mfpmatch.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
diff --git a/Configure.cmake b/Configure.cmake
index 6741a6e..e029751 100644
--- a/Configure.cmake
+++ b/Configure.cmake
@@ -276,10 +276,10 @@ if(CMAKE_C_COMPILER_ID MATCHES "(GNU|Clang|QCC)")
set(FLAGS_FASTMATH "-ffast-math")
set(FLAGS_NOSTRICTALIASING "-fno-strict-aliasing")

- if (SLEEF_ARCH_X86 AND SLEEF_ARCH_32BIT)
- string(CONCAT FLAGS_STRICTMATH ${FLAGS_STRICTMATH} " -msse2 -mfpmath=sse")
- string(CONCAT FLAGS_FASTMATH ${FLAGS_FASTMATH} " -msse2 -mfpmath=sse")
- endif()
+ # if (SLEEF_ARCH_X86 AND SLEEF_ARCH_32BIT)
+ # string(CONCAT FLAGS_STRICTMATH ${FLAGS_STRICTMATH} " -msse2 -mfpmath=sse")
+ # string(CONCAT FLAGS_FASTMATH ${FLAGS_FASTMATH} " -msse2 -mfpmath=sse")
+ # endif()

# Without the options below, gcc generates calls to libm
string(CONCAT FLAGS_OTHERS "-fno-math-errno -fno-trapping-math")
101 changes: 101 additions & 0 deletions packages/libsleef/patches/0003-fix-purecfma-scalar-x86.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8510913..817af3a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -91,6 +91,10 @@ option(SLEEF_ENFORCE_CUDA "Build fails if CUDA is not supported" OFF)
option(SLEEF_DISABLE_OPENMP "Disable OPENMP" OFF)
option(SLEEF_ENFORCE_OPENMP "Build fails if OPENMP is not supported by the compiler" OFF)

+# Option to disable PURECFMA scalar code path on x86 for x86-64-v2 compatibility
+# When ON, PURECFMA scalar dispatch is disabled (useful for Sandy Bridge support)
+# This can be set dynamically by the build system based on target CPU detection
+option(SLEEF_DISABLE_PURECFMA_SCALAR "Disable PURECFMA scalar code path (for x86-64-v2 compatibility)" OFF)
#

if ((NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "${CMAKE_CXX_COMPILER_ID}") OR
diff --git a/Configure.cmake b/Configure.cmake
index e029751..8764b60 100644
--- a/Configure.cmake
+++ b/Configure.cmake
@@ -193,7 +193,12 @@ endif()
if(SLEEF_TARGET_PROCESSOR MATCHES "(x86|AMD64|amd64|^i.86$)")
set(SLEEF_ARCH_X86 ON CACHE INTERNAL "True for x86 architecture.")

- set(CLANG_FLAGS_ENABLE_PURECFMA_SCALAR "-mavx2;-mfma")
+ # Only set PURECFMA_SCALAR flags if not explicitly disabled
+ if(NOT SLEEF_DISABLE_PURECFMA_SCALAR)
+ set(CLANG_FLAGS_ENABLE_PURECFMA_SCALAR "-mavx2;-mfma")
+ else()
+ message(STATUS "PURECFMA_SCALAR disabled for x86-64-v2 compatibility")
+ endif()
elseif(SLEEF_TARGET_PROCESSOR MATCHES "aarch64|arm64")
set(SLEEF_ARCH_AARCH64 ON CACHE INTERNAL "True for Aarch64 architecture.")
# Aarch64 requires support for advsimdfma4
@@ -220,7 +225,12 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64")
endif()

set(COMPILER_SUPPORTS_PUREC_SCALAR 1)
-set(COMPILER_SUPPORTS_PURECFMA_SCALAR 1)
+# Conditionally enable PURECFMA_SCALAR based on option
+if(SLEEF_DISABLE_PURECFMA_SCALAR)
+ set(COMPILER_SUPPORTS_PURECFMA_SCALAR 0)
+else()
+ set(COMPILER_SUPPORTS_PURECFMA_SCALAR 1)
+endif()

# Compiler feature detection

diff --git a/src/quad/CMakeLists.txt b/src/quad/CMakeLists.txt
index 8e4e261..fd41d28 100644
--- a/src/quad/CMakeLists.txt
+++ b/src/quad/CMakeLists.txt
@@ -398,9 +398,17 @@ set_target_properties(qmkdisp PROPERTIES ${COMMON_TARGET_PROPERTIES})

# Target qdispscalar.c

+# Set scalar dispatch backends based on PURECFMA support
+# When SLEEF_DISABLE_PURECFMA_SCALAR is ON, use purec for both slots
+if(COMPILER_SUPPORTS_PURECFMA_SCALAR)
+ set(SCALAR_DISPATCH_BACKENDS "purec" "purecfma")
+else()
+ set(SCALAR_DISPATCH_BACKENDS "purec" "purec")
+endif()
+
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/qdispscalar.c.body
- COMMAND $<TARGET_FILE:qmkdisp> 1 Sleef_quad double int32_t int64_t uint64_t purec purecfma > ${CMAKE_CURRENT_BINARY_DIR}/qdispscalar.c.body
+ COMMAND $<TARGET_FILE:qmkdisp> 1 Sleef_quad double int32_t int64_t uint64_t ${SCALAR_DISPATCH_BACKENDS} > ${CMAKE_CURRENT_BINARY_DIR}/qdispscalar.c.body
DEPENDS qmkdisp
)
sleef_concat_files(
@@ -426,6 +434,11 @@ target_compile_definitions(qdispscalar_obj PRIVATE ${COMMON_TARGET_DEFINITIONS})
target_include_directories(qdispscalar_obj PRIVATE ${sleef_BINARY_DIR}/include)
add_dependencies(qdispscalar_obj qdispscalar.c_generated qrenamedspscalar.h_generated
sleefquad_headers ${TARGET_LIBSLEEF} ${TARGET_HEADERS})
+# Define ENABLE_PURECFMA when PURECFMA is supported, so qdispscalar.c.org
+# can conditionally include the tryFMA() function and SUBST_IF_EXT1 macro
+if(COMPILER_SUPPORTS_PURECFMA_SCALAR)
+ target_compile_definitions(qdispscalar_obj PRIVATE ENABLE_PURECFMA=1)
+endif()
target_sources(sleefquad PRIVATE $<TARGET_OBJECTS:qdispscalar_obj>)

if(DEFINED QMKDISP_PARAMS_X2)
diff --git a/src/quad/qdispscalar.c.org b/src/quad/qdispscalar.c.org
index c4c1292..48f309c 100644
--- a/src/quad/qdispscalar.c.org
+++ b/src/quad/qdispscalar.c.org
@@ -15,10 +15,14 @@

#include "qdispatcher.h"

+#ifdef ENABLE_PURECFMA
NOEXPORT Sleef_quad sleef_cpuid_QUADFMA_0;
static void tryFMA() { sleef_cpuid_QUADFMA_0 = Sleef_sinq1_u10purecfma(sleef_cpuid_QUADFMA_0); }

#define SUBST_IF_EXT1(funcExt1) if (cpuSupportsExt(tryFMA)) p = funcExt1;
+#else
+#define SUBST_IF_EXT1(funcExt1)
+#endif

//

Loading
Loading