arch/openrisc/lib/memset.S

Source file repositories/reference/linux-study-clean/arch/openrisc/lib/memset.S

File Facts

System
Linux kernel
Corpus path
arch/openrisc/lib/memset.S
Extension
.S
Size
2118 bytes
Lines
95
Domain
Architecture Layer
Bucket
arch/openrisc
Inferred role
Architecture Layer: arch/openrisc
Status
atlas-only

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

.global memset
	.type	memset, @function
memset:
	/* arguments:
	 * r3 = *s
	 * r4 = c
	 * r5 = n
	 * r13, r15, r17, r19 used as temp regs
	*/

	/* Exit if n == 0 */
	l.sfeqi		r5, 0
	l.bf		4f

	/* Truncate c to char */
	l.andi  	r13, r4, 0xff

	/* Skip word extension if c is 0 */
	l.sfeqi		r13, 0
	l.bf		1f
	/* Check for at least two whole words (8 bytes) */
	 l.sfleui	r5, 7

	/* Extend char c to 32-bit word cccc in r13 */
	l.slli		r15, r13, 16  // r13 = 000c, r15 = 0c00
	l.or		r13, r13, r15 // r13 = 0c0c, r15 = 0c00
	l.slli		r15, r13, 8   // r13 = 0c0c, r15 = c0c0
	l.or		r13, r13, r15 // r13 = cccc, r15 = c0c0

1:	l.addi		r19, r3, 0 // Set r19 = src
	/* Jump to byte copy loop if less than two words */
	l.bf		3f
	 l.or		r17, r5, r0 // Set r17 = n

	/* Mask out two LSBs to check alignment */
	l.andi		r15, r3, 0x3

	/* lsb == 00, jump to word copy loop */
	l.sfeqi		r15, 0
	l.bf		2f
	 l.addi		r19, r3, 0 // Set r19 = src

	/* lsb == 01,10 or 11 */
	l.sb		0(r3), r13   // *src = c
	l.addi		r17, r17, -1 // Decrease n

	l.sfeqi		r15, 3
	l.bf		2f
	 l.addi		r19, r3, 1  // src += 1

	/* lsb == 01 or 10 */
	l.sb		1(r3), r13   // *(src+1) = c
	l.addi		r17, r17, -1 // Decrease n

	l.sfeqi		r15, 2
	l.bf		2f
	 l.addi		r19, r3, 2  // src += 2

	/* lsb == 01 */
	l.sb		2(r3), r13   // *(src+2) = c
	l.addi		r17, r17, -1 // Decrease n
	l.addi		r19, r3, 3   // src += 3

	/* Word copy loop */
2:	l.sw		0(r19), r13  // *src = cccc
	l.addi		r17, r17, -4 // Decrease n
	l.sfgeui	r17, 4
	l.bf		2b
	 l.addi		r19, r19, 4  // Increase src

Annotation

Implementation Notes