[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