summaryrefslogtreecommitdiffstats
path: root/sys/lib/libkern/arch/mips64/bcopy.S
diff options
context:
space:
mode:
authorpefo <pefo@openbsd.org>2004-10-08 14:42:09 +0000
committerpefo <pefo@openbsd.org>2004-10-08 14:42:09 +0000
commit80fb28ddd1644dcb3a8df959c882abbf42e2f3ff (patch)
treeac0edc9d977c8048916d0af8c9d88dbd5dd36e20 /sys/lib/libkern/arch/mips64/bcopy.S
parentvarious updates/improvements (diff)
downloadwireguard-openbsd-80fb28ddd1644dcb3a8df959c882abbf42e2f3ff.tar.xz
wireguard-openbsd-80fb28ddd1644dcb3a8df959c882abbf42e2f3ff.zip
64 bit safe over entire address range
Diffstat (limited to 'sys/lib/libkern/arch/mips64/bcopy.S')
-rw-r--r--sys/lib/libkern/arch/mips64/bcopy.S46
1 files changed, 23 insertions, 23 deletions
diff --git a/sys/lib/libkern/arch/mips64/bcopy.S b/sys/lib/libkern/arch/mips64/bcopy.S
index b48fe7504eb..6ee62c945cc 100644
--- a/sys/lib/libkern/arch/mips64/bcopy.S
+++ b/sys/lib/libkern/arch/mips64/bcopy.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: bcopy.S,v 1.3 2004/09/09 15:41:18 pefo Exp $ */
+/* $OpenBSD: bcopy.S,v 1.4 2004/10/08 14:42:09 pefo Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
@@ -46,7 +46,7 @@ LEAF(memcpy, 0)
ALEAF(bcopy)
ALEAF(ovbcopy)
.set noreorder
- addu t0, a0, a2 # t0 = end of s1 region
+ PTR_ADDU t0, a0, a2 # t0 = end of s1 region
sltu t1, a1, t0
sltu t2, a0, a1
and t1, t1, t2 # t1 = true if from < to < (from+len)
@@ -54,11 +54,11 @@ ALEAF(ovbcopy)
slt t2, a2, 12 # check for small copy
ble a2, zero, 2f
- addu t1, a1, a2 # t1 = end of to region
+ PTR_ADDU t1, a1, a2 # t1 = end of to region
1:
lb v1, -1(t0) # copy bytes backwards,
- subu t0, t0, 1 # doesnt happen often so do slow way
- subu t1, t1, 1
+ PTR_SUBU t0, t0, 1 # doesnt happen often so do slow way
+ PTR_SUBU t1, t1, 1
bne t0, a0, 1b
sb v1, 0(t1)
2:
@@ -68,59 +68,59 @@ forward:
bne t2, zero, smallcpy # do a small bcopy
xor v1, a0, a1 # compare low two bits of addresses
and v1, v1, 3
- subu a3, zero, a1 # compute # bytes to word align address
+ PTR_SUBU a3, zero, a1 # compute # bytes to word align address
beq v1, zero, aligned # addresses can be word aligned
and a3, a3, 3
beq a3, zero, 1f
- subu a2, a2, a3 # subtract from remaining count
+ PTR_SUBU a2, a2, a3 # subtract from remaining count
LWHI v1, 0(a0) # get next 4 bytes (unaligned)
LWLO v1, 3(a0)
- addu a0, a0, a3
+ PTR_ADDU a0, a0, a3
SWHI v1, 0(a1) # store 1, 2, or 3 bytes to align a1
- addu a1, a1, a3
+ PTR_ADDU a1, a1, a3
1:
and v1, a2, 3 # compute number of words left
- subu a3, a2, v1
+ PTR_SUBU a3, a2, v1
move a2, v1
- addu a3, a3, a0 # compute ending address
+ PTR_ADDU a3, a3, a0 # compute ending address
2:
LWHI v1, 0(a0) # copy words a0 unaligned, a1 aligned
LWLO v1, 3(a0)
- addu a0, a0, 4
+ PTR_ADDU a0, a0, 4
sw v1, 0(a1)
- addu a1, a1, 4
+ PTR_ADDU a1, a1, 4
bne a0, a3, 2b
nop # We have to do this mmu-bug.
b smallcpy
nop
aligned:
beq a3, zero, 1f
- subu a2, a2, a3 # subtract from remaining count
+ PTR_SUBU a2, a2, a3 # subtract from remaining count
LWHI v1, 0(a0) # copy 1, 2, or 3 bytes to align
- addu a0, a0, a3
+ PTR_ADDU a0, a0, a3
SWHI v1, 0(a1)
- addu a1, a1, a3
+ PTR_ADDU a1, a1, a3
1:
and v1, a2, 3 # compute number of whole words left
- subu a3, a2, v1
+ PTR_SUBU a3, a2, v1
move a2, v1
- addu a3, a3, a0 # compute ending address
+ PTR_ADDU a3, a3, a0 # compute ending address
2:
lw v1, 0(a0) # copy words
- addu a0, a0, 4
+ PTR_ADDU a0, a0, 4
sw v1, 0(a1)
bne a0, a3, 2b
- addu a1, a1, 4
+ PTR_ADDU a1, a1, 4
smallcpy:
ble a2, zero, 2f
- addu a3, a2, a0 # compute ending address
+ PTR_ADDU a3, a2, a0 # compute ending address
1:
lbu v1, 0(a0) # copy bytes
- addu a0, a0, 1
+ PTR_ADDU a0, a0, 1
sb v1, 0(a1)
bne a0, a3, 1b
- addu a1, a1, 1 # MMU BUG ? can not do -1(a1) at 0x80000000!!
+ PTR_ADDU a1, a1, 1 # MMU BUG ? can not do -1(a1) at 0x80000000!!
2:
j ra
nop