From 34315c6ac899fc0d3abe90748b409e17a7002cef Mon Sep 17 00:00:00 2001
From: Armin Luntzer <armin.luntzer@univie.ac.at>
Date: Wed, 13 Nov 2019 14:46:03 +0100
Subject: [PATCH] SPARC: add __floatdidf()

---
 arch/sparc/lib/Makefile    |  1 +
 arch/sparc/lib/floatdidf.c | 26 ++++++++++++++++++++++++++
 2 files changed, 27 insertions(+)
 create mode 100644 arch/sparc/lib/floatdidf.c

diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
index bc282f3..f8b76d1 100644
--- a/arch/sparc/lib/Makefile
+++ b/arch/sparc/lib/Makefile
@@ -10,3 +10,4 @@ lib-$(CONFIG_ARCH_CUSTOM_BOOT_CODE) += divdi3.o
 lib-$(CONFIG_ARCH_CUSTOM_BOOT_CODE) += moddi3.o
 lib-$(CONFIG_ARCH_CUSTOM_BOOT_CODE) += udivdi3.o
 lib-$(CONFIG_ARCH_CUSTOM_BOOT_CODE) += umoddi3.o
+lib-$(CONFIG_ARCH_CUSTOM_BOOT_CODE) += floatdidf.o
diff --git a/arch/sparc/lib/floatdidf.c b/arch/sparc/lib/floatdidf.c
new file mode 100644
index 0000000..e0fd299
--- /dev/null
+++ b/arch/sparc/lib/floatdidf.c
@@ -0,0 +1,26 @@
+
+#define WORD_SIZE (sizeof (unsigned int) * 8)
+#define HIGH_HALFWORD_COEFF (((unsigned long long) 1) << (WORD_SIZE / 2))
+#define HIGH_WORD_COEFF (((unsigned long long) 1) << WORD_SIZE)
+
+
+double __floatdidf(long long i)
+{
+	double d;
+	int neg = 0;
+
+	if (i < 0) {
+		i = -i;
+		neg = 1;
+	}
+
+	d = (unsigned int) (i >> WORD_SIZE);
+	d *= HIGH_HALFWORD_COEFF;
+	d *= HIGH_HALFWORD_COEFF;
+	d += (unsigned int) (i & (HIGH_WORD_COEFF - 1));
+
+	if (neg)
+		d = -d;
+
+	return d;
+}
-- 
GitLab