aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2024-06-01 12:46:31 +0200
committerGeorg-Johann Lay <avr@gjlay.de>2024-06-01 12:49:45 +0200
commitf12454278dc725fec3520a5d870e967d79292ee6 (patch)
tree793ea5530fc91766d772afb3d6c420454577594a /gcc
parentb460ede64f9471589822831e04eecff4a3dbecf2 (diff)
downloadgcc-f12454278dc725fec3520a5d870e967d79292ee6.zip
gcc-f12454278dc725fec3520a5d870e967d79292ee6.tar.gz
gcc-f12454278dc725fec3520a5d870e967d79292ee6.tar.bz2
AVR: target/115317 - Make isinf(-Inf) return -1.
PR target/115317 libgcc/config/avr/libf7/ * libf7-asm.sx (__isinf): Map -Inf to -1. gcc/testsuite/ * gcc.target/avr/torture/pr115317-isinf.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/pr115317-isinf.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr115317-isinf.c b/gcc/testsuite/gcc.target/avr/torture/pr115317-isinf.c
new file mode 100644
index 0000000..10f7b55
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr115317-isinf.c
@@ -0,0 +1,55 @@
+/* { dg-do run { target { ! avr_tiny } } } */
+
+extern int isinff (float);
+extern int isinf (double);
+extern int isinfl (long double);
+
+int tst_isinf (float x, int val)
+{
+ double y;
+ long double z;
+
+ __asm ("" : "+r"(x));
+ if (isinff (x) != val)
+ __builtin_exit (__LINE__);
+
+ y = x;
+ __asm ("" : "+r"(y));
+ if (isinf (y) != val)
+ __builtin_exit (__LINE__);
+
+ z = x;
+ __asm ("" : "+r"(z));
+ if (isinfl (z) != val)
+ __builtin_exit (__LINE__);
+}
+
+static float make_f (__UINT32_TYPE__ i)
+{
+ float f;
+ __builtin_memcpy (&f, &i, 4);
+ return f;
+}
+
+int main (void)
+{
+ tst_isinf (__builtin_huge_valf(), 1);
+ tst_isinf (-__builtin_huge_valf(), -1);
+ tst_isinf (__builtin_nanf(""), 0);
+ tst_isinf (0.0f, 0);
+ tst_isinf (-0.0f, 0);
+ tst_isinf (1.0f, 0);
+ tst_isinf (-1.0f, 0);
+ tst_isinf (make_f (0x7f800000), 1);
+ tst_isinf (make_f (0xff800000), -1);
+ tst_isinf (make_f (0x7f7fffff), 0);
+ tst_isinf (make_f (0xff7fffff), 0);
+ tst_isinf (make_f (0x7f800001), 0);
+ tst_isinf (make_f (0xff800001), 0);
+ tst_isinf (make_f (0x00800000), 0);
+ tst_isinf (make_f (0x80800000), 0);
+ tst_isinf (make_f (0x00400000), 0);
+ tst_isinf (make_f (0x80400000), 0);
+
+ return 0;
+}