From patchwork Mon Apr 22 15:30:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthias Kretz X-Patchwork-Id: 1926229 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VNTk14Q3Fz1yP2 for ; Tue, 23 Apr 2024 01:31:21 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E1D1C384AB50 for ; Mon, 22 Apr 2024 15:31:19 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from lxmtout2.gsi.de (lxmtout2.gsi.de [140.181.3.112]) by sourceware.org (Postfix) with ESMTPS id 273233858C78; Mon, 22 Apr 2024 15:30:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 273233858C78 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gsi.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gsi.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 273233858C78 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=140.181.3.112 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713799809; cv=none; b=jm3Mg4KnEqlacnY9oKNQGvXqdRd2EcW8RjyfzkqQ8i6RcBb6QPcUGFI5WX7CA8rxnCMRUYVWQQ8p03j7+AID4rOOLo931bFmEDgaw6eIlhlGl12ZQJGeIeJCFn0s/MVwxPeHb6z7hBwGrwirdPmi9PVM+OD72fTfSPP9qml2luk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713799809; c=relaxed/simple; bh=iEmoj2gFEe2NbQ1YHGGXwUYe/fFC5FMbJgMAUg3off0=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=NodyhDKEvrTPoON9H7g09vN489dCJUTgZb0bl/Tw6p5R4L3d7+/62nNIXz6qaE+YN+Bm8jdFFE0a1dvsP9wn0tHPkttaIKFqewq7ETgqHe7a/udoTEa4jUhyyPO36aMPqQ408T+40oig/7YxfigFzO0zM2y1pzuPd29LyRVp3+E= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from localhost (localhost [127.0.0.1]) by lxmtout2.gsi.de (Postfix) with ESMTP id 6044F20350E1; Mon, 22 Apr 2024 17:30:04 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at lxmtout2.gsi.de Received: from lxmtout2.gsi.de ([127.0.0.1]) by localhost (lxmtout2.gsi.de [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 1p7GenKQSjic; Mon, 22 Apr 2024 17:30:04 +0200 (CEST) Received: from srvEX6.campus.gsi.de (unknown [10.10.4.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lxmtout2.gsi.de (Postfix) with ESMTPS id 22B7F20350E7; Mon, 22 Apr 2024 17:30:04 +0200 (CEST) Received: from centauriprime.localnet (140.181.3.12) by srvEX6.campus.gsi.de (10.10.4.96) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 22 Apr 2024 17:30:03 +0200 From: Matthias Kretz To: , Subject: [PATCH] libstdc++: Fix conversion of simd to vector builtin Date: Mon, 22 Apr 2024 17:30:03 +0200 Message-ID: <14471703.uLZWGnKmhe@centauriprime> Organization: GSI Helmholtz Center for Heavy Ion Research MIME-Version: 1.0 X-Originating-IP: [140.181.3.12] X-ClientProxiedBy: srvEX7.Campus.gsi.de (10.10.4.97) To srvEX6.campus.gsi.de (10.10.4.96) X-Spam-Status: No, score=-10.1 required=5.0 tests=BAYES_00, BODY_8BITS, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP, URIBL_SBL_A autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Tested on x86_64-linux-gnu, powerpc64le-linux-gnu, aarch64-linux-gnu, arm- linux-gnueabihf OK for trunk and backports? ----------------------------- 8< --------------------------------- Signed-off-by: Matthias Kretz libstdc++-v3/ChangeLog: PR libstdc++/114803 * include/experimental/bits/simd_builtin.h (_SimdBase2::operator __vector_type_t): There is no __builtin() function in _SimdWrapper, instead use its conversion operator. * testsuite/experimental/simd/pr114803_vecbuiltin_cvt.cc: New test. --- .../include/experimental/bits/simd_builtin.h | 2 +- .../simd/pr114803_vecbuiltin_cvt.cc | 105 ++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/experimental/simd/ pr114803_vecbuiltin_cvt.cc + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); +} diff --git a/libstdc++-v3/include/experimental/bits/simd_builtin.h b/libstdc+ +-v3/include/experimental/bits/simd_builtin.h index 49c7c7e1c70..4ceeb423894 100644 --- a/libstdc++-v3/include/experimental/bits/simd_builtin.h +++ b/libstdc++-v3/include/experimental/bits/simd_builtin.h @@ -841,7 +841,7 @@ struct _SimdBase2 _GLIBCXX_SIMD_ALWAYS_INLINE explicit operator __vector_type_t<_Tp, _Np>() const - { return static_cast*>(this)- >_M_data.__builtin(); } + { return __data(*static_cast*>(this)); } }; struct _SimdBase1 diff --git a/libstdc++-v3/testsuite/experimental/simd/ pr114803_vecbuiltin_cvt.cc b/libstdc++-v3/testsuite/experimental/simd/ pr114803_vecbuiltin_cvt.cc new file mode 100644 index 00000000000..103dd19394c --- /dev/null +++ b/libstdc++-v3/testsuite/experimental/simd/pr114803_vecbuiltin_cvt.cc @@ -0,0 +1,105 @@ +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +template + void + maybe_test() + { + using V = std::experimental::simd>; + if constexpr (std::is_destructible_v) + { + using V2 [[gnu::vector_size(16)]] = T; + V x = {}; + V2 x2 = static_cast(x); + x = static_cast(x2); + for (unsigned i = 0; i < V::size(); ++i) + { + if (x2[i] != 0) + __builtin_abort(); + } +#ifdef __SSE__ + if constexpr (std::is_same_v) + x = static_cast(static_cast<__m128>(x)); + else if constexpr (std::is_same_v) + x = static_cast(static_cast<__m128d>(x)); + else if constexpr (std::is_integral_v) + x = static_cast(static_cast<__m128i>(x)); +#elif __ALTIVEC__ + if constexpr (std::is_same_v) + x = static_cast(static_cast<__vector float>(x)); +#ifdef __VSX__ + else if constexpr (std::is_same_v) + x = static_cast(static_cast<__vector double>(x)); +#endif + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(signed char) + && std::is_signed_v) + x = static_cast(static_cast<__vector signed char>(x)); + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(signed char)) + x = static_cast(static_cast<__vector unsigned char>(x)); + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(short) + && std::is_signed_v) + x = static_cast(static_cast<__vector signed short>(x)); + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(short)) + x = static_cast(static_cast<__vector unsigned short>(x)); + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(int) + && std::is_signed_v) + x = static_cast(static_cast<__vector signed int>(x)); + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(int)) + x = static_cast(static_cast<__vector unsigned int>(x)); +#ifdef __VSX__ + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(long long) + && std::is_signed_v) + x = static_cast(static_cast<__vector signed long long>(x)); + else if constexpr (std::is_integral_v && sizeof(T) == sizeof(long long)) + x = static_cast(static_cast<__vector unsigned long long>(x)); +#endif +#elif __ARM_NEON + if constexpr (std::is_same_v) + x = static_cast(static_cast(x)); +#ifdef __aarch64__ + else if constexpr (std::is_same_v) + x = static_cast(static_cast(x)); +#endif + else if constexpr (std::is_integral_v && sizeof(T) == 1 && std::is_signed_v) + x = static_cast(static_cast(x)); + else if constexpr (std::is_integral_v && sizeof(T) == 1) + x = static_cast(static_cast(x)); + else if constexpr (std::is_integral_v && sizeof(T) == 2 && std::is_signed_v) + x = static_cast(static_cast(x)); + else if constexpr (std::is_integral_v && sizeof(T) == 2) + x = static_cast(static_cast(x)); + else if constexpr (std::is_integral_v && sizeof(T) == 4 && std::is_signed_v) + x = static_cast(static_cast(x)); + else if constexpr (std::is_integral_v && sizeof(T) == 4) + x = static_cast(static_cast(x)); + else if constexpr (std::is_integral_v && sizeof(T) == 8 && std::is_signed_v) + x = static_cast(static_cast(x)); + else if constexpr (std::is_integral_v && sizeof(T) == 8) + x = static_cast(static_cast(x)); +#endif + } + } + +int main() +{ + maybe_test(); + maybe_test(); + maybe_test(); + maybe_test(); + + maybe_test(); + maybe_test(); + maybe_test();