aboutsummaryrefslogtreecommitdiff
path: root/arch/metag/lib/ip_fast_csum.S
blob: 533b1e73deac657bec31f5907566ab995939e65c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

	.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