diff --git a/config.tests/common/aesni/aesni.cpp b/config.tests/common/aesni/aesni.cpp new file mode 100644 index 0000000000..a177183c72 --- /dev/null +++ b/config.tests/common/aesni/aesni.cpp @@ -0,0 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Intel Corporation. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +int main(int, char**) +{ + __m128i a = _mm_setzero_si128(); + __m128i b = _mm_aesenc_si128(a, a); + __m128i c = _mm_aesdec_si128(a, b); + (void)c; + return 0; +} diff --git a/config.tests/common/aesni/aesni.pro b/config.tests/common/aesni/aesni.pro new file mode 100644 index 0000000000..49cb132ef7 --- /dev/null +++ b/config.tests/common/aesni/aesni.pro @@ -0,0 +1,3 @@ +SOURCES = aesni.cpp +!defined(QMAKE_CFLAGS_AESNI, "var"): error("This compiler does not support AES New Instructions") +else: QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_AESNI diff --git a/config.tests/common/shani/shani.cpp b/config.tests/common/shani/shani.cpp new file mode 100644 index 0000000000..0fe6e87dd8 --- /dev/null +++ b/config.tests/common/shani/shani.cpp @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Intel Corporation. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +int main(int, char**) +{ + __m128i a = _mm_setzero_si128(); + __m128i b = _mm_sha1rnds4_epu32(a, a, 0); + __m128i c = _mm_sha1msg1_epu32(a, b); + __m128i d = _mm_sha256msg2_epu32(b, c); + (void)d; + return 0; +} diff --git a/config.tests/common/shani/shani.pro b/config.tests/common/shani/shani.pro new file mode 100644 index 0000000000..278f49ef90 --- /dev/null +++ b/config.tests/common/shani/shani.pro @@ -0,0 +1,3 @@ +SOURCES = shani.cpp +!defined(QMAKE_CFLAGS_SHANI, "var"): error("This compiler does not support Secure Hash Algorithm extensions") +else: QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SHANI diff --git a/configure.json b/configure.json index 276bb095e5..6ccb1acdd9 100644 --- a/configure.json +++ b/configure.json @@ -317,11 +317,21 @@ "type": "compile", "test": "common/sse4_2" }, + "aesni": { + "label": "AES new instructions", + "type": "compile", + "test": "common/aesni" + }, "f16c": { "label": "F16C instructions", "type": "compile", "test": "common/f16c" }, + "shani": { + "label": "SHA new instructions", + "type": "compile", + "test": "common/shani" + }, "avx": { "label": "AVX instructions", "type": "compile", @@ -871,6 +881,22 @@ { "type": "define", "name": "QT_COMPILER_SUPPORTS_AVX512VBMI", "value": 1 } ] }, + "aesni": { + "label": "aesni", + "condition": "features.sse2 && tests.aesni", + "output": [ + "privateConfig", + { "type": "define", "name": "QT_COMPILER_SUPPORTS_AES", "value": 1 } + ] + }, + "shani": { + "label": "shani", + "condition": "features.sse2 && tests.shani", + "output": [ + "privateConfig", + { "type": "define", "name": "QT_COMPILER_SUPPORTS_SHA", "value": 1 } + ] + }, "mips_dsp": { "label": "DSP", "condition": "arch.mips && tests.mips_dsp", diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf index 9ddebae506..ca5697dd90 100644 --- a/mkspecs/common/gcc-base.conf +++ b/mkspecs/common/gcc-base.conf @@ -97,6 +97,8 @@ QMAKE_CFLAGS_AVX512BW += -mavx512bw QMAKE_CFLAGS_AVX512VL += -mavx512vl QMAKE_CFLAGS_AVX512IFMA += -mavx512ifma QMAKE_CFLAGS_AVX512VBMI += -mavx512vbmi +QMAKE_CFLAGS_AESNI += -maes +QMAKE_CFLAGS_SHANI += -msha QMAKE_CFLAGS_NEON += -mfpu=neon QMAKE_CFLAGS_MIPS_DSP += -mdsp QMAKE_CFLAGS_MIPS_DSPR2 += -mdspr2 diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf index 02b8441547..0ca27fe4ec 100644 --- a/mkspecs/common/msvc-desktop.conf +++ b/mkspecs/common/msvc-desktop.conf @@ -44,6 +44,8 @@ QMAKE_CFLAGS_SSE3 = $$QMAKE_CFLAGS_SSE2 QMAKE_CFLAGS_SSSE3 = $$QMAKE_CFLAGS_SSE2 QMAKE_CFLAGS_SSE4_1 = $$QMAKE_CFLAGS_SSE2 QMAKE_CFLAGS_SSE4_2 = $$QMAKE_CFLAGS_SSE2 +QMAKE_CFLAGS_AESNI = $$QMAKE_CFLAGS_SSE2 +QMAKE_CFLAGS_SHANI = $$QMAKE_CFLAGS_SSE2 QMAKE_CXX = $$QMAKE_CC QMAKE_CXXFLAGS = $$QMAKE_CFLAGS diff --git a/mkspecs/common/qcc-base.conf b/mkspecs/common/qcc-base.conf index 4ef03d8587..77e0476777 100644 --- a/mkspecs/common/qcc-base.conf +++ b/mkspecs/common/qcc-base.conf @@ -33,6 +33,8 @@ QMAKE_CFLAGS_SSE4_1 += -msse4.1 QMAKE_CFLAGS_SSE4_2 += -msse4.2 QMAKE_CFLAGS_AVX += -mavx QMAKE_CFLAGS_AVX2 += -mavx2 +QMAKE_CFLAGS_AESNI += -maes +QMAKE_CFLAGS_SHANI += -msha QMAKE_CXXFLAGS += $$QMAKE_CFLAGS -lang-c++ QMAKE_CXXFLAGS_DEPS += $$QMAKE_CFLAGS_DEPS diff --git a/mkspecs/common/winrt_winphone/qmake.conf b/mkspecs/common/winrt_winphone/qmake.conf index 818264c46b..1b9bf4d20f 100644 --- a/mkspecs/common/winrt_winphone/qmake.conf +++ b/mkspecs/common/winrt_winphone/qmake.conf @@ -34,6 +34,8 @@ QMAKE_CFLAGS_SSE4_1 = -arch:SSE2 QMAKE_CFLAGS_SSE4_2 = -arch:SSE2 QMAKE_CFLAGS_AVX = -arch:AVX QMAKE_CFLAGS_AVX2 = -arch:AVX +QMAKE_CFLAGS_AESNI = -arch:SSE2 +QMAKE_CFLAGS_SHANI = -arch:SSE2 QMAKE_CXX = $$QMAKE_CC QMAKE_CXXFLAGS = $$QMAKE_CFLAGS diff --git a/mkspecs/features/simd.prf b/mkspecs/features/simd.prf index 953fc52c65..aca9ae6243 100644 --- a/mkspecs/features/simd.prf +++ b/mkspecs/features/simd.prf @@ -93,6 +93,8 @@ addSimdCompiler(sse3) addSimdCompiler(ssse3) addSimdCompiler(sse4_1) addSimdCompiler(sse4_2) +addSimdCompiler(aesni) +addSimdCompiler(shani) addSimdCompiler(avx) addSimdCompiler(avx2) addSimdCompiler(avx512f) diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf index 4822d2a0e0..bc753647ec 100644 --- a/mkspecs/linux-icc/qmake.conf +++ b/mkspecs/linux-icc/qmake.conf @@ -42,6 +42,8 @@ QMAKE_CFLAGS_AVX512PF += -xMIC-AVX512 QMAKE_CFLAGS_AVX512DQ += -xCORE-AVX512 QMAKE_CFLAGS_AVX512BW += -xCORE-AVX512 QMAKE_CFLAGS_AVX512VL += -xCORE-AVX512 +QMAKE_CFLAGS_AESNI += -maes +QMAKE_CFLAGS_SHANI += -msha QMAKE_CXX = icpc QMAKE_CXXFLAGS = $$QMAKE_CFLAGS diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf index 533f9cd86d..210b281987 100644 --- a/mkspecs/macx-icc/qmake.conf +++ b/mkspecs/macx-icc/qmake.conf @@ -40,6 +40,8 @@ QMAKE_CFLAGS_AVX512PF += -xMIC-AVX512 QMAKE_CFLAGS_AVX512DQ += -xCORE-AVX512 QMAKE_CFLAGS_AVX512BW += -xCORE-AVX512 QMAKE_CFLAGS_AVX512VL += -xCORE-AVX512 +QMAKE_CFLAGS_AESNI += -maes +QMAKE_CFLAGS_SHANI += -msha QMAKE_CXX = icpc QMAKE_CXXFLAGS = $$QMAKE_CFLAGS diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf index d6b08f5323..5f98bd1d03 100644 --- a/mkspecs/win32-g++/qmake.conf +++ b/mkspecs/win32-g++/qmake.conf @@ -28,6 +28,8 @@ QMAKE_YACCFLAGS = -d QMAKE_CFLAGS += -fno-keep-inline-dllexport QMAKE_CFLAGS_WARN_ON += -Wextra QMAKE_CFLAGS_SSE2 += -mstackrealign +QMAKE_CFLAGS_AESNI = -maes +QMAKE_CFLAGS_SHANI = -msha QMAKE_CXX = $${CROSS_COMPILE}g++ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD diff --git a/mkspecs/win32-icc/qmake.conf b/mkspecs/win32-icc/qmake.conf index 6e2589b4c4..9a86407043 100644 --- a/mkspecs/win32-icc/qmake.conf +++ b/mkspecs/win32-icc/qmake.conf @@ -33,6 +33,8 @@ QMAKE_CFLAGS_AVX512PF += -QxMIC-AVX512 QMAKE_CFLAGS_AVX512DQ += -QxCORE-AVX512 QMAKE_CFLAGS_AVX512BW += -QxCORE-AVX512 QMAKE_CFLAGS_AVX512VL += -QxCORE-AVX512 +QMAKE_CFLAGS_AESNI = -QxSSE2 +QMAKE_CFLAGS_SHANI = -QxSSE4.2 QMAKE_CXX = $$QMAKE_CC QMAKE_CXXFLAGS = $$QMAKE_CFLAGS /Zc:forScope diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h index f6164e2297..59a8dd9d0c 100644 --- a/src/corelib/tools/qsimd_p.h +++ b/src/corelib/tools/qsimd_p.h @@ -261,7 +261,7 @@ # endif #endif -#if defined(__AES__) || defined(__PCLMUL__) +#if defined(__AES__) || defined(__PCLMUL__) || (defined(QT_COMPILER_SUPPORTS_AES) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS)) # include #endif