blob: 533b1e73deac657bec31f5907566ab995939e65c [file] [log] [blame]
.text
/*
* This is a version of ip_compute_csum() optimized for IP headers,
* which always checksum on 4 octet boundaries.
*
* extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
*
*/
.global _ip_fast_csum
.type _ip_fast_csum,function
_ip_fast_csum:
!! TXRPT needs loops - 1
SUBS TXRPT,D0Ar2,#1
MOV D0Re0,#0
BLO $Lfast_csum_exit
$Lfast_csum_loop:
GETD D1Ar3,[D1Ar1++]
ADDS D0Re0,D0Re0,D1Ar3
ADDCS D0Re0,D0Re0,#1
BR $Lfast_csum_loop
LSR D0Ar4,D0Re0,#16
AND D0Re0,D0Re0,#0xffff
AND D0Ar4,D0Ar4,#0xffff
ADD D0Re0,D0Re0,D0Ar4
LSR D0Ar4,D0Re0,#16
ADD D0Re0,D0Re0,D0Ar4
XOR D0Re0,D0Re0,#-1
AND D0Re0,D0Re0,#0xffff
$Lfast_csum_exit:
MOV PC,D1RtP
.size _ip_fast_csum,.-_ip_fast_csum