blob: 755e1c13cb25ee04ecab64651080ef6d4e905781 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Contributed by Richard Henderson <rth@tamu.edu>
*
* unsigned short csum_ipv6_magic(struct in6_addr *saddr,
* struct in6_addr *daddr, __u32 len,
* unsigned short proto, unsigned int csum);
*
* Misalignment handling (which costs 16 instructions / 8 cycles)
* added by Ivan Kokshaysky <ink@jurassic.park.msu.ru>
*/
#include <asm/export.h>
.globl csum_ipv6_magic
.align 4
.ent csum_ipv6_magic
.frame $30, 0, $26, 0
csum_ipv6_magic:
.prologue 0
ldl_u $0, 0($16)
zapnot $20, 15, $20
exthl $18, 1, $4
ldl_u $21, 7($16)
extlb $18, 1, $5
ldl_u $1, 8($16)
extlb $18, 2, $6
ldl_u $22, 15($16)
extlb $18, 3, $18
ldl_u $2, 0($17)
sra $4, 32, $4
ldl_u $23, 7($17)
extll $0, $16, $0
ldl_u $3, 8($17)
exthl $21, $16, $21
ldl_u $24, 15($17)
sll $5, 16, $5
or $0, $21, $0
extll $1, $16, $1
addl $20, $0, $20
exthl $22, $16, $22
cmpult $20, $0, $0
sll $6, 8, $6
or $1, $22, $1
extll $2, $17, $2
or $4, $18, $18
exthl $23, $17, $23
or $5, $6, $5
extll $3, $17, $3
or $2, $23, $2
exthl $24, $17, $24
or $18, $5, $18
exthh $19, 7, $7
or $3, $24, $3
extlb $19, 1, $19
addl $20, $1, $20
or $19, $7, $19
cmpult $20, $1, $1
sll $19, 48, $19
sra $19, 32, $19
addl $20, $2, $20
cmpult $20, $2, $2
addl $20, $3, $20
cmpult $20, $3, $3
addl $20, $18, $20
cmpult $20, $18, $18
addl $20, $19, $20
cmpult $20, $19, $19
addl $0, $1, $0
addl $2, $3, $2
addl $18, $19, $18
addl $0, $2, $0
addl $20, $18, $20
addl $0, $20, $0
unop
extlh $0, 2, $2
zapnot $0, 3, $3
extlh $0, 4, $1
addl $2, $3, $3
extlh $0, 6, $0
addl $3, $1, $3
addl $0, $3, $0
unop
extlh $0, 2, $1
zapnot $0, 3, $0
addl $0, $1, $0
unop
extlh $0, 2, $1
zapnot $0, 3, $0
addl $0, $1, $0
not $0, $0
zapnot $0, 3, $0
ret
.end csum_ipv6_magic
EXPORT_SYMBOL(csum_ipv6_magic)