mirror of
https://github.com/intel/llvm.git
synced 2026-02-09 01:52:26 +08:00
[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
This commit is contained in:
@@ -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) "
|
||||
|
||||
@@ -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.
|
||||
|
||||
21
clang/test/Parser/altivec-bool-128.c
Normal file
21
clang/test/Parser/altivec-bool-128.c
Normal file
@@ -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)}}
|
||||
23
clang/test/Parser/cxx-altivec-bool-128.cpp
Normal file
23
clang/test/Parser/cxx-altivec-bool-128.cpp
Normal file
@@ -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)}}
|
||||
12
clang/test/Parser/p10-vector-bool-128.c
Normal file
12
clang/test/Parser/p10-vector-bool-128.c
Normal file
@@ -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;
|
||||
Reference in New Issue
Block a user