Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 31 Oct 2011 22:22:16 +0000 (15:22 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 31 Oct 2011 22:22:16 +0000 (15:22 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
  sparc64: Fix masking and shifting in VIS fpcmp emulation.
  sparc32: Correct the return value of memcpy.
  sparc32: Remove uses of %g7 in memcpy implementation.
  sparc32: Remove non-kernel code from memcpy implementation.

arch/sparc/kernel/visemul.c
arch/sparc/lib/memcpy.S

index 32b626c..7337067 100644 (file)
@@ -713,17 +713,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
                        s16 b = (rs2 >> (i * 16)) & 0xffff;
 
                        if (a > b)
-                               rd_val |= 1 << i;
+                               rd_val |= 8 >> i;
                }
                break;
 
        case FCMPGT32_OPF:
                for (i = 0; i < 2; i++) {
-                       s32 a = (rs1 >> (i * 32)) & 0xffff;
-                       s32 b = (rs2 >> (i * 32)) & 0xffff;
+                       s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+                       s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
                        if (a > b)
-                               rd_val |= 1 << i;
+                               rd_val |= 2 >> i;
                }
                break;
 
@@ -733,17 +733,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
                        s16 b = (rs2 >> (i * 16)) & 0xffff;
 
                        if (a <= b)
-                               rd_val |= 1 << i;
+                               rd_val |= 8 >> i;
                }
                break;
 
        case FCMPLE32_OPF:
                for (i = 0; i < 2; i++) {
-                       s32 a = (rs1 >> (i * 32)) & 0xffff;
-                       s32 b = (rs2 >> (i * 32)) & 0xffff;
+                       s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+                       s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
                        if (a <= b)
-                               rd_val |= 1 << i;
+                               rd_val |= 2 >> i;
                }
                break;
 
@@ -753,17 +753,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
                        s16 b = (rs2 >> (i * 16)) & 0xffff;
 
                        if (a != b)
-                               rd_val |= 1 << i;
+                               rd_val |= 8 >> i;
                }
                break;
 
        case FCMPNE32_OPF:
                for (i = 0; i < 2; i++) {
-                       s32 a = (rs1 >> (i * 32)) & 0xffff;
-                       s32 b = (rs2 >> (i * 32)) & 0xffff;
+                       s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+                       s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
                        if (a != b)
-                               rd_val |= 1 << i;
+                               rd_val |= 2 >> i;
                }
                break;
 
@@ -773,17 +773,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
                        s16 b = (rs2 >> (i * 16)) & 0xffff;
 
                        if (a == b)
-                               rd_val |= 1 << i;
+                               rd_val |= 8 >> i;
                }
                break;
 
        case FCMPEQ32_OPF:
                for (i = 0; i < 2; i++) {
-                       s32 a = (rs1 >> (i * 32)) & 0xffff;
-                       s32 b = (rs2 >> (i * 32)) & 0xffff;
+                       s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+                       s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
                        if (a == b)
-                               rd_val |= 1 << i;
+                               rd_val |= 2 >> i;
                }
                break;
        }
index 34fe657..4d8c497 100644 (file)
@@ -7,40 +7,12 @@
  * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  */
 
-#ifdef __KERNEL__
-
-#define FUNC(x)                                                                                        \
+#define FUNC(x)                \
        .globl  x;              \
        .type   x,@function;    \
-       .align  4;                                                                                      \
+       .align  4;              \
 x:
 
-#undef FASTER_REVERSE
-#undef FASTER_NONALIGNED
-#define FASTER_ALIGNED
-
-/* In kernel these functions don't return a value.
- * One should use macros in asm/string.h for that purpose.
- * We return 0, so that bugs are more apparent.
- */
-#define SETUP_RETL
-#define RETL_INSN      clr     %o0
-
-#else
-
-/* libc */
-
-#include "DEFS.h"
-
-#define FASTER_REVERSE
-#define FASTER_NONALIGNED
-#define FASTER_ALIGNED
-
-#define SETUP_RETL     mov     %o0, %g6
-#define RETL_INSN      mov     %g6, %o0
-
-#endif
-
 /* Both these macros have to start with exactly the same insn */
 #define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
        ldd     [%src + (offset) + 0x00], %t0; \
@@ -164,30 +136,6 @@ x:
        .text
        .align  4
 
-#ifdef FASTER_REVERSE
-
-70:    /* rdword_align */
-
-       andcc           %o1, 1, %g0
-       be              4f
-        andcc          %o1, 2, %g0
-
-       ldub            [%o1 - 1], %g2
-       sub             %o1, 1, %o1
-       stb             %g2, [%o0 - 1]
-       sub             %o2, 1, %o2
-       be              3f
-        sub            %o0, 1, %o0
-4:
-       lduh            [%o1 - 2], %g2
-       sub             %o1, 2, %o1
-       sth             %g2, [%o0 - 2]
-       sub             %o2, 2, %o2
-       b               3f
-        sub            %o0, 2, %o0
-
-#endif /* FASTER_REVERSE */
-
 0:
        retl
         nop            ! Only bcopy returns here and it retuns void...
@@ -198,7 +146,7 @@ FUNC(__memmove)
 #endif
 FUNC(memmove)
        cmp             %o0, %o1
-       SETUP_RETL
+       mov             %o0, %g7
        bleu            9f
         sub            %o0, %o1, %o4
 
@@ -207,8 +155,6 @@ FUNC(memmove)
        bleu            0f
         andcc          %o4, 3, %o5
 
-#ifndef FASTER_REVERSE
-
        add             %o1, %o2, %o1
        add             %o0, %o2, %o0
        sub             %o1, 1, %o1
@@ -224,295 +170,7 @@ FUNC(memmove)
         sub            %o0, 1, %o0
 
        retl
-        RETL_INSN
-
-#else /* FASTER_REVERSE */
-
-       add             %o1, %o2, %o1
-       add             %o0, %o2, %o0
-       bne             77f
-        cmp            %o2, 15
-       bleu            91f
-        andcc          %o1, 3, %g0
-       bne             70b
-3:
-        andcc          %o1, 4, %g0
-
-       be              2f
-        mov            %o2, %g1
-
-       ld              [%o1 - 4], %o4
-       sub             %g1, 4, %g1
-       st              %o4, [%o0 - 4]
-       sub             %o1, 4, %o1
-       sub             %o0, 4, %o0
-2:
-       andcc           %g1, 0xffffff80, %g7
-       be              3f
-        andcc          %o0, 4, %g0
-
-       be              74f + 4
-5:
-       RMOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
-       RMOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
-       RMOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
-       RMOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
-       subcc           %g7, 128, %g7
-       sub             %o1, 128, %o1
-       bne             5b
-        sub            %o0, 128, %o0
-3:
-       andcc           %g1, 0x70, %g7
-       be              72f
-        andcc          %g1, 8, %g0
-
-       sethi           %hi(72f), %o5
-       srl             %g7, 1, %o4
-       add             %g7, %o4, %o4
-       sub             %o1, %g7, %o1
-       sub             %o5, %o4, %o5
-       jmpl            %o5 + %lo(72f), %g0
-        sub            %o0, %g7, %o0
-
-71:    /* rmemcpy_table */
-       RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
-       RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
-       RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
-       RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
-       RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
-       RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
-       RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
-
-72:    /* rmemcpy_table_end */
-
-       be              73f
-        andcc          %g1, 4, %g0
-
-       ldd             [%o1 - 0x08], %g2
-       sub             %o0, 8, %o0
-       sub             %o1, 8, %o1
-       st              %g2, [%o0]
-       st              %g3, [%o0 + 0x04]
-
-73:    /* rmemcpy_last7 */
-
-       be              1f
-        andcc          %g1, 2, %g0
-
-       ld              [%o1 - 4], %g2
-       sub             %o1, 4, %o1
-       st              %g2, [%o0 - 4]
-       sub             %o0, 4, %o0
-1:
-       be              1f
-        andcc          %g1, 1, %g0
-
-       lduh            [%o1 - 2], %g2
-       sub             %o1, 2, %o1
-       sth             %g2, [%o0 - 2]
-       sub             %o0, 2, %o0
-1:
-       be              1f
-        nop
-
-       ldub            [%o1 - 1], %g2
-       stb             %g2, [%o0 - 1]
-1:
-       retl
-        RETL_INSN
-
-74:    /* rldd_std */
-       RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
-       RMOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
-       RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
-       RMOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
-       subcc           %g7, 128, %g7
-       sub             %o1, 128, %o1
-       bne             74b
-        sub            %o0, 128, %o0
-
-       andcc           %g1, 0x70, %g7
-       be              72b
-        andcc          %g1, 8, %g0
-
-       sethi           %hi(72b), %o5
-       srl             %g7, 1, %o4
-       add             %g7, %o4, %o4
-       sub             %o1, %g7, %o1
-       sub             %o5, %o4, %o5
-       jmpl            %o5 + %lo(72b), %g0
-        sub            %o0, %g7, %o0
-
-75:    /* rshort_end */
-
-       and             %o2, 0xe, %o3
-2:
-       sethi           %hi(76f), %o5
-       sll             %o3, 3, %o4
-       sub             %o0, %o3, %o0
-       sub             %o5, %o4, %o5
-       sub             %o1, %o3, %o1
-       jmpl            %o5 + %lo(76f), %g0
-        andcc          %o2, 1, %g0
-
-       RMOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
-       RMOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
-       RMOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
-       RMOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
-       RMOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
-       RMOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
-       RMOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
-
-76:    /* rshort_table_end */
-
-       be              1f
-        nop
-       ldub            [%o1 - 1], %g2
-       stb             %g2, [%o0 - 1]
-1:
-       retl
-        RETL_INSN
-
-91:    /* rshort_aligned_end */
-
-       bne             75b
-        andcc          %o2, 8, %g0
-
-       be              1f
-        andcc          %o2, 4, %g0
-
-       ld              [%o1 - 0x08], %g2
-       ld              [%o1 - 0x04], %g3
-       sub             %o1, 8, %o1
-       st              %g2, [%o0 - 0x08]
-       st              %g3, [%o0 - 0x04]
-       sub             %o0, 8, %o0
-1:
-       b               73b
-        mov            %o2, %g1
-
-77:    /* rnon_aligned */
-       cmp             %o2, 15
-       bleu            75b
-        andcc          %o0, 3, %g0
-       be              64f
-        andcc          %o0, 1, %g0
-       be              63f
-        andcc          %o0, 2, %g0
-       ldub            [%o1 - 1], %g5
-       sub             %o1, 1, %o1
-       stb             %g5, [%o0 - 1]
-       sub             %o0, 1, %o0
-       be              64f
-        sub            %o2, 1, %o2
-63:
-       ldub            [%o1 - 1], %g5
-       sub             %o1, 2, %o1
-       stb             %g5, [%o0 - 1]
-       sub             %o0, 2, %o0
-       ldub            [%o1], %g5
-       sub             %o2, 2, %o2
-       stb             %g5, [%o0]
-64:    
-       and             %o1, 3, %g2
-       and             %o1, -4, %o1
-       and             %o2, 0xc, %g3
-       add             %o1, 4, %o1
-       cmp             %g3, 4
-       sll             %g2, 3, %g4
-       mov             32, %g2
-       be              4f
-        sub            %g2, %g4, %g7
-
-       blu             3f
-        cmp            %g3, 8
-
-       be              2f
-        srl            %o2, 2, %g3
-
-       ld              [%o1 - 4], %o3
-       add             %o0, -8, %o0
-       ld              [%o1 - 8], %o4
-       add             %o1, -16, %o1
-       b               7f
-        add            %g3, 1, %g3
-2:
-       ld              [%o1 - 4], %o4
-       add             %o0, -4, %o0
-       ld              [%o1 - 8], %g1
-       add             %o1, -12, %o1
-       b               8f
-        add            %g3, 2, %g3
-3:
-       ld              [%o1 - 4], %o5
-       add             %o0, -12, %o0
-       ld              [%o1 - 8], %o3
-       add             %o1, -20, %o1
-       b               6f
-        srl            %o2, 2, %g3
-4:
-       ld              [%o1 - 4], %g1
-       srl             %o2, 2, %g3
-       ld              [%o1 - 8], %o5
-       add             %o1, -24, %o1
-       add             %o0, -16, %o0
-       add             %g3, -1, %g3
-
-       ld              [%o1 + 12], %o3
-5:
-       sll             %o5, %g4, %g2
-       srl             %g1, %g7, %g5
-       or              %g2, %g5, %g2
-       st              %g2, [%o0 + 12]
-6:
-       ld              [%o1 + 8], %o4
-       sll             %o3, %g4, %g2
-       srl             %o5, %g7, %g5
-       or              %g2, %g5, %g2
-       st              %g2, [%o0 + 8]
-7:
-       ld              [%o1 + 4], %g1
-       sll             %o4, %g4, %g2
-       srl             %o3, %g7, %g5
-       or              %g2, %g5, %g2
-       st              %g2, [%o0 + 4]
-8:
-       ld              [%o1], %o5
-       sll             %g1, %g4, %g2
-       srl             %o4, %g7, %g5
-       addcc           %g3, -4, %g3
-       or              %g2, %g5, %g2
-       add             %o1, -16, %o1
-       st              %g2, [%o0]
-       add             %o0, -16, %o0
-       bne,a           5b      
-        ld             [%o1 + 12], %o3
-       sll             %o5, %g4, %g2
-       srl             %g1, %g7, %g5
-       srl             %g4, 3, %g3
-       or              %g2, %g5, %g2
-       add             %o1, %g3, %o1
-       andcc           %o2, 2, %g0
-       st              %g2, [%o0 + 12]
-       be              1f
-        andcc          %o2, 1, %g0
-       
-       ldub            [%o1 + 15], %g5
-       add             %o1, -2, %o1
-       stb             %g5, [%o0 + 11]
-       add             %o0, -2, %o0
-       ldub            [%o1 + 16], %g5
-       stb             %g5, [%o0 + 12]
-1:
-       be              1f
-        nop
-       ldub            [%o1 + 15], %g5
-       stb             %g5, [%o0 + 11]
-1:
-       retl
-        RETL_INSN
-
-#endif /* FASTER_REVERSE */
+        mov            %g7, %o0
 
 /* NOTE: This code is executed just for the cases,
          where %src (=%o1) & 3 is != 0.
@@ -546,7 +204,7 @@ FUNC(memmove)
 FUNC(memcpy)   /* %o0=dst %o1=src %o2=len */
 
        sub             %o0, %o1, %o4
-       SETUP_RETL
+       mov             %o0, %g7
 9:
        andcc           %o4, 3, %o5
 0:
@@ -569,7 +227,7 @@ FUNC(memcpy)        /* %o0=dst %o1=src %o2=len */
        add             %o1, 4, %o1
        add             %o0, 4, %o0
 2:
-       andcc           %g1, 0xffffff80, %g7
+       andcc           %g1, 0xffffff80, %g0
        be              3f
         andcc          %o0, 4, %g0
 
@@ -579,22 +237,23 @@ FUNC(memcpy)      /* %o0=dst %o1=src %o2=len */
        MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
        MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
        MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
-       subcc           %g7, 128, %g7
+       sub             %g1, 128, %g1
        add             %o1, 128, %o1
-       bne             5b
+       cmp             %g1, 128
+       bge             5b
         add            %o0, 128, %o0
 3:
-       andcc           %g1, 0x70, %g7
+       andcc           %g1, 0x70, %g4
        be              80f
         andcc          %g1, 8, %g0
 
        sethi           %hi(80f), %o5
-       srl             %g7, 1, %o4
-       add             %g7, %o4, %o4
-       add             %o1, %g7, %o1
+       srl             %g4, 1, %o4
+       add             %g4, %o4, %o4
+       add             %o1, %g4, %o1
        sub             %o5, %o4, %o5
        jmpl            %o5 + %lo(80f), %g0
-        add            %o0, %g7, %o0
+        add            %o0, %g4, %o0
 
 79:    /* memcpy_table */
 
@@ -641,43 +300,28 @@ FUNC(memcpy)      /* %o0=dst %o1=src %o2=len */
        stb             %g2, [%o0]
 1:
        retl
-        RETL_INSN
+        mov            %g7, %o0
 
 82:    /* ldd_std */
        MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
        MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
        MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
        MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
-       subcc           %g7, 128, %g7
+       subcc           %g1, 128, %g1
        add             %o1, 128, %o1
-       bne             82b
+       cmp             %g1, 128
+       bge             82b
         add            %o0, 128, %o0
 
-#ifndef FASTER_ALIGNED
-
-       andcc           %g1, 0x70, %g7
-       be              80b
-        andcc          %g1, 8, %g0
-
-       sethi           %hi(80b), %o5
-       srl             %g7, 1, %o4
-       add             %g7, %o4, %o4
-       add             %o1, %g7, %o1
-       sub             %o5, %o4, %o5
-       jmpl            %o5 + %lo(80b), %g0
-        add            %o0, %g7, %o0
-
-#else /* FASTER_ALIGNED */
-
-       andcc           %g1, 0x70, %g7
+       andcc           %g1, 0x70, %g4
        be              84f
         andcc          %g1, 8, %g0
 
        sethi           %hi(84f), %o5
-       add             %o1, %g7, %o1
-       sub             %o5, %g7, %o5
+       add             %o1, %g4, %o1
+       sub             %o5, %g4, %o5
        jmpl            %o5 + %lo(84f), %g0
-        add            %o0, %g7, %o0
+        add            %o0, %g4, %o0
 
 83:    /* amemcpy_table */
 
@@ -721,382 +365,132 @@ FUNC(memcpy)    /* %o0=dst %o1=src %o2=len */
        stb             %g2, [%o0]
 1:
        retl
-        RETL_INSN
-
-#endif /* FASTER_ALIGNED */
+        mov            %g7, %o0
 
 86:    /* non_aligned */
        cmp             %o2, 6
        bleu            88f
+        nop
 
-#ifdef FASTER_NONALIGNED
-
-        cmp            %o2, 256
-       bcc             87f
-
-#endif /* FASTER_NONALIGNED */
-
-        andcc          %o0, 3, %g0
+       save            %sp, -96, %sp
+       andcc           %i0, 3, %g0
        be              61f
-        andcc          %o0, 1, %g0
+        andcc          %i0, 1, %g0
        be              60f
-        andcc          %o0, 2, %g0
+        andcc          %i0, 2, %g0
 
-       ldub            [%o1], %g5
-       add             %o1, 1, %o1
-       stb             %g5, [%o0]
-       sub             %o2, 1, %o2
+       ldub            [%i1], %g5
+       add             %i1, 1, %i1
+       stb             %g5, [%i0]
+       sub             %i2, 1, %i2
        bne             61f
-        add            %o0, 1, %o0
+        add            %i0, 1, %i0
 60:
-       ldub            [%o1], %g3
-       add             %o1, 2, %o1
-       stb             %g3, [%o0]
-       sub             %o2, 2, %o2
-       ldub            [%o1 - 1], %g3
-       add             %o0, 2, %o0
-       stb             %g3, [%o0 - 1]
+       ldub            [%i1], %g3
+       add             %i1, 2, %i1
+       stb             %g3, [%i0]
+       sub             %i2, 2, %i2
+       ldub            [%i1 - 1], %g3
+       add             %i0, 2, %i0
+       stb             %g3, [%i0 - 1]
 61:
-       and             %o1, 3, %g2
-       and             %o2, 0xc, %g3
-       and             %o1, -4, %o1
+       and             %i1, 3, %g2
+       and             %i2, 0xc, %g3
+       and             %i1, -4, %i1
        cmp             %g3, 4
        sll             %g2, 3, %g4
        mov             32, %g2
        be              4f
-        sub            %g2, %g4, %g7
+        sub            %g2, %g4, %l0
        
        blu             3f
         cmp            %g3, 0x8
 
        be              2f
-        srl            %o2, 2, %g3
+        srl            %i2, 2, %g3
 
-       ld              [%o1], %o3
-       add             %o0, -8, %o0
-       ld              [%o1 + 4], %o4
+       ld              [%i1], %i3
+       add             %i0, -8, %i0
+       ld              [%i1 + 4], %i4
        b               8f
         add            %g3, 1, %g3
 2:
-       ld              [%o1], %o4
-       add             %o0, -12, %o0
-       ld              [%o1 + 4], %o5
+       ld              [%i1], %i4
+       add             %i0, -12, %i0
+       ld              [%i1 + 4], %i5
        add             %g3, 2, %g3
        b               9f
-        add            %o1, -4, %o1
+        add            %i1, -4, %i1
 3:
-       ld              [%o1], %g1
-       add             %o0, -4, %o0
-       ld              [%o1 + 4], %o3
-       srl             %o2, 2, %g3
+       ld              [%i1], %g1
+       add             %i0, -4, %i0
+       ld              [%i1 + 4], %i3
+       srl             %i2, 2, %g3
        b               7f
-        add            %o1, 4, %o1
+        add            %i1, 4, %i1
 4:
-       ld              [%o1], %o5
-       cmp             %o2, 7
-       ld              [%o1 + 4], %g1
-       srl             %o2, 2, %g3
+       ld              [%i1], %i5
+       cmp             %i2, 7
+       ld              [%i1 + 4], %g1
+       srl             %i2, 2, %g3
        bleu            10f
-        add            %o1, 8, %o1
+        add            %i1, 8, %i1
 
-       ld              [%o1], %o3
+       ld              [%i1], %i3
        add             %g3, -1, %g3
 5:
-       sll             %o5, %g4, %g2
-       srl             %g1, %g7, %g5
+       sll             %i5, %g4, %g2
+       srl             %g1, %l0, %g5
        or              %g2, %g5, %g2
-       st              %g2, [%o0]
+       st              %g2, [%i0]
 7:
-       ld              [%o1 + 4], %o4
+       ld              [%i1 + 4], %i4
        sll             %g1, %g4, %g2
-       srl             %o3, %g7, %g5
+       srl             %i3, %l0, %g5
        or              %g2, %g5, %g2
-       st              %g2, [%o0 + 4]
+       st              %g2, [%i0 + 4]
 8:
-       ld              [%o1 + 8], %o5
-       sll             %o3, %g4, %g2
-       srl             %o4, %g7, %g5
+       ld              [%i1 + 8], %i5
+       sll             %i3, %g4, %g2
+       srl             %i4, %l0, %g5
        or              %g2, %g5, %g2
-       st              %g2, [%o0 + 8]
+       st              %g2, [%i0 + 8]
 9:
-       ld              [%o1 + 12], %g1
-       sll             %o4, %g4, %g2
-       srl             %o5, %g7, %g5
+       ld              [%i1 + 12], %g1
+       sll             %i4, %g4, %g2
+       srl             %i5, %l0, %g5
        addcc           %g3, -4, %g3
        or              %g2, %g5, %g2
-       add             %o1, 16, %o1
-       st              %g2, [%o0 + 12]
-       add             %o0, 16, %o0
+       add             %i1, 16, %i1
+       st              %g2, [%i0 + 12]
+       add             %i0, 16, %i0
        bne,a           5b
-        ld             [%o1], %o3
+        ld             [%i1], %i3
 10:
-       sll             %o5, %g4, %g2
-       srl             %g1, %g7, %g5
-       srl             %g7, 3, %g3
+       sll             %i5, %g4, %g2
+       srl             %g1, %l0, %g5
+       srl             %l0, 3, %g3
        or              %g2, %g5, %g2
-       sub             %o1, %g3, %o1
-       andcc           %o2, 2, %g0
-       st              %g2, [%o0]
+       sub             %i1, %g3, %i1
+       andcc           %i2, 2, %g0
+       st              %g2, [%i0]
        be              1f
-        andcc          %o2, 1, %g0
-
-       ldub            [%o1], %g2
-       add             %o1, 2, %o1
-       stb             %g2, [%o0 + 4]
-       add             %o0, 2, %o0
-       ldub            [%o1 - 1], %g2
-       stb             %g2, [%o0 + 3]
+        andcc          %i2, 1, %g0
+
+       ldub            [%i1], %g2
+       add             %i1, 2, %i1
+       stb             %g2, [%i0 + 4]
+       add             %i0, 2, %i0
+       ldub            [%i1 - 1], %g2
+       stb             %g2, [%i0 + 3]
 1:
        be              1f
         nop
-       ldub            [%o1], %g2
-       stb             %g2, [%o0 + 4]
-1:
-       retl
-        RETL_INSN
-
-#ifdef FASTER_NONALIGNED
-
-87:    /* faster_nonaligned */
-
-       andcc           %o1, 3, %g0
-       be              3f
-        andcc          %o1, 1, %g0
-
-       be              4f
-        andcc          %o1, 2, %g0
-
-       ldub            [%o1], %g2
-       add             %o1, 1, %o1
-       stb             %g2, [%o0]
-       sub             %o2, 1, %o2
-       bne             3f
-        add            %o0, 1, %o0
-4:
-       lduh            [%o1], %g2
-       add             %o1, 2, %o1
-       srl             %g2, 8, %g3
-       sub             %o2, 2, %o2
-       stb             %g3, [%o0]
-       add             %o0, 2, %o0
-       stb             %g2, [%o0 - 1]
-3:
-        andcc          %o1, 4, %g0
-
-       bne             2f
-        cmp            %o5, 1
-
-       ld              [%o1], %o4
-       srl             %o4, 24, %g2
-       stb             %g2, [%o0]
-       srl             %o4, 16, %g3
-       stb             %g3, [%o0 + 1]
-       srl             %o4, 8, %g2
-       stb             %g2, [%o0 + 2]
-       sub             %o2, 4, %o2
-       stb             %o4, [%o0 + 3]
-       add             %o1, 4, %o1
-       add             %o0, 4, %o0
-2:
-       be              33f
-        cmp            %o5, 2
-       be              32f
-        sub            %o2, 4, %o2
-31:
-       ld              [%o1], %g2
-       add             %o1, 4, %o1
-       srl             %g2, 24, %g3
-       and             %o0, 7, %g5
-       stb             %g3, [%o0]
-       cmp             %g5, 7
-       sll             %g2, 8, %g1
-       add             %o0, 4, %o0
-       be              41f
-        and            %o2, 0xffffffc0, %o3
-       ld              [%o0 - 7], %o4
-4:
-       SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       subcc           %o3, 64, %o3
-       add             %o1, 64, %o1
-       bne             4b
-        add            %o0, 64, %o0
-
-       andcc           %o2, 0x30, %o3
-       be,a            1f
-        srl            %g1, 16, %g2
-4:
-       SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       subcc           %o3, 16, %o3
-       add             %o1, 16, %o1
-       bne             4b
-        add            %o0, 16, %o0
-
-       srl             %g1, 16, %g2
-1:
-       st              %o4, [%o0 - 7]
-       sth             %g2, [%o0 - 3]
-       srl             %g1, 8, %g4
-       b               88f
-        stb            %g4, [%o0 - 1]
-32:
-       ld              [%o1], %g2
-       add             %o1, 4, %o1
-       srl             %g2, 16, %g3
-       and             %o0, 7, %g5
-       sth             %g3, [%o0]
-       cmp             %g5, 6
-       sll             %g2, 16, %g1
-       add             %o0, 4, %o0
-       be              42f
-        and            %o2, 0xffffffc0, %o3
-       ld              [%o0 - 6], %o4
-4:
-       SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       subcc           %o3, 64, %o3
-       add             %o1, 64, %o1
-       bne             4b
-        add            %o0, 64, %o0
-
-       andcc           %o2, 0x30, %o3
-       be,a            1f
-        srl            %g1, 16, %g2
-4:
-       SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       subcc           %o3, 16, %o3
-       add             %o1, 16, %o1
-       bne             4b
-        add            %o0, 16, %o0
-
-       srl             %g1, 16, %g2
-1:
-       st              %o4, [%o0 - 6]
-       b               88f
-        sth            %g2, [%o0 - 2]
-33:
-       ld              [%o1], %g2
-       sub             %o2, 4, %o2
-       srl             %g2, 24, %g3
-       and             %o0, 7, %g5
-       stb             %g3, [%o0]
-       cmp             %g5, 5
-       srl             %g2, 8, %g4
-       sll             %g2, 24, %g1
-       sth             %g4, [%o0 + 1]
-       add             %o1, 4, %o1
-       be              43f
-        and            %o2, 0xffffffc0, %o3
-
-       ld              [%o0 - 1], %o4
-       add             %o0, 4, %o0
-4:
-       SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
-       SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
-       SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
-       SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
-       subcc           %o3, 64, %o3
-       add             %o1, 64, %o1
-       bne             4b
-        add            %o0, 64, %o0
-
-       andcc           %o2, 0x30, %o3
-       be,a            1f
-        srl            %g1, 24, %g2
-4:
-       SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
-       subcc           %o3, 16, %o3
-       add             %o1, 16, %o1
-       bne             4b
-        add            %o0, 16, %o0
-
-       srl             %g1, 24, %g2
-1:
-       st              %o4, [%o0 - 5]
-       b               88f
-        stb            %g2, [%o0 - 1]
-41:
-       SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       subcc           %o3, 64, %o3
-       add             %o1, 64, %o1
-       bne             41b
-        add            %o0, 64, %o0
-        
-       andcc           %o2, 0x30, %o3
-       be,a            1f
-        srl            %g1, 16, %g2
-4:
-       SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
-       subcc           %o3, 16, %o3
-       add             %o1, 16, %o1
-       bne             4b
-        add            %o0, 16, %o0
-
-       srl             %g1, 16, %g2
+       ldub            [%i1], %g2
+       stb             %g2, [%i0 + 4]
 1:
-       sth             %g2, [%o0 - 3]
-       srl             %g1, 8, %g4
-       b               88f
-        stb            %g4, [%o0 - 1]
-43:
-       SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
-       subcc           %o3, 64, %o3
-       add             %o1, 64, %o1
-       bne             43b
-        add            %o0, 64, %o0
-
-       andcc           %o2, 0x30, %o3
-       be,a            1f
-        srl            %g1, 24, %g2
-4:
-       SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
-       subcc           %o3, 16, %o3
-       add             %o1, 16, %o1
-       bne             4b
-        add            %o0, 16, %o0
-
-       srl             %g1, 24, %g2
-1:
-       stb             %g2, [%o0 + 3]
-       b               88f
-        add            %o0, 4, %o0
-42:
-       SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       subcc           %o3, 64, %o3
-       add             %o1, 64, %o1
-       bne             42b
-        add            %o0, 64, %o0
-        
-       andcc           %o2, 0x30, %o3
-       be,a            1f
-        srl            %g1, 16, %g2
-4:
-       SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
-       subcc           %o3, 16, %o3
-       add             %o1, 16, %o1
-       bne             4b
-        add            %o0, 16, %o0
-
-       srl             %g1, 16, %g2
-1:
-       sth             %g2, [%o0 - 2]
-
-       /* Fall through */
-        
-#endif /* FASTER_NONALIGNED */
+       ret
+        restore        %g7, %g0, %o0
 
 88:    /* short_end */
 
@@ -1127,7 +521,7 @@ FUNC(memcpy)       /* %o0=dst %o1=src %o2=len */
        stb             %g2, [%o0]
 1:
        retl
-        RETL_INSN
+        mov            %g7, %o0
 
 90:    /* short_aligned_end */
        bne             88b