[IA64] tidy up return value of ip_fast_csum
[linux-3.10.git] / arch / ia64 / lib / ip_fast_csum.S
index 19674ca..1f86aeb 100644 (file)
@@ -8,8 +8,8 @@
  *      in0: address of buffer to checksum (char *)
  *      in1: length of the buffer (int)
  *
- * Copyright (C) 2002 Intel Corp.
- * Copyright (C) 2002 Ken Chen <kenneth.w.chen@intel.com>
+ * Copyright (C) 2002, 2006 Intel Corp.
+ * Copyright (C) 2002, 2006 Ken Chen <kenneth.w.chen@intel.com>
  */
 
 #include <asm/asmmacro.h>
@@ -25,6 +25,9 @@
 
 #define in0    r32
 #define in1    r33
+#define in2    r34
+#define in3    r35
+#define in4    r36
 #define ret0   r8
 
 GLOBAL_ENTRY(ip_fast_csum)
@@ -65,8 +68,9 @@ GLOBAL_ENTRY(ip_fast_csum)
        zxt2    r20=r20
        ;;
        add     r20=ret0,r20
+       mov     r9=0xffff
        ;;
-       andcm   ret0=-1,r20
+       andcm   ret0=r9,r20
        .restore sp             // reset frame state
        br.ret.sptk.many b0
        ;;
@@ -88,3 +92,51 @@ GLOBAL_ENTRY(ip_fast_csum)
        mov     b0=r34
        br.ret.sptk.many b0
 END(ip_fast_csum)
+
+GLOBAL_ENTRY(csum_ipv6_magic)
+       ld4     r20=[in0],4
+       ld4     r21=[in1],4
+       dep     r15=in3,in2,32,16
+       ;;
+       ld4     r22=[in0],4
+       ld4     r23=[in1],4
+       mux1    r15=r15,@rev
+       ;;
+       ld4     r24=[in0],4
+       ld4     r25=[in1],4
+       shr.u   r15=r15,16
+       add     r16=r20,r21
+       add     r17=r22,r23
+       ;;
+       ld4     r26=[in0],4
+       ld4     r27=[in1],4
+       add     r18=r24,r25
+       add     r8=r16,r17
+       ;;
+       add     r19=r26,r27
+       add     r8=r8,r18
+       ;;
+       add     r8=r8,r19
+       add     r15=r15,in4
+       ;;
+       add     r8=r8,r15
+       ;;
+       shr.u   r10=r8,32       // now fold sum into short
+       zxt4    r11=r8
+       ;;
+       add     r8=r10,r11
+       ;;
+       shr.u   r10=r8,16       // yeah, keep it rolling
+       zxt2    r11=r8
+       ;;
+       add     r8=r10,r11
+       ;;
+       shr.u   r10=r8,16       // three times lucky
+       zxt2    r11=r8
+       ;;
+       add     r8=r10,r11
+       mov     r9=0xffff
+       ;;
+       andcm   r8=r9,r8
+       br.ret.sptk.many b0
+END(csum_ipv6_magic)