aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/libc/memmove.s
blob: 843ece759878afe34a2cad01478407d40d0a00c6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
.set noreorder

.section .text

# Arguments
#	a0 - destination address
#	a1 - source address
#	a2 - bytes to move
.global memmove
.type memmove, @function
memmove:
	move	$v0, $a0
	sltu	$v1, $a0, $a1
	blez	$v1, .Linit_backward
.Lloop_forward:
	blez	$a2, .Lexit
	addi	$a2, -1
	lbu		$v1, 0($a1)
	addiu	$a1, 1
	sb		$v1, 0($a0)
	addiu	$a0, 1
	b		.Lloop_forward
	nop
.Linit_backward:
	addu	$a0, $a2
	addu	$a1, $a2
	addiu	$a0, -1
	addiu	$a1, -1
	b		.Lloop_backward
	nop
.Lloop_backward:
	blez	$a2, .Lexit
	addi	$a2, -1
	lbu		$v1, 0($a1)
	addiu	$a1, -1
	sb		$v1, 0($a0)
	addiu	$a0, -1
	b		.Lloop_backward
	nop
.Lexit:
	jr		$ra
	nop