]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
metag/usercopy: Simplify rapf loop fixup corner case
authorJames Hogan <james.hogan@imgtec.com>
Tue, 4 Apr 2017 10:42:35 +0000 (11:42 +0100)
committerJames Hogan <james.hogan@imgtec.com>
Wed, 5 Apr 2017 14:25:08 +0000 (15:25 +0100)
The final fixup in the rapf loops must handle a corner case due to the
intermediate decrementing of the destination pointer before writing the
last element to it again and re-incrementing it. This decrement (and the
associated increment in the fixup code) can be easily avoided by using
SETL/SETD with an offset of -8/-4.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: linux-metag@vger.kernel.org
arch/metag/lib/usercopy.c

index 7abed2f45c836a5898f7f6dfdad2f5b35bc66df3..ceb4590fbca563114fcc9fd6043dc53c8d8ab045 100644 (file)
                "29:    SUB     %3, %3, #32\n"                          \
                "30:    MGETL   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
                "31:    MSETL   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
-               "32:    SUB     %0, %0, #8\n"                           \
-               "33:    SETL    [%0++], D0.7, D1.7\n"                   \
+               "32:    SETL    [%0+#-8], D0.7, D1.7\n"                 \
                "       SUB     %3, %3, #32\n"                          \
                "1:     DCACHE  [%1+#-64], D0Ar6\n"                     \
                "       GETL    D0Ar6, D1Ar5, [A0StP+#-40]\n"           \
                "       GETL    D0.7, D1.7, [A0StP+#-8]\n"              \
                "       SUB     A0StP, A0StP, #40\n"                    \
                "       .section .fixup,\"ax\"\n"                       \
-               "4:     ADD     %0, %0, #8\n"                           \
                "3:     MOV     D0Ar2, TXSTATUS\n"                      \
                "       MOV     D1Ar1, TXSTATUS\n"                      \
                "       AND     D1Ar1, D1Ar1, #0xFFFFF8FF\n"            \
                "       .long 30b,3b\n"                                 \
                "       .long 31b,3b\n"                                 \
                "       .long 32b,3b\n"                                 \
-               "       .long 33b,4b\n"                                 \
                "       .previous\n"                                    \
                : "=r" (to), "=r" (from), "=r" (ret), "=d" (n)          \
                : "0" (to), "1" (from), "2" (ret), "3" (n)              \
                "41:    SUB     %3, %3, #16\n"                          \
                "42:    MGETD   D0FrT, D0.5, D0.6, D0.7, [%1++]\n"      \
                "43:    MSETD   [%0++], D0FrT, D0.5, D0.6, D0.7\n"      \
-               "44:    SUB     %0, %0, #4\n"                           \
-               "45:    SETD    [%0++], D0.7\n"                         \
+               "44:    SETD    [%0+#-4], D0.7\n"                       \
                "       SUB     %3, %3, #16\n"                          \
                "1:     DCACHE  [%1+#-64], D0Ar6\n"                     \
                "       GETL    D0Ar6, D1Ar5, [A0StP+#-40]\n"           \
                "       GETL    D0.7, D1.7, [A0StP+#-8]\n"              \
                "       SUB A0StP, A0StP, #40\n"                        \
                "       .section .fixup,\"ax\"\n"                       \
-               "4:     ADD     %0, %0, #4\n"                           \
                "3:     MOV     D0Ar2, TXSTATUS\n"                      \
                "       MOV     D1Ar1, TXSTATUS\n"                      \
                "       AND     D1Ar1, D1Ar1, #0xFFFFF8FF\n"            \
                "       .long 42b,3b\n"                                 \
                "       .long 43b,3b\n"                                 \
                "       .long 44b,3b\n"                                 \
-               "       .long 45b,4b\n"                                 \
                "       .previous\n"                                    \
                : "=r" (to), "=r" (from), "=r" (ret), "=d" (n)          \
                : "0" (to), "1" (from), "2" (ret), "3" (n)              \