[compiler-rt] Fix extendhfxf2 test (PR #117665)

B I Mohammed Abbas via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 25 22:19:45 PST 2024


https://github.com/biabbas updated https://github.com/llvm/llvm-project/pull/117665

>From 26b584138bbdda4dd8295e03aa00a28c9d7649b4 Mon Sep 17 00:00:00 2001
From: B I Mohammed Abbas <bimohammadabbas at gmail.com>
Date: Tue, 26 Nov 2024 11:49:32 +0530
Subject: [PATCH] Fix extendhfxf2 test

---
 .../test/builtins/Unit/extendhfxf2_test.c     | 36 +++++++++----------
 compiler-rt/test/builtins/Unit/fp_test.h      | 18 ++++++++++
 2 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/compiler-rt/test/builtins/Unit/extendhfxf2_test.c b/compiler-rt/test/builtins/Unit/extendhfxf2_test.c
index 80e6f78cdd9c4f..9cef87927162ae 100644
--- a/compiler-rt/test/builtins/Unit/extendhfxf2_test.c
+++ b/compiler-rt/test/builtins/Unit/extendhfxf2_test.c
@@ -5,59 +5,55 @@
 #include <math.h> // for isnan, isinf
 #include <stdio.h>
 
-#include "int_lib.h"
+#include "fp_test.h"
 
-#if HAS_80_BIT_LONG_DOUBLE && defined(COMPILER_RT_HAS_FLOAT16)
+#if __LDBL_MANT_DIG__ == 64 && defined(__x86_64__) && defined(COMPILER_RT_HAS_FLOAT16)
 
-long double __extendhfxf2(_Float16 f);
+xf_float __extendhfxf2(TYPE_FP16 f);
 
-int test_extendhfxf2(_Float16 a, long double expected) {
-  long double x = __extendhfxf2(a);
-  __uint16_t *b = (void *)&a;
-  int ret = !((isnan(x) && isnan(expected)) || x == expected);
+int test_extendhfxf2(TYPE_FP16 a, xf_float expected) {
+  xf_float x = __extendhfxf2(a);
+  uint16_t a_rep = toRep16(a);
+  int ret = compareResultF80_F80(x, expected);
   if (ret) {
     printf("error in test__extendhfxf2(%#.4x) = %.20Lf, "
            "expected %.20Lf\n",
-           *b, x, expected);
+           a_rep, x, expected);
   }
   return ret;
 }
 
-char assumption_1[sizeof(_Float16) * CHAR_BIT == 16] = {0};
-
 int main() {
   // Small positive value
-  if (test_extendhfxf2(0.09997558593750000000f, 0.09997558593750000000L))
+  if (test_extendhfxf2(fromRep16(0x2e66), 0.09997558593750000000L))
     return 1;
 
   // Small negative value
-  if (test_extendhfxf2(-0.09997558593750000000f, -0.09997558593750000000L))
+  if (test_extendhfxf2(fromRep16(0xae66), -0.09997558593750000000L))
     return 1;
 
   // Zero
-  if (test_extendhfxf2(0.0f, 0.0L))
+  if (test_extendhfxf2(fromRep16(0), 0.0L))
     return 1;
 
   // Smallest positive non-zero value
-  if (test_extendhfxf2(0x1p-16f, 0x1p-16L))
+  if (test_extendhfxf2(fromRep16(0x0100), 0x1p-16L))
     return 1;
 
   // Smallest negative non-zero value
-  if (test_extendhfxf2(-0x1p-16f, -0x1p-16L))
+  if (test_extendhfxf2(fromRep16(0x8100), -0x1p-16L))
     return 1;
 
   // Positive infinity
-  if (test_extendhfxf2(__builtin_huge_valf16(), __builtin_huge_valf64x()))
+  if (test_extendhfxf2(makeInf16(), makeInf80()))
     return 1;
 
   // Negative infinity
-  if (test_extendhfxf2(-__builtin_huge_valf16(),
-                       (long double)-__builtin_huge_valf64x()))
+  if (test_extendhfxf2(makeNegativeInf16(), makeNegativeInf80()))
     return 1;
 
   // NaN
-  if (test_extendhfxf2(__builtin_nanf16(""),
-                       (long double)__builtin_nanf64x("")))
+  if (test_extendhfxf2(makeQNaN16(), makeQNaN80()))
     return 1;
 
   return 0;
diff --git a/compiler-rt/test/builtins/Unit/fp_test.h b/compiler-rt/test/builtins/Unit/fp_test.h
index 4eb54b7425c107..c0d9caa6f330a1 100644
--- a/compiler-rt/test/builtins/Unit/fp_test.h
+++ b/compiler-rt/test/builtins/Unit/fp_test.h
@@ -253,6 +253,18 @@ static inline int compareResultF80(long double result, uint64_t expectedHi,
     return !(hi == expectedHi && lo == expectedLo);
 }
 
+static inline int compareResultF80_F80(long double result, long double expected) {
+    __uint128_t rep = F80ToRep128(result);
+    // F80 occupies the lower 80 bits of __uint128_t.
+    uint64_t hi = (rep >> 64) & ((1UL << (80 - 64)) - 1);
+    uint64_t lo = rep;
+    __uint128_t expected_rep = F80ToRep128(expected);
+    // F80 occupies the lower 80 bits of __uint128_t.
+    uint64_t expectedHi = (expected_rep >> 64) & ((1UL << (80 - 64)) - 1);
+    uint64_t expectedLo = expected_rep;
+    return !(hi == expectedHi && lo == expectedLo);
+}
+
 static inline long double makeQNaN80(void) {
     return F80FromRep128(0x7fffUL, 0xc000000000000000UL);
 }
@@ -265,6 +277,10 @@ static inline long double makeNaN80(uint64_t rand) {
 static inline long double makeInf80(void) {
     return F80FromRep128(0x7fffUL, 0x8000000000000000UL);
 }
+
+static inline long double makeNegativeInf80(void) {
+  return F80FromRep128(0xffffUL, 0x8000000000000000UL);
+}
 #endif
 
 #if defined(CRT_HAS_TF_MODE)
@@ -299,6 +315,8 @@ static inline TYPE_FP16 makeInf16(void)
     return fromRep16(0x7c00U);
 }
 
+static inline TYPE_FP16 makeNegativeInf16(void) { return fromRep16(0xfc00U); }
+
 static inline float makeInf32(void)
 {
     return fromRep32(0x7f800000U);



More information about the llvm-commits mailing list