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