[ARM] 5320/1: fix assembly constraints in implementation of do_div()
authorNicolas Pitre <nico@cam.org>
Thu, 23 Oct 2008 03:34:08 +0000 (04:34 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 23 Oct 2008 11:53:32 +0000 (12:53 +0100)
Those inline assembly segments using the umlal instruction must have
the & modifier so to be sure that a purely input register won't alias
one of the registers used as input+output.  In most cases, the inputs
are still used after the outputs are touched, and most binutil versions
insist on "rdhi, rdlo and rm must all be different" even for ARMv6+.

Signed-off-by: Nicolas Pitre <nico@marvell.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/div64.h

index 5001390be9582fc1c937aa562671c23cd403f957..d3f0a9eee9f65a94b8b7804c162f65160496b485 100644 (file)
                        __res = __m;                                    \
                        asm (   "umlal  %Q0, %R0, %Q1, %Q2\n\t"         \
                                "mov    %Q0, #0"                        \
-                               : "+r" (__res)                          \
+                               : "+&r" (__res)                         \
                                : "r" (__m), "r" (__n)                  \
                                : "cc" );                               \
                } else {                                                \
                                "umlal  %R0, %Q0, %Q1, %R2\n\t"         \
                                "mov    %R0, #0\n\t"                    \
                                "umlal  %Q0, %R0, %R1, %R2"             \
-                               : "+r" (__res)                          \
+                               : "+&r" (__res)                         \
                                : "r" (__m), "r" (__n)                  \
                                : "cc" );                               \
                } else {                                                \
                                "adds   %Q0, %1, %Q0\n\t"               \
                                "adc    %R0, %R0, #0\n\t"               \
                                "umlal  %Q0, %R0, %R2, %R3"             \
-                               : "+r" (__res), "+r" (__z)              \
+                               : "+&r" (__res), "+&r" (__z)            \
                                : "r" (__m), "r" (__n)                  \
                                : "cc" );                               \
                }                                                       \