diff --git a/.azure-pipelines/azure-pipelines-linux-gcc.yml b/.azure-pipelines/azure-pipelines-linux-gcc.yml index 2baf8bec6..d795a1007 100644 --- a/.azure-pipelines/azure-pipelines-linux-gcc.yml +++ b/.azure-pipelines/azure-pipelines-linux-gcc.yml @@ -29,6 +29,9 @@ jobs: enable_xtl_complex: 1 gcc_9: gcc_version: '9' + gcc_9_m32: + gcc_version: '9' + i686: 1 pool: vmImage: ubuntu-16.04 variables: @@ -49,6 +52,12 @@ jobs: sudo apt-get --no-install-suggests --no-install-recommends install qemu qemu-system-aarch64 fi fi + if [[ $(i686) ]]; then + sudo dpkg --add-architecture i386 + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get --no-install-suggests --no-install-recommends install gcc-$(gcc_version)-multilib g++-$(gcc_version)-multilib linux-libc-dev:i386 + fi displayName: Install build toolchain - bash: echo "##vso[task.prependpath]$CONDA/bin" diff --git a/.azure-pipelines/unix-build.yml b/.azure-pipelines/unix-build.yml index 6f520acec..df6f80622 100644 --- a/.azure-pipelines/unix-build.yml +++ b/.azure-pipelines/unix-build.yml @@ -39,6 +39,9 @@ steps: if [[ $(force_no_instr_set) == 1 ]]; then CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DXSIMD_FORCE_X86_INSTR_SET=0 -DXSIMD_FORCE_X86_AMD_INSTR_SET=0"; fi + if [[ $(i686) == 1 ]] ; then + CMAKE_EXTRA_ARGS="$CMAKE_EXTRA_ARGS -DCMAKE_CXX_FLAGS='-m32'" + fi cmake -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX $CMAKE_EXTRA_ARGS -DDOWNLOAD_GTEST=ON -DXSIMD_ENABLE_WERROR=1 $(Build.SourcesDirectory) displayName: Configure xsimd diff --git a/include/xsimd/arch/xsimd_avx2.hpp b/include/xsimd/arch/xsimd_avx2.hpp index 909e1eb90..e5c73c745 100644 --- a/include/xsimd/arch/xsimd_avx2.hpp +++ b/include/xsimd/arch/xsimd_avx2.hpp @@ -173,7 +173,15 @@ namespace xsimd { __m256i tmp2 = _mm256_add_epi64(self, tmp1); __m128i tmp3 = _mm256_extracti128_si256(tmp2, 1); __m128i res = _mm_add_epi64(_mm256_castsi256_si128(tmp2), tmp3); +#if defined(__x86_64__) return _mm_cvtsi128_si64(res); +#else + __m128i m; + _mm_storel_epi64(&m, res); + int64_t i; + std::memcpy(&i, &m, sizeof(i)); + return i; +#endif } default: return hadd(self, avx{}); }