From 1882cf1c9d68e0c325c89f0bdf368b47206f19e0 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 29 Dec 2011 22:44:16 -0200 Subject: Add detection of AVX and AVX2 support in the compiler. Intel CC 12.1 supports AVX2 but only with -march=core-avx2. The -mavx2 option produces a warning. GCC 4.6 does not recognise any option. GCC 4.7 recognises both -mavx2 and -march=core-avx2 so let's use the latter for now. We may need to change to -mavx2 when there's an AMD processor that supports AVX2 too. Change-Id: I529240e6e6c2c0e3942d357e0320212d954fe4de Reviewed-by: Oswald Buddenhagen --- config.tests/unix/avx2/avx2.cpp | 55 +++++++++++++++++++++++++++++++++++++++++ config.tests/unix/avx2/avx2.pro | 3 +++ configure | 21 +++++++++++++++- mkspecs/features/qt.prf | 1 + 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 config.tests/unix/avx2/avx2.cpp create mode 100644 config.tests/unix/avx2/avx2.pro diff --git a/config.tests/unix/avx2/avx2.cpp b/config.tests/unix/avx2/avx2.cpp new file mode 100644 index 0000000000..9e56531220 --- /dev/null +++ b/config.tests/unix/avx2/avx2.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Intel Corporation. +** Contact: http://www.qt-project.org/ +** +** This file is part of the configuration of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +int main(int, char**) +{ + /* AVX */ + _mm256_zeroall(); + volatile __m256i a = _mm256_setzero_si256(); + + /* AVX2 */ + volatile __m256i b = _mm256_and_si256(a, a); + volatile __m256i result = _mm256_add_epi8(a, b); + (void)result; + return 0; +} diff --git a/config.tests/unix/avx2/avx2.pro b/config.tests/unix/avx2/avx2.pro new file mode 100644 index 0000000000..48374f11c4 --- /dev/null +++ b/config.tests/unix/avx2/avx2.pro @@ -0,0 +1,3 @@ +SOURCES = avx2.cpp +CONFIG -= x11 qt +mac:CONFIG -= app_bundle diff --git a/configure b/configure index 9e28f8f48c..e4ee9ec32c 100755 --- a/configure +++ b/configure @@ -731,6 +731,7 @@ CFG_SSSE3=auto CFG_SSE4_1=auto CFG_SSE4_2=auto CFG_AVX=auto +CFG_AVX2=auto CFG_REDUCE_RELOCATIONS=auto CFG_NAS=no CFG_ACCESSIBILITY=auto @@ -1510,6 +1511,13 @@ while [ "$#" -gt 0 ]; do UNKNOWN_OPT=yes fi ;; + avx2) + if [ "$VAL" = "no" ]; then + CFG_AVX2="$VAL" + else + UNKNOWN_OPT=yes + fi + ;; iwmmxt) CFG_IWMMXT="yes" ;; @@ -3081,6 +3089,7 @@ cat << EOF -no-sse4.1.......... Do not compile with use of SSE4.1 instructions. -no-sse4.2.......... Do not compile with use of SSE4.2 instructions. -no-avx ............ Do not compile with use of AVX instructions. + -no-avx2 ........... Do not compile with use of AVX2 instructions. -no-neon ........... Do not compile with use of NEON instructions. -no-mips_dsp ....... Do not compile with use of MIPS DSP instructions. -no-mips_dspr2 ..... Do not compile with use of MIPS DSP rev2 instructions. @@ -3990,6 +3999,15 @@ if [ "${CFG_AVX}" = "auto" ]; then fi fi +# detect avx2 support +if [ "${CFG_AVX2}" = "auto" ]; then + if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/avx2 "avx2" $L_FLAGS $I_FLAGS $l_FLAGS "-march=core-avx2"; then + CFG_AVX2=yes + else + CFG_AVX2=no + fi +fi + # check iWMMXt support if [ "$CFG_IWMMXT" = "yes" ]; then "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/iwmmxt "iwmmxt" $L_FLAGS $I_FLAGS $l_FLAGS "-mcpu=iwmmxt" @@ -5555,6 +5573,7 @@ fi [ "$CFG_SSE4_1" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG sse4_1" [ "$CFG_SSE4_2" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG sse4_2" [ "$CFG_AVX" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG avx" +[ "$CFG_AVX2" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG avx2" [ "$CFG_IWMMXT" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG iwmmxt" [ "$CFG_NEON" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG neon" if [ "$CFG_ARCH" = "mips" ]; then @@ -6510,7 +6529,7 @@ echo "PCH support ............ $CFG_PRECOMPILE" if [ "$CFG_ARCH" = "i386" -o "$CFG_ARCH" = "x86_64" ]; then echo "SSE2/SSE3/SSSE3......... ${CFG_SSE2}/${CFG_SSE3}/${CFG_SSSE3}" echo "SSE4.1/SSE4.2........... ${CFG_SSSE3}/${CFG_SSE4_1}/${CFG_SSE4_2}" - echo "AVX..................... ${CFG_AVX}" + echo "AVX/AVX2................ ${CFG_AVX}/${CFG_AVX2}" elif [ "$CFG_ARCH" = "arm" ]; then echo "iWMMXt support ......... ${CFG_IWMMXT}" echo "NEON support ........... ${CFG_NEON}" diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index 814ff37f84..fb67251600 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -210,4 +210,5 @@ ssse3:DEFINES += QT_HAVE_SSSE3 sse4_1:DEFINES += QT_HAVE_SSE4_1 sse4_2:DEFINES += QT_HAVE_SSE4_2 avx:DEFINES += QT_HAVE_AVX +avx2:DEFINES += QT_HAVE_AVX2 iwmmxt:DEFINES += QT_HAVE_IWMMXT -- cgit v1.2.3