mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
ARM: div64: improve __arch_xprod_64()
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>
This commit is contained in:
parent
00a31dd3ac
commit
06508533d5
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user