MERGE-master-patchset-edits
[linux-2.6/openmoko-kernel.git] / arch / avr32 / lib / csum_partial.S
blob6a262b528eb72ae6bf4bf09d267e4480751c8869
1 /*
2  * Copyright (C) 2004-2006 Atmel Corporation
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
9         /*
10          * unsigned int csum_partial(const unsigned char *buff,
11          *                           int len, unsigned int sum)
12          */
13         .text
14         .global csum_partial
15         .type   csum_partial,"function"
16         .align  1
17 csum_partial:
18         /* checksum complete words, aligned or not */
19 3:      sub     r11, 4
20         brlt    5f
21 4:      ld.w    r9, r12++
22         add     r10, r9
23         acr     r10
24         sub     r11, 4
25         brge    4b
27         /* return if we had a whole number of words */
28 5:      sub     r11, -4
29         reteq   r10
31         /* checksum any remaining bytes at the end */
32         mov     r9, 0
33         mov     r8, 0
34         cp      r11, 2
35         brlt    6f
36         ld.uh   r9, r12++
37         sub     r11, 2
38         breq    7f
39         lsl     r9, 16
40 6:      ld.ub   r8, r12++
41         lsl     r8, 8
42 7:      or      r9, r8
43         add     r10, r9
44         acr     r10
46         retal   r10
47         .size   csum_partial, . - csum_partial