Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/riscv/string/memset.S
96309 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2024 Strahinja Stanisic <[email protected]>
5
*/
6
7
#include <machine/asm.h>
8
9
/*
10
* register a0 - void *dest
11
* register a1 - int c
12
* register a2 - size_t len
13
*/
14
ENTRY(memset)
15
andi a1, a1, 0xFF
16
17
sltiu t1, a2, 8
18
mv t0, a0
19
bnez t1, .Lend
20
21
li t1, 0x0101010101010101
22
mul a1, a1, t1
23
24
andi t1, a0, 0b111
25
andi t0, a0, ~0b111
26
27
beqz t1, .Lloop_store_64
28
29
la t2, .Lduff_start
30
slli t3, t1, 2
31
add t2, t2, t3
32
jr -4(t2)
33
.Lduff_start:
34
sb a1, 1(t0)
35
sb a1, 2(t0)
36
sb a1, 3(t0)
37
sb a1, 4(t0)
38
sb a1, 5(t0)
39
sb a1, 6(t0)
40
sb a1, 7(t0)
41
42
/* a3 = a3 -(8-a) <=> a3 = a3 + (a-8) */
43
addi t1, t1, -8
44
add a2, a2, t1
45
addi t0, t0, 8
46
47
.Lloop_store_64:
48
slti t1, a2, 64
49
bnez t1, .Lstore_rest
50
sd a1, 0(t0)
51
sd a1, 8(t0)
52
sd a1, 16(t0)
53
sd a1, 24(t0)
54
sd a1, 32(t0)
55
sd a1, 40(t0)
56
sd a1, 48(t0)
57
sd a1, 56(t0)
58
addi a2, a2, -64
59
addi t0, t0, 64
60
j .Lloop_store_64
61
62
.Lstore_rest:
63
la t2, .Lduff_rest
64
andi t3, a2, ~0b111
65
srli t4, t3, 1
66
sub t2, t2, t4
67
jr t2
68
sd a1, 56(t0)
69
sd a1, 48(t0)
70
sd a1, 40(t0)
71
sd a1, 32(t0)
72
sd a1, 24(t0)
73
sd a1, 16(t0)
74
sd a1, 8(t0)
75
sd a1, 0(t0)
76
.Lduff_rest:
77
add t0, t0, t3
78
sub a2, a2, t3
79
80
.Lend:
81
slli a2, a2, 2
82
la t2, .Lduff_end
83
sub t2, t2, a2
84
jr t2
85
sb a1, 6(t0)
86
sb a1, 5(t0)
87
sb a1, 4(t0)
88
sb a1, 3(t0)
89
sb a1, 2(t0)
90
sb a1, 1(t0)
91
sb a1, (t0)
92
.Lduff_end:
93
ret
94
END(memset)
95
96
97