fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / ia64 / lib / memcpy_mck.S
index b1f806a..ab0f876 100644 (file)
@@ -6,26 +6,18 @@
  *     in1:    source address
  *     in2:    number of bytes to copy
  * Output:
- *     0 if success, or number of byte NOT copied if error occurred.
+ *     for memcpy:    return dest
+ *     for copy_user: return 0 if success,
+ *                    or number of byte NOT copied if error occurred.
  *
  * Copyright (C) 2002 Intel Corp.
  * Copyright (C) 2002 Ken Chen <kenneth.w.chen@intel.com>
  */
-#include <linux/config.h>
 #include <asm/asmmacro.h>
 #include <asm/page.h>
 
 #define EK(y...) EX(y)
 
-GLOBAL_ENTRY(bcopy)
-       .regstk 3,0,0,0
-       mov r8=in0
-       mov in0=in1
-       ;;
-       mov in1=r8
-       ;;
-END(bcopy)
-
 /* McKinley specific optimization */
 
 #define retval         r8
@@ -82,8 +74,10 @@ GLOBAL_ENTRY(memcpy)
        and     r28=0x7,in0
        and     r29=0x7,in1
        mov     f6=f0
+       mov     retval=in0
        br.cond.sptk .common_code
        ;;
+END(memcpy)
 GLOBAL_ENTRY(__copy_user)
        .prologue
 // check dest alignment
@@ -92,7 +86,7 @@ GLOBAL_ENTRY(__copy_user)
        mov     f6=f1
        mov     saved_in0=in0   // save dest pointer
        mov     saved_in1=in1   // save src pointer
-       mov     saved_in2=in2   // save len
+       mov     retval=r0       // initialize return value
        ;;
 .common_code:
        cmp.gt  p15,p0=8,in2    // check for small size
@@ -100,7 +94,7 @@ GLOBAL_ENTRY(__copy_user)
        cmp.ne  p14,p0=0,r29    // check src alignment
        add     src0=0,in1
        sub     r30=8,r28       // for .align_dest
-       mov     retval=r0       // initialize return value
+       mov     saved_in2=in2   // save len
        ;;
        add     dst0=0,in0
        add     dst1=1,in0      // dest odd index
@@ -309,7 +303,7 @@ EK(.ex_handler,     (p[D])  st8 [dst1] = t15, 4*8)
        add     src_pre_mem=0,src0      // prefetch src pointer
        add     dst_pre_mem=0,dst0      // prefetch dest pointer
        and     src0=-8,src0            // 1st src pointer
-(p7)   mov     ar.lc = r21
+(p7)   mov     ar.lc = cnt
 (p8)   mov     ar.lc = r0
        ;;
        TEXT_ALIGN(32)
@@ -533,7 +527,6 @@ EK(.ex_handler,  (p17)      st8     [dst1]=r39,8);                                          \
 #undef B
 #undef C
 #undef D
-END(memcpy)
 
 /*
  * Due to lack of local tag support in gcc 2.x assembler, it is not clear which
@@ -634,8 +627,11 @@ END(memcpy)
        clrrrb
        ;;
        alloc   saved_pfs_stack=ar.pfs,3,3,3,0
+       cmp.lt  p8,p0=A,r0
        sub     B = dst0, saved_in0     // how many byte copied so far
        ;;
+(p8)   mov     A = 0;                  // A shouldn't be negative, cap it
+       ;;
        sub     C = A, B
        sub     D = saved_in2, A
        ;;