FreeBSD/Linux Kernel Cross Reference
sys/alphapc/memset.s
1 TEXT memset(SB), $0
2 MOVL R0, R6
3 MOVBU data+4(FP), R2
4 MOVL n+8(FP), R10
5
6 ADDL R10, R0, R8
7
8 CMPUGE $8, R10, R1 /* need at least 8 bytes */
9 BNE R1, _1loop
10
11 SLLQ $8, R2, R1 /* replicate the byte */
12 OR R1, R2
13 SLLQ $16, R2, R1
14 OR R1, R2
15 SLLQ $32, R2, R1
16 OR R1, R2
17
18 _align:
19 AND $(8-1), R6, R1
20 BEQ R1, _aligned
21
22 MOVB R2, (R6)
23 ADDL $1, R6, R6
24 JMP _align
25
26 _aligned:
27 SUBL $(64-1), R8, R9 /* end pointer minus slop */
28 _64loop:
29 CMPUGT R9, R6, R1
30 BEQ R1, _8tail
31
32 MOVQ R2, (R6)
33 MOVQ R2, 8(R6)
34 MOVQ R2, 16(R6)
35 MOVQ R2, 24(R6)
36 MOVQ R2, 32(R6)
37 MOVQ R2, 40(R6)
38 MOVQ R2, 48(R6)
39 MOVQ R2, 56(R6)
40 ADDL $64, R6, R6
41 JMP _64loop
42
43 _8tail:
44 SUBL $(8-1), R8, R9
45 _8loop:
46 CMPUGT R9, R6, R1
47 BEQ R1, _1loop
48
49 MOVQ R2, (R6)
50 ADDL $8, R6
51 JMP _8loop
52
53 _1loop:
54 CMPUGT R8, R6, R1
55 BEQ R1, _ret
56 MOVB R2, (R6)
57 ADDL $1, R6
58 JMP _1loop
59
60 _ret:
61 RET
Cache object: 64eee951b3846eac87384a8a1eec03cd
|