.text
.global memset
.align 4
memset:
mv r4, r0 || cmpz r2
jc r14
cmpui r2,
bnc qword_align_check
cmpui r2,
bc byte_set
word_align_check:
and3 r3, r4,
beqz r3, word_set
addi r3,
neg r3, r3
align_word:
stb r1, @r4 || addi r4,
addi r2,
bnez r3, align_word
cmpui r2,
bc byte_set
word_set:
and3 r1, r1,
sll3 r3, r1,
or r1, r3 || addi r4,
sll3 r3, r1,
or r1, r3 || addi r2,
word_set_loop:
st r1, @+r4 || addi r2,
bgtz r2, word_set_loop
bnez r2, byte_set_wrap
st r1, @+r4
jmp r14
qword_align_check:
and3 r3, r4,
bnez r3, word_align_check
qword_set:
and3 r1, r1,
sll3 r3, r1,
or r1, r3 || addi r4,
sll3 r3, r1,
or r1, r3 || ldi r5,
qword_set_loop:
ld r3, @(4,r4)
st r1, @+r4 || addi r2,
st r1, @+r4 || cmpu r2, r5
st r1, @+r4
st r1, @+r4
bnc qword_set_loop || cmpz r2
jc r14
set_remainder:
cmpui r2,
bc byte_set_wrap1
addi r2,
bra word_set_loop
byte_set_wrap:
addi r2,
cmpz r2
jc r14
byte_set_wrap1:
addi r4,
byte_set:
addi r2,
bnez r2, byte_set
byte_set:
addi r2,
addi r4,
bnez r2, byte_set
end_memset:
jmp r14
.align 4
memset:
mv r4, r0
beqz r2, end_memset
cmpui r2,
bnc qword_align_check
cmpui r2,
bc byte_set
word_align_check:
and3 r3, r4,
beqz r3, word_set
addi r3,
neg r3, r3
align_word:
stb r1, @r4
addi r4,
addi r2,
addi r3,
bnez r3, align_word
cmpui r2,
bc byte_set
word_set:
and3 r1, r1,
sll3 r3, r1,
or r1, r3
sll3 r3, r1,
or r1, r3
addi r2,
addi r4,
word_set_loop:
st r1, @+r4
addi r2,
bgtz r2, word_set_loop
bnez r2, byte_set_wrap
st r1, @+r4
jmp r14
qword_align_check:
and3 r3, r4,
bnez r3, word_align_check
qword_set:
and3 r1, r1,
sll3 r3, r1,
or r1, r3
sll3 r3, r1,
or r1, r3
addi r4,
qword_set_loop:
ld r3, @(4,r4)
addi r2,
st r1, @+r4
st r1, @+r4
cmpui r2,
st r1, @+r4
st r1, @+r4
bnc qword_set_loop
bnez r2, set_remainder
jmp r14
set_remainder:
cmpui r2,
bc byte_set_wrap1
addi r2,
bra word_set_loop
byte_set_wrap:
addi r2,
beqz r2, end_memset
byte_set_wrap1:
addi r4,
byte_set:
addi r2,
stb r1, @r4
addi r4,
bnez r2, byte_set
end_memset:
jmp r14
.end