diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
index bc282f34051e92262dc9fe276194ebc168e7e71f..f8b76d1eb4ac0f8928c9fdee4bab59d1a81b816b 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 0000000000000000000000000000000000000000..e0fd29965ca01d197b344aa1cacb2fc2ae53a3c0
--- /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;
+}