]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ARM: div64: improve __arch_xprod_64()
authorNicolas Pitre <npitre@baylibre.com>
Thu, 3 Oct 2024 21:16:15 +0000 (17:16 -0400)
committerArnd Bergmann <arnd@arndb.de>
Mon, 28 Oct 2024 21:44:28 +0000 (21:44 +0000)
Let's use the same criteria for overflow handling necessity as the
generic code.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/include/asm/div64.h

index 4b69cf850451b0761fbcfa31439780d36b41e9fa..562d5376ae7a581915ee92daa10fd4168443832f 100644 (file)
@@ -56,6 +56,8 @@ static inline uint64_t __arch_xprod_64(uint64_t m, uint64_t n, bool bias)
 {
        unsigned long long res;
        register unsigned int tmp asm("ip") = 0;
+       bool no_ovf = __builtin_constant_p(m) &&
+                     ((m >> 32) + (m & 0xffffffff) < 0x100000000);
 
        if (!bias) {
                asm (   "umull  %Q0, %R0, %Q1, %Q2\n\t"
@@ -63,7 +65,7 @@ static inline uint64_t __arch_xprod_64(uint64_t m, uint64_t n, bool bias)
                        : "=&r" (res)
                        : "r" (m), "r" (n)
                        : "cc");
-       } else if (!(m & ((1ULL << 63) | (1ULL << 31)))) {
+       } else if (no_ovf) {
                res = m;
                asm (   "umlal  %Q0, %R0, %Q1, %Q2\n\t"
                        "mov    %Q0, #0"
@@ -80,7 +82,7 @@ static inline uint64_t __arch_xprod_64(uint64_t m, uint64_t n, bool bias)
                        : "cc");
        }
 
-       if (!(m & ((1ULL << 63) | (1ULL << 31)))) {
+       if (no_ovf) {
                asm (   "umlal  %R0, %Q0, %R1, %Q2\n\t"
                        "umlal  %R0, %Q0, %Q1, %R2\n\t"
                        "mov    %R0, #0\n\t"