⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csumpartial.s

📁 上传linux-jx2410的源代码
💻 S
字号:
/* *  linux/arch/arm/lib/csumpartial.S * *  Copyright (C) 1995-1998 Russell King * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */#include <linux/linkage.h>#include <asm/assembler.h>		.text/* * Function: __u32 csum_partial(const char *src, int len, __u32 sum) * Params  : r0 = buffer, r1 = len, r2 = checksum * Returns : r0 = new checksum */buf	.req	r0len	.req	r1sum	.req	r2td0	.req	r3td1	.req	r4	@ save before usetd2	.req	r5	@ save before usetd3	.req	lr.zero:		mov	r0, sum		add	sp, sp, #4		ldr	pc, [sp], #4		/*		 * Handle 0 to 7 bytes, with any alignment of source and		 * destination pointers.  Note that when we get here, C = 0		 */.less8:		teq	len, #0			@ check for zero count		beq	.zero		/* we must have at least one byte. */		tst	buf, #1			@ odd address?		ldrneb	td0, [buf], #1		subne	len, len, #1		adcnes	sum, sum, td0, lsl #8.less4:		tst	len, #6		beq	.less8_byte		/* we are now half-word aligned */.less8_wordlp:#ifdef __ARM_ARCH_4__		ldrh	td0, [buf], #2		sub	len, len, #2#else		ldrb	td0, [buf], #1		ldrb	td3, [buf], #1		sub	len, len, #2		orr	td0, td0, td3, lsl #8#endif		adcs	sum, sum, td0		tst	len, #6		bne	.less8_wordlp.less8_byte:	tst	len, #1			@ odd number of bytes		ldrneb	td0, [buf], #1		@ include last byte		adcnes	sum, sum, td0		@ update checksum.done:		adc	r0, sum, #0		@ collect up the last carry		ldr	td0, [sp], #4		tst	td0, #1			@ check buffer alignment		movne	td0, r0, lsl #8		@ rotate checksum by 8 bits		orrne	r0, td0, r0, lsr #24		ldr	pc, [sp], #4		@ return.not_aligned:	tst	buf, #1			@ odd address		ldrneb	td0, [buf], #1		@ make even		subne	len, len, #1		adcnes	sum, sum, td0, lsl #8	@ update checksum		tst	buf, #2			@ 32-bit aligned?#ifdef __ARM_ARCH_4__		ldrneh	td0, [buf], #2		@ make 32-bit aligned		subne	len, len, #2#else		ldrneb	td0, [buf], #1		ldrneb	ip, [buf], #1		subne	len, len, #2		orrne	td0, td0, ip, lsl #8#endif		adcnes	sum, sum, td0		@ update checksum		mov	pc, lrENTRY(csum_partial)		stmfd	sp!, {buf, lr}		cmp	len, #8			@ Ensure that we have at least		blo	.less8			@ 8 bytes to copy.		adds	sum, sum, #0		@ C = 0		tst	buf, #3			@ Test destination alignment		blne	.not_aligned		@ aligh destination, return here1:		bics	ip, len, #31		beq	3f		stmfd	sp!, {r4 - r5}2:		ldmia	buf!, {td0, td1, td2, td3}		adcs	sum, sum, td0		adcs	sum, sum, td1		adcs	sum, sum, td2		adcs	sum, sum, td3		ldmia	buf!, {td0, td1, td2, td3}		adcs	sum, sum, td0		adcs	sum, sum, td1		adcs	sum, sum, td2		adcs	sum, sum, td3		sub	ip, ip, #32		teq	ip, #0		bne	2b		ldmfd	sp!, {r4 - r5}3:		tst	len, #0x1c		@ should not change C		beq	.less44:		ldr	td0, [buf], #4		sub	len, len, #4		adcs	sum, sum, td0		tst	len, #0x1c		bne	4b		b	.less4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -