Author: Ahsan Saghir Date: 2020-06-23T21:25:56-05:00 New Revision: f4c337ab85c0b7ec206da0f2c6576730eefb36c2
URL: https://github.com/llvm/llvm-project/commit/f4c337ab85c0b7ec206da0f2c6576730eefb36c2 DIFF: https://github.com/llvm/llvm-project/commit/f4c337ab85c0b7ec206da0f2c6576730eefb36c2.diff LOG: [PowerPC] Add support for vector bool __int128 for Power10 Summary: This patch adds support for `vector bool __int128` type for Power10. Reviewers: #powerpc, hfinkel, lei, stefanp, amyk Reviewed By: #powerpc, lei, amyk Subscribers: lei, amyk, wuzish, nemanjai, shchenz, cfe-commits Tags: #llvm, #powerpc, #clang Differential Revision: https://reviews.llvm.org/D81816 Added: clang/test/Parser/altivec-bool-128.c clang/test/Parser/cxx-altivec-bool-128.cpp clang/test/Parser/p10-vector-bool-128.c Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/DeclSpec.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 66856834a98f..ec31178389f9 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -259,6 +259,9 @@ def err_invalid_vector_float_decl_spec : Error< def err_invalid_vector_double_decl_spec : Error < "use of 'double' with '__vector' requires VSX support to be enabled " "(available on POWER7 or later)">; +def err_invalid_vector_bool_int128_decl_spec : Error < + "use of '__int128' with '__vector bool' requires VSX support enabled (on " + "POWER10 or later)">; def err_invalid_vector_long_long_decl_spec : Error < "use of 'long long' with '__vector bool' requires VSX support (available on " "POWER7 or later) or extended Altivec support (available on POWER8 or later) " diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index 6ad50e18cd52..f4c30c90ad27 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -1150,14 +1150,20 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { S.Diag(TSSLoc, diag::err_invalid_vector_bool_decl_spec) << getSpecifierName((TSS)TypeSpecSign); } - - // Only char/int are valid with vector bool. (PIM 2.1) + // Only char/int are valid with vector bool prior to Power10. + // Power10 adds instructions that produce vector bool data + // for quadwords as well so allow vector bool __int128. if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) && - (TypeSpecType != TST_int)) || TypeAltiVecPixel) { + (TypeSpecType != TST_int) && (TypeSpecType != TST_int128)) || + TypeAltiVecPixel) { S.Diag(TSTLoc, diag::err_invalid_vector_bool_decl_spec) << (TypeAltiVecPixel ? "__pixel" : getSpecifierName((TST)TypeSpecType, Policy)); } + // vector bool __int128 requires Power10. + if ((TypeSpecType == TST_int128) && + (!S.Context.getTargetInfo().hasFeature("power10-vector"))) + S.Diag(TSTLoc, diag::err_invalid_vector_bool_int128_decl_spec); // Only 'short' and 'long long' are valid with vector bool. (PIM 2.1) if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short) && @@ -1174,7 +1180,7 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { // Elements of vector bool are interpreted as unsigned. (PIM 2.1) if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) || - (TypeSpecWidth != TSW_unspecified)) + (TypeSpecType == TST_int128) || (TypeSpecWidth != TSW_unspecified)) TypeSpecSign = TSS_unsigned; } else if (TypeSpecType == TST_double) { // vector long double and vector long long double are never allowed. diff --git a/clang/test/Parser/altivec-bool-128.c b/clang/test/Parser/altivec-bool-128.c new file mode 100644 index 000000000000..049ca3cc839d --- /dev/null +++ b/clang/test/Parser/altivec-bool-128.c @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu \ +// RUN: -target-feature +altivec -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu \ +// RUN: -target-feature +altivec -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-cpu pwr10 \ +// RUN: -target-feature +vsx -target-feature -power10-vector \ +// RUN: -fsyntax-only -verify %s + +// Test 'vector bool __int128' type. + +// These should have errors. +__vector bool __int128 v1_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector __bool __int128 v2_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector bool __int128 v3_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector __bool __int128 v4_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector bool unsigned __int128 v5_bi128; // expected-error {{cannot use 'unsigned' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector bool signed __int128 v6_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector bool unsigned __int128 v7_bi128; // expected-error {{cannot use 'unsigned' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector bool signed __int128 v8_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector __bool signed __int128 v9_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector __bool signed __int128 v10_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} diff --git a/clang/test/Parser/cxx-altivec-bool-128.cpp b/clang/test/Parser/cxx-altivec-bool-128.cpp new file mode 100644 index 000000000000..36ffefc9a18b --- /dev/null +++ b/clang/test/Parser/cxx-altivec-bool-128.cpp @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu \ +// RUN: -target-feature +altivec -fsyntax-only -verify -std=c++11 %s +// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu \ +// RUN: -target-feature +altivec -fsyntax-only -verify -std=c++11 %s +// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-cpu pwr10 \ +// RUN: -target-feature +altivec -target-feature +vsx \ +// RUN: -target-feature -power10-vector -fsyntax-only -verify %s + +#include <altivec.h> + +// Test 'vector bool __int128' type. + +// These should have errors. +__vector bool __int128 v1_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector __bool __int128 v2_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector bool __int128 v3_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector __bool __int128 v4_bi128; // expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector bool unsigned __int128 v5_bi128; // expected-error {{cannot use 'unsigned' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector bool signed __int128 v6_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector bool unsigned __int128 v7_bi128; // expected-error {{cannot use 'unsigned' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector bool signed __int128 v8_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +__vector __bool signed __int128 v9_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} +vector __bool signed __int128 v10_bi128; // expected-error {{cannot use 'signed' with '__vector bool'}} expected-error {{use of '__int128' with '__vector bool' requires VSX support enabled (on POWER10 or later)}} diff --git a/clang/test/Parser/p10-vector-bool-128.c b/clang/test/Parser/p10-vector-bool-128.c new file mode 100644 index 000000000000..df14b04e7e37 --- /dev/null +++ b/clang/test/Parser/p10-vector-bool-128.c @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -target-cpu pwr10 \ +// RUN: -target-feature +vsx -target-feature +power10-vector \ +// RUN: -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-cpu pwr10 \ +// RUN: -target-feature +power10-vector -fsyntax-only -verify %s +// expected-no-diagnostics + +// Test legitimate uses of 'vector bool __int128' with VSX. +__vector bool __int128 v1_bi128; +__vector __bool __int128 v2_bi128; +vector bool __int128 v3_bi128; +vector __bool __int128 v4_bi128; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits