33 lines
719 B
ArmAsm
33 lines
719 B
ArmAsm
|
|
||
|
.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
|