]> Git Repo - qemu.git/commitdiff
softfloat: Specialize udiv_qrnnd for ppc64
authorRichard Henderson <[email protected]>
Wed, 3 Oct 2018 17:10:17 +0000 (17:10 +0000)
committerRichard Henderson <[email protected]>
Fri, 5 Oct 2018 17:57:41 +0000 (12:57 -0500)
The ISA has a 128/64-bit division instruction, though it assumes the
low 64-bits of the numerator are 0, and so requires a bit more fixup
than a full 128-bit division insn.

Reviewed-by: David Gibson <[email protected]>
Signed-off-by: Richard Henderson <[email protected]>
include/fpu/softfloat-macros.h

index eafc68932b85999696012bf8cdf13c1cd4f4b2f1..c86687fa5e710e186ea3b8dd43c183d5ab32a846 100644 (file)
@@ -647,6 +647,22 @@ static inline uint64_t udiv_qrnnd(uint64_t *r, uint64_t n1,
     asm("dlgr %0, %1" : "+r"(n) : "r"(d));
     *r = n >> 64;
     return n;
+#elif defined(_ARCH_PPC64)
+    /* From Power ISA 3.0B, programming note for divdeu.  */
+    uint64_t q1, q2, Q, r1, r2, R;
+    asm("divdeu %0,%2,%4; divdu %1,%3,%4"
+        : "=&r"(q1), "=r"(q2)
+        : "r"(n1), "r"(n0), "r"(d));
+    r1 = -(q1 * d);         /* low part of (n1<<64) - (q1 * d) */
+    r2 = n0 - (q2 * d);
+    Q = q1 + q2;
+    R = r1 + r2;
+    if (R >= d || R < r2) { /* overflow implies R > d */
+        Q += 1;
+        R -= d;
+    }
+    *r = R;
+    return Q;
 #else
     uint64_t d0, d1, q0, q1, r1, r0, m;
 
This page took 0.026398 seconds and 4 git commands to generate.