forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Clang: Support minimumnum and maximumnum intrinsics (llvm#96281)
We just introduce llvm.minimumnum and llvm.maximumnum intrinsics support to llvm. Let's support them in Clang. See: llvm#93033
- Loading branch information
1 parent
e2919fb
commit 3302f06
Showing
9 changed files
with
327 additions
and
7 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// RUN: not %clang_cc1 -triple x86_64 %s -fsyntax-only -verify 2>&1 | FileCheck %s --check-prefix=CHECK-ERR | ||
|
||
float fminimum_numf (float, float); | ||
double fminimum_num (double, double); | ||
long double fminimum_numl (long double, long double); | ||
float fmaximum_numf (float, float); | ||
double fmaximum_num (double, double); | ||
long double fmaximum_numl (long double, long double); | ||
|
||
// CHECK-ERR: passing 'char *' to parameter of incompatible type 'float' | ||
float fmin1(char *a, char *b) { | ||
return fminimum_numf(a, b); | ||
} | ||
// CHECK-ERR: passing 'char *' to parameter of incompatible type 'double' | ||
float fmin2(char *a, char *b) { | ||
return fminimum_num(a, b); | ||
} | ||
// CHECK-ERR: passing 'char *' to parameter of incompatible type 'long double' | ||
float fmin3(char *a, char *b) { | ||
return fminimum_numl(a, b); | ||
} | ||
// CHECK-ERR: passing 'char *' to parameter of incompatible type 'float' | ||
float fmax1(char *a, char *b) { | ||
return fmaximum_numf(a, b); | ||
} | ||
// CHECK-ERR: passing 'char *' to parameter of incompatible type 'double' | ||
float fmax2(char *a, char *b) { | ||
return fmaximum_num(a, b); | ||
} | ||
// CHECK-ERR: passing 'char *' to parameter of incompatible type 'long double' | ||
float fmax3(char *a, char *b) { | ||
return fmaximum_numl(a, b); | ||
} |
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 |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s | ||
// FIXME: %clang_cc1 -std=c++17 -fsyntax-only -verify -fexperimental-new-constant-interpreter %s | ||
// expected-no-diagnostics | ||
|
||
constexpr double NaN = __builtin_nan(""); | ||
constexpr double SNaN = __builtin_nans(""); | ||
constexpr double Inf = __builtin_inf(); | ||
constexpr double NegInf = -__builtin_inf(); | ||
|
||
#define FMAXIMUMNUM_TEST_SIMPLE(T, FUNC) \ | ||
static_assert(T(6.7890) == FUNC(T(1.2345), T(6.7890))); \ | ||
static_assert(T(6.7890) == FUNC(T(6.7890), T(1.2345))); | ||
|
||
#define FMAXIMUMNUM_TEST_SNAN(T, FUNC) \ | ||
static_assert(Inf == FUNC(SNaN, Inf)); \ | ||
static_assert(NegInf == FUNC(NegInf, SNaN)); \ | ||
static_assert(0.0 == FUNC(SNaN, 0.0)); \ | ||
static_assert(-0.0 == FUNC(-0.0, SNaN)); \ | ||
static_assert(T(-1.2345) == FUNC(SNaN, T(-1.2345))); \ | ||
static_assert(T(1.2345) == FUNC(T(1.2345), SNaN)); \ | ||
static_assert(__builtin_isnan(FUNC(SNaN, SNaN))); \ | ||
static_assert(__builtin_isnan(FUNC(NaN, SNaN))); \ | ||
static_assert(!__builtin_issignaling(FUNC(SNaN, SNaN))); \ | ||
static_assert(!__builtin_issignaling(FUNC(NaN, SNaN))); | ||
|
||
#define FMAXIMUMNUM_TEST_NAN(T, FUNC) \ | ||
static_assert(Inf == FUNC(NaN, Inf)); \ | ||
static_assert(NegInf == FUNC(NegInf, NaN)); \ | ||
static_assert(0.0 == FUNC(NaN, 0.0)); \ | ||
static_assert(-0.0 == FUNC(-0.0, NaN)); \ | ||
static_assert(T(-1.2345) == FUNC(NaN, T(-1.2345))); \ | ||
static_assert(T(1.2345) == FUNC(T(1.2345), NaN)); \ | ||
static_assert(__builtin_isnan(FUNC(NaN, NaN))); | ||
|
||
#define FMAXIMUMNUM_TEST_INF(T, FUNC) \ | ||
static_assert(Inf == FUNC(NegInf, Inf)); \ | ||
static_assert(Inf == FUNC(Inf, 0.0)); \ | ||
static_assert(Inf == FUNC(-0.0, Inf)); \ | ||
static_assert(Inf == FUNC(Inf, T(1.2345))); \ | ||
static_assert(Inf == FUNC(T(-1.2345), Inf)); | ||
|
||
#define FMAXIMUMNUM_TEST_NEG_INF(T, FUNC) \ | ||
static_assert(Inf == FUNC(Inf, NegInf)); \ | ||
static_assert(0.0 == FUNC(NegInf, 0.0)); \ | ||
static_assert(-0.0 == FUNC(-0.0, NegInf)); \ | ||
static_assert(T(-1.2345) == FUNC(NegInf, T(-1.2345))); \ | ||
static_assert(T(1.2345) == FUNC(T(1.2345), NegInf)); | ||
|
||
#define FMAXIMUMNUM_TEST_BOTH_ZERO(T, FUNC) \ | ||
static_assert(__builtin_copysign(1.0, FUNC(0.0, 0.0)) == 1.0); \ | ||
static_assert(__builtin_copysign(1.0, FUNC(-0.0, 0.0)) == 1.0); \ | ||
static_assert(__builtin_copysign(1.0, FUNC(0.0, -0.0)) == 1.0); \ | ||
static_assert(__builtin_copysign(1.0, FUNC(-0.0, -0.0)) == -1.0); | ||
|
||
#define LIST_FMAXIMUMNUM_TESTS(T, FUNC) \ | ||
FMAXIMUMNUM_TEST_SIMPLE(T, FUNC) \ | ||
FMAXIMUMNUM_TEST_NAN(T, FUNC) \ | ||
FMAXIMUMNUM_TEST_SNAN(T, FUNC) \ | ||
FMAXIMUMNUM_TEST_INF(T, FUNC) \ | ||
FMAXIMUMNUM_TEST_NEG_INF(T, FUNC) \ | ||
FMAXIMUMNUM_TEST_BOTH_ZERO(T, FUNC) | ||
|
||
LIST_FMAXIMUMNUM_TESTS(double, __builtin_fmaximum_num) | ||
LIST_FMAXIMUMNUM_TESTS(float, __builtin_fmaximum_numf) | ||
LIST_FMAXIMUMNUM_TESTS((long double), __builtin_fmaximum_numl) | ||
LIST_FMAXIMUMNUM_TESTS(__fp16, __builtin_fmaximum_numf16) | ||
#ifdef __FLOAT128__ | ||
LIST_FMAXIMUMNUM_TESTS(__float128, __builtin_fmaximum_numf128) | ||
#endif |
Oops, something went wrong.