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
73 lines
2.7 KiB
C++
73 lines
2.7 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify -triple aarch64 -target-feature +bf16 %s
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -triple aarch64 -target-feature -bf16 %s
|
|
|
|
__bf16 test_static_cast_from_float(float in) {
|
|
return static_cast<__bf16>(in); // expected-error {{static_cast from 'float' to '__bf16' is not allowed}}
|
|
}
|
|
|
|
__bf16 test_static_cast_from_float_literal(void) {
|
|
return static_cast<__bf16>(1.0f); // expected-error {{static_cast from 'float' to '__bf16' is not allowed}}
|
|
}
|
|
|
|
__bf16 test_static_cast_from_int(int in) {
|
|
return static_cast<__bf16>(in); // expected-error {{static_cast from 'int' to '__bf16' is not allowed}}
|
|
}
|
|
|
|
__bf16 test_static_cast_from_int_literal(void) {
|
|
return static_cast<__bf16>(1); // expected-error {{static_cast from 'int' to '__bf16' is not allowed}}
|
|
}
|
|
|
|
__bf16 test_static_cast_bfloat(__bf16 in) {
|
|
return static_cast<__bf16>(in); // this one should work
|
|
}
|
|
|
|
float test_static_cast_to_float(__bf16 in) {
|
|
return static_cast<float>(in); // expected-error {{static_cast from '__bf16' to 'float' is not allowed}}
|
|
}
|
|
|
|
int test_static_cast_to_int(__bf16 in) {
|
|
return static_cast<int>(in); // expected-error {{static_cast from '__bf16' to 'int' is not allowed}}
|
|
}
|
|
|
|
__bf16 test_implicit_from_float(float in) {
|
|
return in; // expected-error {{cannot initialize return object of type '__bf16' with an lvalue of type 'float'}}
|
|
}
|
|
|
|
__bf16 test_implicit_from_float_literal() {
|
|
return 1.0f; // expected-error {{cannot initialize return object of type '__bf16' with an rvalue of type 'float'}}
|
|
}
|
|
|
|
__bf16 test_implicit_from_int(int in) {
|
|
return in; // expected-error {{cannot initialize return object of type '__bf16' with an lvalue of type 'int'}}
|
|
}
|
|
|
|
__bf16 test_implicit_from_int_literal() {
|
|
return 1; // expected-error {{cannot initialize return object of type '__bf16' with an rvalue of type 'int'}}
|
|
}
|
|
|
|
__bf16 test_implicit_bfloat(__bf16 in) {
|
|
return in; // this one should work
|
|
}
|
|
|
|
float test_implicit_to_float(__bf16 in) {
|
|
return in; // expected-error {{cannot initialize return object of type 'float' with an lvalue of type '__bf16'}}
|
|
}
|
|
|
|
int test_implicit_to_int(__bf16 in) {
|
|
return in; // expected-error {{cannot initialize return object of type 'int' with an lvalue of type '__bf16'}}
|
|
}
|
|
|
|
__bf16 test_cond(__bf16 a, __bf16 b, bool which) {
|
|
// Conditional operator _should_ be supported, without nonsense
|
|
// complaints like 'types __bf16 and __bf16 are not compatible'
|
|
return which ? a : b;
|
|
}
|
|
|
|
__bf16 test_cond_float(__bf16 a, __bf16 b, bool which) {
|
|
return which ? a : 1.0f; // expected-error {{incompatible operand types ('__bf16' and 'float')}}
|
|
}
|
|
|
|
__bf16 test_cond_int(__bf16 a, __bf16 b, bool which) {
|
|
return which ? a : 1; // expected-error {{incompatible operand types ('__bf16' and 'int')}}
|
|
}
|