-
Notifications
You must be signed in to change notification settings - Fork 10.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[AArch64] Always allow the __bf16 type
We would like to make the ACLE NEON and SVE intrinsics more useable by gating them on the target, not by ifdef preprocessor macros. In order to do this the types they use need to be available. This patches makes __bf16 always available under AArch64 not just when the bf16 architecture feature is present. This bringing it in-line with GCC. In subsequent patches the NEON bfloat16x8_t and SVE svbfloat16_t types (along with bfloat16_t used in arm_sve.h) will be made unconditional too. The operations valid on the types are still very limited. They can be used as a storage type, but the intrinsics used for convertions are still behind an ifdef guard in arm_neon.h/arm_bf16.h. Differential Revision: https://reviews.llvm.org/D130973
- Loading branch information
1 parent
88501dc
commit 8c30f4a
Showing
8 changed files
with
59 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,49 +1,57 @@ | ||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 \ | ||
// RUN: -triple aarch64-arm-none-eabi -target-cpu cortex-a75 \ | ||
// RUN: -target-feature +bf16 -target-feature +neon %s | ||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 \ | ||
// RUN: -triple arm-arm-none-eabi -target-cpu cortex-a53 \ | ||
// RUN: -target-feature +bf16 -target-feature +neon %s | ||
// RUN: %clang_cc1 -fsyntax-only -verify=scalar,neon -std=c++11 \ | ||
// RUN: -triple aarch64-arm-none-eabi -target-cpu cortex-a75 \ | ||
// RUN: -target-feature +bf16 -target-feature +neon %s | ||
// RUN: %clang_cc1 -fsyntax-only -verify=scalar,neon -std=c++11 \ | ||
// RUN: -triple arm-arm-none-eabi -target-cpu cortex-a53 \ | ||
// RUN: -target-feature +bf16 -target-feature +neon %s | ||
|
||
// The types should be available under AArch64 even without the bf16 feature | ||
// RUN: %clang_cc1 -fsyntax-only -verify=scalar -DNONEON -std=c++11 \ | ||
// RUN: -triple aarch64-arm-none-eabi -target-cpu cortex-a75 \ | ||
// RUN: -target-feature -bf16 -target-feature +neon %s | ||
|
||
// REQUIRES: aarch64-registered-target || arm-registered-target | ||
|
||
void test(bool b) { | ||
__bf16 bf16; | ||
|
||
bf16 + bf16; // expected-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
bf16 - bf16; // expected-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
bf16 * bf16; // expected-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
bf16 / bf16; // expected-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
bf16 + bf16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
bf16 - bf16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
bf16 * bf16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
bf16 / bf16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__bf16')}} | ||
|
||
__fp16 fp16; | ||
|
||
bf16 + fp16; // expected-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 + bf16; // expected-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 - fp16; // expected-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 - bf16; // expected-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 * fp16; // expected-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 * bf16; // expected-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 / fp16; // expected-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 / bf16; // expected-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 = fp16; // expected-error {{assigning to '__bf16' from incompatible type '__fp16'}} | ||
fp16 = bf16; // expected-error {{assigning to '__fp16' from incompatible type '__bf16'}} | ||
bf16 + (b ? fp16 : bf16); // expected-error {{incompatible operand types ('__fp16' and '__bf16')}} | ||
bf16 + fp16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 + bf16; // scalar-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 - fp16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 - bf16; // scalar-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 * fp16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 * bf16; // scalar-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 / fp16; // scalar-error {{invalid operands to binary expression ('__bf16' and '__fp16')}} | ||
fp16 / bf16; // scalar-error {{invalid operands to binary expression ('__fp16' and '__bf16')}} | ||
bf16 = fp16; // scalar-error {{assigning to '__bf16' from incompatible type '__fp16'}} | ||
fp16 = bf16; // scalar-error {{assigning to '__fp16' from incompatible type '__bf16'}} | ||
bf16 + (b ? fp16 : bf16); // scalar-error {{incompatible operand types ('__fp16' and '__bf16')}} | ||
} | ||
|
||
#ifndef NONEON | ||
|
||
#include <arm_neon.h> | ||
|
||
void test_vector(bfloat16x4_t a, bfloat16x4_t b, float16x4_t c) { | ||
a + b; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
a - b; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
a * b; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
a / b; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
|
||
a + c; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
a - c; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
a * c; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
a / c; // expected-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
c + b; // expected-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
c - b; // expected-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
c * b; // expected-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
c / b; // expected-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
a + b; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
a - b; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
a * b; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
a / b; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'bfloat16x4_t')}} | ||
|
||
a + c; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
a - c; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
a * c; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
a / c; // neon-error {{invalid operands to binary expression ('bfloat16x4_t' (vector of 4 'bfloat16_t' values) and 'float16x4_t' (vector of 4 'float16_t' values))}} | ||
c + b; // neon-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
c - b; // neon-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
c * b; // neon-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
c / b; // neon-error {{invalid operands to binary expression ('float16x4_t' (vector of 4 'float16_t' values) and 'bfloat16x4_t' (vector of 4 'bfloat16_t' values))}} | ||
} | ||
#endif |