findbit.s

来自「linux 内核源代码」· S 代码 · 共 156 行

S
156
字号
/* * Copyright (C) 2006 Atmel Corporation * * 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>	.text	/*	 * unsigned long find_first_zero_bit(const unsigned long *addr,	 *				     unsigned long size)	 */ENTRY(find_first_zero_bit)	cp.w	r11, 0	reteq	r11	mov	r9, r111:	ld.w	r8, r12[0]	com	r8	brne	.L_found	sub	r12, -4	sub	r9, 32	brgt	1b	retal	r11	/*	 * unsigned long find_next_zero_bit(const unsigned long *addr,	 *				    unsigned long size,	 *				    unsigned long offset)	 */ENTRY(find_next_zero_bit)	lsr	r8, r10, 5	sub	r9, r11, r10	retle	r11	lsl	r8, 2	add	r12, r8	andl	r10, 31, COH	breq	1f	/* offset is not word-aligned. Handle the first (32 - r10) bits */	ld.w	r8, r12[0]	com	r8	sub	r12, -4	lsr	r8, r8, r10	brne	.L_found	/* r9 = r9 - (32 - r10) = r9 + r10 - 32 */	add	r9, r10	sub	r9, 32	retle	r11	/* Main loop. offset must be word-aligned */1:	ld.w	r8, r12[0]	com	r8	brne	.L_found	sub	r12, -4	sub	r9, 32	brgt	1b	retal	r11	/* Common return path for when a bit is actually found. */.L_found:	brev	r8	clz	r10, r8	rsub	r9, r11	add	r10, r9	/* XXX: If we don't have to return exactly "size" when the bit	   is not found, we may drop this "min" thing */	min	r12, r11, r10	retal	r12	/*	 * unsigned long find_first_bit(const unsigned long *addr,	 *				unsigned long size)	 */ENTRY(find_first_bit)	cp.w	r11, 0	reteq	r11	mov	r9, r111:	ld.w	r8, r12[0]	cp.w	r8, 0	brne	.L_found	sub	r12, -4	sub	r9, 32	brgt	1b	retal	r11	/*	 * unsigned long find_next_bit(const unsigned long *addr,	 *			       unsigned long size,	 *			       unsigned long offset)	 */ENTRY(find_next_bit)	lsr	r8, r10, 5	sub	r9, r11, r10	retle	r11	lsl	r8, 2	add	r12, r8	andl	r10, 31, COH	breq	1f	/* offset is not word-aligned. Handle the first (32 - r10) bits */	ld.w	r8, r12[0]	sub	r12, -4	lsr	r8, r8, r10	brne	.L_found	/* r9 = r9 - (32 - r10) = r9 + r10 - 32 */	add	r9, r10	sub	r9, 32	retle	r11	/* Main loop. offset must be word-aligned */1:	ld.w	r8, r12[0]	cp.w	r8, 0	brne	.L_found	sub	r12, -4	sub	r9, 32	brgt	1b	retal	r11ENTRY(generic_find_next_zero_le_bit)	lsr	r8, r10, 5	sub	r9, r11, r10	retle	r11	lsl	r8, 2	add	r12, r8	andl	r10, 31, COH	breq	1f	/* offset is not word-aligned. Handle the first (32 - r10) bits */	ldswp.w	r8, r12[0]	sub	r12, -4	com	r8	lsr	r8, r8, r10	brne	.L_found	/* r9 = r9 - (32 - r10) = r9 + r10 - 32 */	add	r9, r10	sub	r9, 32	retle	r11	/* Main loop. offset must be word-aligned */1:	ldswp.w	r8, r12[0]	com	r8	brne	.L_found	sub	r12, -4	sub	r9, 32	brgt	1b	retal	r11

⌨️ 快捷键说明

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