/* SPDX-License-Identifier: GPL-2.0 */ /* * Contributed by Richard Henderson * * 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 */ #include .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)