[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-09-17 Thread Serge Pavlov via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rTb983131b7e46: [test-suite] Add tests for FP classification 
intrinsics (authored by sepavloff).

Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

Files:
  SingleSource/UnitTests/CMakeLists.txt
  SingleSource/UnitTests/Float/CMakeLists.txt
  SingleSource/UnitTests/Float/Makefile
  SingleSource/UnitTests/Float/check-helper.h
  SingleSource/UnitTests/Float/classify-f32.h
  SingleSource/UnitTests/Float/classify-f64.h
  SingleSource/UnitTests/Float/classify-ldouble.h
  SingleSource/UnitTests/Float/classify.c
  SingleSource/UnitTests/Float/classify.reference_output
  SingleSource/UnitTests/Float/fformat.h

Index: SingleSource/UnitTests/Float/fformat.h
===
--- /dev/null
+++ SingleSource/UnitTests/Float/fformat.h
@@ -0,0 +1,65 @@
+//===--- fformat.h - Descriptions of floating point formats ---*- C -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+//
+// This header file contains some macro definitions useful for working with bit
+// accurate floating point representations.
+//
+//===--===//
+#ifndef _FFORMAT_H_
+#define _FFORMAT_H_
+
+#define F32_SIGN_BIT0x8000U
+#define F32_EXP_MASK0x7F80U
+#define F32_MANTISSA_MASK   0x007FU
+#define F32_MANTISSA_MSB0x0040U
+#define F32_QNAN_BITF32_MANTISSA_MSB
+#define F32_PAYLOAD_MASK(F32_MANTISSA_MASK & ~F32_QNAN_BIT)
+#define F32_SIGN_SHIFT  31
+#define F32_EXP_SHIFT   23
+#define F32_EXP_SIZE(F32_SIGN_SHIFT - F32_EXP_SHIFT)
+#define F32_MANTISSA_SIZE   F32_EXP_SHIFT
+#define F32_EXP_BIAS127
+#define F32_EXP_MIN (-126)
+#define F32_EXP_MAX 127
+#define F32_EXP(e)  (((e) + F32_EXP_BIAS) << F32_EXP_SHIFT)
+#define F32_MANTISSA(b1, b2, b3)   \
+(((b1) ? F32_MANTISSA_MSB : 0) |   \
+ ((b2) ? (F32_MANTISSA_MSB >> 1) : 0) |\
+ ((b3) ? (F32_MANTISSA_MSB >> 2) : 0))
+#define F32_MAKE(s, e, m)  \
+(((s) ? F32_SIGN_BIT : 0) |\
+ ((e) & F32_EXP_MASK) |\
+ ((m) & F32_MANTISSA_MASK))
+#define F32_NORMAL(s, e, m) F32_MAKE((s), F32_EXP(e), (m))
+
+
+#define F64_SIGN_BIT0x8000ULL
+#define F64_EXP_MASK0x7FF0ULL
+#define F64_MANTISSA_MASK   0x000FULL
+#define F64_MANTISSA_MSB0x0008ULL
+#define F64_QNAN_BITF64_MANTISSA_MSB
+#define F64_PAYLOAD_MASK(F64_MANTISSA_MASK & ~F64_QNAN_BIT)
+#define F64_SIGN_SHIFT  63
+#define F64_EXP_SHIFT   52
+#define F64_EXP_SIZE(F64_SIGN_SHIFT - F64_EXP_SHIFT)
+#define F64_MANTISSA_SIZE   F64_EXP_SHIFT
+#define F64_EXP_BIAS1023
+#define F64_EXP_MIN (-1022)
+#define F64_EXP_MAX 1023
+#define F64_EXP(e)  (((uint64_t)(e) + F64_EXP_BIAS) << F64_EXP_SHIFT)
+#define F64_MANTISSA(b1, b2, b3)   \
+(((b1) ? F64_MANTISSA_MSB : 0) |   \
+ ((b2) ? (F64_MANTISSA_MSB >> 1) : 0) |\
+ ((b3) ? (F64_MANTISSA_MSB >> 2) : 0))
+#define F64_MAKE(s, e, m)  \
+(((s) ? F64_SIGN_BIT : 0) |\
+ ((e) & F64_EXP_MASK) |\
+ ((m) & F64_MANTISSA_MASK))
+#define F64_NORMAL(s, e, m) F64_MAKE((s), F64_EXP(e), (m))
+
+#endif
Index: SingleSource/UnitTests/Float/classify.reference_output
===
--- /dev/null
+++ SingleSource/UnitTests/Float/classify.reference_output
@@ -0,0 +1 @@
+exit 0
Index: SingleSource/UnitTests/Float/classify.c
===
--- /dev/null
+++ SingleSource/UnitTests/Float/classify.c
@@ -0,0 +1,26 @@
+//===--- classify.cpp - Tess for FP classification intrinsics ---*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+//
+// This is a general test for floating 

[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-09-17 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff added a comment.

Thanks!


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-09-16 Thread Simon Pilgrim via Phabricator via cfe-commits
RKSimon accepted this revision.
RKSimon added a comment.
This revision is now accepted and ready to land.

LGTM


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-09-15 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff added a comment.

If nobody objects, I would commit this change, as it would be useful in the 
forthcoming return of `llvm.isnan`.


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-09-10 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff added a comment.

In D106804#2991411 , @RKSimon wrote:

> Do we have test-suite buildbot coverage on anything other than x86? Cross 
> platform uses of long double is always fun

The following build bots have a stage named `test-suite`:

clang-ppc64be-linux-lnt
clang-ppc64le-linux-lnt
clang-s390x-linux-lnt
clang-armv7-lnt
clang-native-arm-lnt-perf
clang-aarch64-full-2stage
clang-armv7-vfpv3-full-2stage
clang-thumbv7-full-2stage
clang-cmake-x86_64-avx2-linux-perf
clang-cmake-x86_64-avx2-linux

So it looks like major targets are represented in testing.


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-09-09 Thread Simon Pilgrim via Phabricator via cfe-commits
RKSimon added a comment.

I've no objections to this - it seems to be orthogonal to the isnan ir 
intrinsic conversation.

Do we have test-suite buildbot coverage on anything other than x86? Cross 
platform uses of long double is always fun

Any other comments?


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-09-09 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff added a comment.

In D106804#2956881 , @RKSimon wrote:

> Something I noticed is that we don't have much test coverage in 
> clang/test/codegen for the fpclass intrinsics - including no constexpr 
> testing afaict (although I don't think __builtin_fpclassify is constexpr yet) 
> - is that something you'd be willing to take a look at?

They present and are in `clang/test/Sema/constant-builtins-2.c`. This is C file 
but the constant evaluator is the same for C++. The tested functions are 
`fpclassify`, `isinf`, `isnan`, `isfinite` and `isnormal`. And yes, 
`fpclassify` is constexpr.


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-08-25 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff updated this revision to Diff 368687.
sepavloff added a comment.

Updated patch

- Moved tests into header files. It should facilitate writing tests for various 
modes (strict exceptions, fast math etc),
- Added Makefile,
- Enhanced diagnostics if test fails,
- Avoid C++, it makes easier to run test on simulator if there are fewer 
dependencies.


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

Files:
  SingleSource/UnitTests/CMakeLists.txt
  SingleSource/UnitTests/Float/CMakeLists.txt
  SingleSource/UnitTests/Float/Makefile
  SingleSource/UnitTests/Float/check-helper.h
  SingleSource/UnitTests/Float/classify-f32.h
  SingleSource/UnitTests/Float/classify-f64.h
  SingleSource/UnitTests/Float/classify-ldouble.h
  SingleSource/UnitTests/Float/classify.c
  SingleSource/UnitTests/Float/classify.reference_output
  SingleSource/UnitTests/Float/fformat.h

Index: SingleSource/UnitTests/Float/fformat.h
===
--- /dev/null
+++ SingleSource/UnitTests/Float/fformat.h
@@ -0,0 +1,65 @@
+//===--- fformat.h - Descriptions of floating point formats ---*- C -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+//
+// This header file contains some macro definitions useful for working with bit
+// accurate floating point representations.
+//
+//===--===//
+#ifndef _FFORMAT_H_
+#define _FFORMAT_H_
+
+#define F32_SIGN_BIT0x8000U
+#define F32_EXP_MASK0x7F80U
+#define F32_MANTISSA_MASK   0x007FU
+#define F32_MANTISSA_MSB0x0040U
+#define F32_QNAN_BITF32_MANTISSA_MSB
+#define F32_PAYLOAD_MASK(F32_MANTISSA_MASK & ~F32_QNAN_BIT)
+#define F32_SIGN_SHIFT  31
+#define F32_EXP_SHIFT   23
+#define F32_EXP_SIZE(F32_SIGN_SHIFT - F32_EXP_SHIFT)
+#define F32_MANTISSA_SIZE   F32_EXP_SHIFT
+#define F32_EXP_BIAS127
+#define F32_EXP_MIN (-126)
+#define F32_EXP_MAX 127
+#define F32_EXP(e)  (((e) + F32_EXP_BIAS) << F32_EXP_SHIFT)
+#define F32_MANTISSA(b1, b2, b3)   \
+(((b1) ? F32_MANTISSA_MSB : 0) |   \
+ ((b2) ? (F32_MANTISSA_MSB >> 1) : 0) |\
+ ((b3) ? (F32_MANTISSA_MSB >> 2) : 0))
+#define F32_MAKE(s, e, m)  \
+(((s) ? F32_SIGN_BIT : 0) |\
+ ((e) & F32_EXP_MASK) |\
+ ((m) & F32_MANTISSA_MASK))
+#define F32_NORMAL(s, e, m) F32_MAKE((s), F32_EXP(e), (m))
+
+
+#define F64_SIGN_BIT0x8000ULL
+#define F64_EXP_MASK0x7FF0ULL
+#define F64_MANTISSA_MASK   0x000FULL
+#define F64_MANTISSA_MSB0x0008ULL
+#define F64_QNAN_BITF64_MANTISSA_MSB
+#define F64_PAYLOAD_MASK(F64_MANTISSA_MASK & ~F64_QNAN_BIT)
+#define F64_SIGN_SHIFT  63
+#define F64_EXP_SHIFT   52
+#define F64_EXP_SIZE(F64_SIGN_SHIFT - F64_EXP_SHIFT)
+#define F64_MANTISSA_SIZE   F64_EXP_SHIFT
+#define F64_EXP_BIAS1023
+#define F64_EXP_MIN (-1022)
+#define F64_EXP_MAX 1023
+#define F64_EXP(e)  (((uint64_t)(e) + F64_EXP_BIAS) << F64_EXP_SHIFT)
+#define F64_MANTISSA(b1, b2, b3)   \
+(((b1) ? F64_MANTISSA_MSB : 0) |   \
+ ((b2) ? (F64_MANTISSA_MSB >> 1) : 0) |\
+ ((b3) ? (F64_MANTISSA_MSB >> 2) : 0))
+#define F64_MAKE(s, e, m)  \
+(((s) ? F64_SIGN_BIT : 0) |\
+ ((e) & F64_EXP_MASK) |\
+ ((m) & F64_MANTISSA_MASK))
+#define F64_NORMAL(s, e, m) F64_MAKE((s), F64_EXP(e), (m))
+
+#endif
Index: SingleSource/UnitTests/Float/classify.reference_output
===
--- /dev/null
+++ SingleSource/UnitTests/Float/classify.reference_output
@@ -0,0 +1 @@
+exit 0
Index: SingleSource/UnitTests/Float/classify.c
===
--- /dev/null
+++ SingleSource/UnitTests/Float/classify.c
@@ -0,0 +1,26 @@
+//===--- classify.cpp - Tess for FP classification intrinsics ---*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// 

[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-08-20 Thread Simon Pilgrim via Phabricator via cfe-commits
RKSimon added a comment.

Something I noticed is that we don't have much test coverage in 
clang/test/codegen for the fpclass intrinsics - including no constexpr testing 
afaict (although I don't think __builtin_fpclassify is constexpr yet) - is that 
something you'd be willing to take a look at?




Comment at: SingleSource/UnitTests/Float/classify.cpp:89
+assert(!__builtin_isnormal(*FPtr));
+assert(__builtin_fpclassify(0, 1, 2, 3, 4, *FPtr) == 0);
+  }

are asserts the best way to do this? most other unit tests print out something 
to help isolate diffs


Repository:
  rT test-suite

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106804/new/

https://reviews.llvm.org/D106804

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106804: [test-suite] Add tests for FP classification intrinsics

2021-07-26 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff created this revision.
sepavloff added reviewers: efriedma, kpn, thopre, jonpa, cameron.mcinally, 
RKSimon, craig.topper.
Herald added a subscriber: mgorny.
sepavloff requested review of this revision.

Repository:
  rT test-suite

https://reviews.llvm.org/D106804

Files:
  SingleSource/UnitTests/CMakeLists.txt
  SingleSource/UnitTests/Float/CMakeLists.txt
  SingleSource/UnitTests/Float/classify.cpp
  SingleSource/UnitTests/Float/classify.reference_output

Index: SingleSource/UnitTests/Float/classify.reference_output
===
--- /dev/null
+++ SingleSource/UnitTests/Float/classify.reference_output
@@ -0,0 +1 @@
+exit 0
Index: SingleSource/UnitTests/Float/classify.cpp
===
--- /dev/null
+++ SingleSource/UnitTests/Float/classify.cpp
@@ -0,0 +1,306 @@
+//===--- classify.cpp - Tess for FP classification intrinsics ---*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+//
+// This is a general test for floating point classification intrinsic.
+//
+//===--===//
+
+#undef NDEBUG
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define DimOf(x) (sizeof(x) / sizeof(x[0]))
+
+#define F32_SIGN 0x8000U
+#define F32_EXP_MASK 0x7F80U
+#define F32_MANTISSA_MASK 0x007FU
+#define F32_QNAN_BIT 0x0040U
+#define F32_PAYLOAD_MASK F32_MANTISSA_MASK
+
+#define F64_SIGN 0x8000ULL
+#define F64_EXP_MASK 0x7FF0ULL
+#define F64_MANTISSA_MASK 0x000FULL
+#define F64_QNAN_BIT 0x0008ULL
+#define F64_PAYLOAD_MASK F64_MANTISSA_MASK
+
+
+uint32_t FloatNaNValues[] = {
+  F32_SIGN | F32_EXP_MASK | F32_QNAN_BIT | F32_PAYLOAD_MASK,
+ F32_EXP_MASK | F32_QNAN_BIT | F32_PAYLOAD_MASK,
+  F32_SIGN | F32_EXP_MASK |F32_PAYLOAD_MASK,
+ F32_EXP_MASK |F32_PAYLOAD_MASK,
+  F32_SIGN | F32_EXP_MASK | F32_QNAN_BIT,
+ F32_EXP_MASK | F32_QNAN_BIT,
+  F32_SIGN | F32_EXP_MASK | F32_QNAN_BIT | 0x0020U,
+ F32_EXP_MASK | F32_QNAN_BIT | 0x0010U,
+  F32_SIGN | F32_EXP_MASK |0x0020U,
+ F32_EXP_MASK |0x0010U,
+  F32_SIGN | F32_EXP_MASK | F32_QNAN_BIT | 0x0001U,
+ F32_EXP_MASK | F32_QNAN_BIT | 0x0002U,
+  F32_SIGN | F32_EXP_MASK |0x0001U,
+ F32_EXP_MASK |0x0002U,
+};
+
+uint32_t FloatInfValues[] = {
+  F32_SIGN | F32_EXP_MASK,   // -Inf
+ F32_EXP_MASK// +Inf
+};
+
+uint32_t FloatZeroValues[] = {
+  F32_SIGN,  // -0.0
+  0  // +0.0
+};
+
+uint32_t FloatDenormValues[] = {
+  F32_SIGN | 0x0001U,// smallest negative denornal number
+ 0x0001U,// smallest positive denornal number
+  F32_SIGN | 0x007FU,// largest negative denormal number
+ 0x007FU,// largest positive normal number
+};
+
+uint32_t FloatNormalValues[] = {
+F32_SIGN | 0x0080U,  // smallest negative normal number
+   0x0080U,  // smallest positive normal number
+F32_SIGN | 0x7F7FU,  // largest negative normal number
+   0x7F7FU,  // largest positive normal number
+F32_SIGN | 0x3F7FU,  // smallest number larger than -1
+F32_SIGN | 0x3F80U,  // -1
+F32_SIGN | 0x3F81U,  // largest number less than -1
+   0x3F7FU,  // largest number less than 1
+   0x3F80U,  // +1
+   0x3F81U,  // smallest number larger than 1
+};
+
+int test_float() {
+  for (unsigned i = 0; i < DimOf(FloatNaNValues); i++) {
+float *FPtr = (float *)[i];
+assert(__builtin_isnan(*FPtr));
+assert(!__builtin_isinf(*FPtr));
+assert(!__builtin_isfinite(*FPtr));
+assert(!__builtin_isnormal(*FPtr));
+assert(__builtin_fpclassify(0, 1, 2, 3, 4, *FPtr) == 0);
+  }
+  for (unsigned i = 0; i < DimOf(FloatInfValues); i++) {
+float *FPtr = (float *)[i];
+assert(!__builtin_isnan(*FPtr));
+assert(__builtin_isinf(*FPtr));
+assert(!__builtin_isfinite(*FPtr));
+assert(!__builtin_isnormal(*FPtr));
+assert(__builtin_fpclassify(0, 1, 2, 3, 4, *FPtr) == 1);
+  }
+  for (unsigned i = 0; i < DimOf(FloatZeroValues); i++) {
+float *FPtr = (float *)[i];
+assert(!__builtin_isnan(*FPtr));
+assert(!__builtin_isinf(*FPtr));
+assert(__builtin_isfinite(*FPtr));
+assert(!__builtin_isnormal(*FPtr));
+assert(__builtin_fpclassify(0, 1, 2, 3, 4, *FPtr) == 4);
+  }
+  for (unsigned i = 0; i < DimOf(FloatDenormValues); i++) {
+float *FPtr = (float *)[i];
+