[compiler-rt] r253831 - Add a generic version of __divtc3.c for long double complex division.

Joerg Sonnenberger via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 22 11:13:50 PST 2015


Author: joerg
Date: Sun Nov 22 13:13:49 2015
New Revision: 253831

URL: http://llvm.org/viewvc/llvm-project?rev=253831&view=rev
Log:
Add a generic version of __divtc3.c for long double complex division.
Mark the unit test as applying to all platforms.

Added:
    compiler-rt/trunk/lib/builtins/divtc3.c
Modified:
    compiler-rt/trunk/lib/builtins/CMakeLists.txt
    compiler-rt/trunk/test/builtins/Unit/divtc3_test.c

Modified: compiler-rt/trunk/lib/builtins/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/CMakeLists.txt?rev=253831&r1=253830&r2=253831&view=diff
==============================================================================
--- compiler-rt/trunk/lib/builtins/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/builtins/CMakeLists.txt Sun Nov 22 13:13:49 2015
@@ -41,6 +41,7 @@ set(GENERIC_SOURCES
   divsc3.c
   divsf3.c
   divsi3.c
+  divtc3.c
   divti3.c
   divtf3.c
   divxc3.c

Added: compiler-rt/trunk/lib/builtins/divtc3.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/builtins/divtc3.c?rev=253831&view=auto
==============================================================================
--- compiler-rt/trunk/lib/builtins/divtc3.c (added)
+++ compiler-rt/trunk/lib/builtins/divtc3.c Sun Nov 22 13:13:49 2015
@@ -0,0 +1,60 @@
+/*===-- divtc3.c - Implement __divtc3 -------------------------------------===
+ *
+ *                     The LLVM Compiler Infrastructure
+ *
+ * This file is dual licensed under the MIT and the University of Illinois Open
+ * Source Licenses. See LICENSE.TXT for details.
+ *
+ * ===----------------------------------------------------------------------===
+ *
+ * This file implements __divtc3 for the compiler_rt library.
+ *
+ *===----------------------------------------------------------------------===
+ */
+
+#include "int_lib.h"
+#include "int_math.h"
+
+/* Returns: the quotient of (a + ib) / (c + id) */
+
+COMPILER_RT_ABI long double _Complex
+__divtc3(long double __a, long double __b, long double __c, long double __d)
+{
+    int __ilogbw = 0;
+    long double __logbw = crt_logbl(crt_fmaxl(crt_fabsl(__c), crt_fabsl(__d)));
+    if (crt_isfinite(__logbw))
+    {
+        __ilogbw = (int)__logbw;
+        __c = crt_scalbnl(__c, -__ilogbw);
+        __d = crt_scalbnl(__d, -__ilogbw);
+    }
+    long double __denom = __c * __c + __d * __d;
+    long double _Complex z;
+    __real__ z = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw);
+    __imag__ z = crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw);
+    if (crt_isnan(__real__ z) && crt_isnan(__imag__ z))
+    {
+        if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b)))
+        {
+            __real__ z = crt_copysignl(CRT_INFINITY, __c) * __a;
+            __imag__ z = crt_copysignl(CRT_INFINITY, __c) * __b;
+        }
+        else if ((crt_isinf(__a) || crt_isinf(__b)) &&
+                 crt_isfinite(__c) && crt_isfinite(__d))
+        {
+            __a = crt_copysignl(crt_isinf(__a) ? 1.0 : 0.0, __a);
+            __b = crt_copysignl(crt_isinf(__b) ? 1.0 : 0.0, __b);
+            __real__ z = CRT_INFINITY * (__a * __c + __b * __d);
+            __imag__ z = CRT_INFINITY * (__b * __c - __a * __d);
+        }
+        else if (crt_isinf(__logbw) && __logbw > 0.0 &&
+                 crt_isfinite(__a) && crt_isfinite(__b))
+        {
+            __c = crt_copysignl(crt_isinf(__c) ? 1.0 : 0.0, __c);
+            __d = crt_copysignl(crt_isinf(__d) ? 1.0 : 0.0, __d);
+            __real__ z = 0.0 * (__a * __c + __b * __d);
+            __imag__ z = 0.0 * (__b * __c - __a * __d);
+        }
+    }
+    return z;
+}

Modified: compiler-rt/trunk/test/builtins/Unit/divtc3_test.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/builtins/Unit/divtc3_test.c?rev=253831&r1=253830&r2=253831&view=diff
==============================================================================
--- compiler-rt/trunk/test/builtins/Unit/divtc3_test.c (original)
+++ compiler-rt/trunk/test/builtins/Unit/divtc3_test.c Sun Nov 22 13:13:49 2015
@@ -13,8 +13,6 @@
 
 #include <stdio.h>
 
-#if _ARCH_PPC
-
 #include "int_lib.h"
 #include <math.h>
 #include <complex.h>
@@ -358,11 +356,8 @@ long double x[][2] =
 
 };
 
-#endif
-
 int main()
 {
-#if _ARCH_PPC
     const unsigned N = sizeof(x) / sizeof(x[0]);
     unsigned i, j;
     for (i = 0; i < N; ++i)
@@ -373,11 +368,7 @@ int main()
                 return 1;
         }
     }
-	
-//	printf("No errors found.\n");
 
-#else
-    printf("skipped\n");
-#endif
+//	printf("No errors found.\n");
     return 0;
 }




More information about the llvm-commits mailing list