mirror of https://github.com/zeldaret/mm.git
Handwritten asm: bcmp, bcopy, bzero
This commit is contained in:
parent
ce93b71b95
commit
506a45c67f
2
Makefile
2
Makefile
|
|
@ -447,6 +447,8 @@ $(BUILD_DIR)/src/libultra/libc/%.o: OPTFLAGS := -O2
|
||||||
$(BUILD_DIR)/src/libultra/gu/%.o: OPTFLAGS := -O2
|
$(BUILD_DIR)/src/libultra/gu/%.o: OPTFLAGS := -O2
|
||||||
$(BUILD_DIR)/src/libultra/rmon/%.o: OPTFLAGS := -O2
|
$(BUILD_DIR)/src/libultra/rmon/%.o: OPTFLAGS := -O2
|
||||||
|
|
||||||
|
$(BUILD_DIR)/src/libultra/libc/%.o: ASOPTFLAGS := -O2
|
||||||
|
|
||||||
$(BUILD_DIR)/src/boot/libu64/%.o: OPTFLAGS := -O2
|
$(BUILD_DIR)/src/boot/libu64/%.o: OPTFLAGS := -O2
|
||||||
|
|
||||||
$(BUILD_DIR)/src/boot/libc/%.o: OPTFLAGS := -O2
|
$(BUILD_DIR)/src/boot/libc/%.o: OPTFLAGS := -O2
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ beginseg
|
||||||
include "$(BUILD_DIR)/src/libultra/os/thread.o"
|
include "$(BUILD_DIR)/src/libultra/os/thread.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/os/destroythread.o"
|
include "$(BUILD_DIR)/src/libultra/os/destroythread.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/voice/voicecheckresult.o"
|
include "$(BUILD_DIR)/src/libultra/voice/voicecheckresult.o"
|
||||||
include "$(BUILD_DIR)/asm/boot/bzero.text.o"
|
include "$(BUILD_DIR)/src/libultra/libc/bzero.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/motor.o"
|
include "$(BUILD_DIR)/src/libultra/io/motor.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/siacs.o"
|
include "$(BUILD_DIR)/src/libultra/io/siacs.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/controller.o"
|
include "$(BUILD_DIR)/src/libultra/io/controller.o"
|
||||||
|
|
@ -152,7 +152,7 @@ beginseg
|
||||||
include "$(BUILD_DIR)/src/libultra/gu/position.o"
|
include "$(BUILD_DIR)/src/libultra/gu/position.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/epirawdma.o"
|
include "$(BUILD_DIR)/src/libultra/io/epirawdma.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/sptaskyielded.o"
|
include "$(BUILD_DIR)/src/libultra/io/sptaskyielded.o"
|
||||||
include "$(BUILD_DIR)/asm/boot/bcmp.text.o"
|
include "$(BUILD_DIR)/src/libultra/libc/bcmp.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/os/gettime.o"
|
include "$(BUILD_DIR)/src/libultra/os/gettime.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/gu/rotate.o"
|
include "$(BUILD_DIR)/src/libultra/gu/rotate.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/os/setglobalintmask.o"
|
include "$(BUILD_DIR)/src/libultra/os/setglobalintmask.o"
|
||||||
|
|
@ -169,7 +169,7 @@ beginseg
|
||||||
include "$(BUILD_DIR)/src/libultra/os/getcompare.o"
|
include "$(BUILD_DIR)/src/libultra/os/getcompare.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/dpgetstat.o"
|
include "$(BUILD_DIR)/src/libultra/io/dpgetstat.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/dpsetstat.o"
|
include "$(BUILD_DIR)/src/libultra/io/dpsetstat.o"
|
||||||
include "$(BUILD_DIR)/asm/boot/bcopy.text.o"
|
include "$(BUILD_DIR)/src/libultra/libc/bcopy.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/os/resetglobalintmask.o"
|
include "$(BUILD_DIR)/src/libultra/os/resetglobalintmask.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/io/pfsdeletefile.o"
|
include "$(BUILD_DIR)/src/libultra/io/pfsdeletefile.o"
|
||||||
include "$(BUILD_DIR)/src/libultra/gu/ortho.o"
|
include "$(BUILD_DIR)/src/libultra/gu/ortho.o"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
#include "PR/asm.h"
|
||||||
|
#include "PR/regdef.h"
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
LEAF(bcmp)
|
||||||
|
xor v0, a0, a1
|
||||||
|
blt a2, 0x10, bytecmp
|
||||||
|
|
||||||
|
and v0, v0, 3
|
||||||
|
negu t8, a0
|
||||||
|
bnez v0, unaligncmp
|
||||||
|
|
||||||
|
and t8, t8, 3
|
||||||
|
subu a2, a2, t8
|
||||||
|
beqz t8, wordcmp
|
||||||
|
|
||||||
|
move v0, v1
|
||||||
|
lwl v0, (a0)
|
||||||
|
lwl v1, (a1)
|
||||||
|
addu a0, a0, t8
|
||||||
|
addu a1, a1, t8
|
||||||
|
bne v0, v1, cmpne
|
||||||
|
|
||||||
|
wordcmp:
|
||||||
|
and a3, a2, ~3
|
||||||
|
subu a2, a2, a3
|
||||||
|
beqz a3, bytecmp
|
||||||
|
|
||||||
|
addu a3, a3, a0
|
||||||
|
1:
|
||||||
|
lw v0, (a0)
|
||||||
|
lw v1, (a1)
|
||||||
|
addu a0, a0, 4
|
||||||
|
addu a1, a1, 4
|
||||||
|
bne v0, v1, cmpne
|
||||||
|
bne a0, a3, 1b
|
||||||
|
|
||||||
|
b bytecmp
|
||||||
|
|
||||||
|
unaligncmp:
|
||||||
|
negu a3, a1
|
||||||
|
and a3, a3, 3
|
||||||
|
subu a2, a2, a3
|
||||||
|
beqz a3, partaligncmp
|
||||||
|
|
||||||
|
addu a3, a3, a0
|
||||||
|
1:
|
||||||
|
lbu v0, (a0)
|
||||||
|
lbu v1, (a1)
|
||||||
|
addu a0, a0, 1
|
||||||
|
addu a1, a1, 1
|
||||||
|
bne v0, v1, cmpne
|
||||||
|
bne a0, a3, 1b
|
||||||
|
|
||||||
|
partaligncmp:
|
||||||
|
and a3, a2, ~3
|
||||||
|
subu a2, a2, a3
|
||||||
|
beqz a3, bytecmp
|
||||||
|
|
||||||
|
addu a3, a3, a0
|
||||||
|
1:
|
||||||
|
lwl v0, (a0)
|
||||||
|
lwr v0, 3(a0)
|
||||||
|
lw v1, (a1)
|
||||||
|
addu a0, a0, 4
|
||||||
|
addu a1, a1, 4
|
||||||
|
bne v0, v1, cmpne
|
||||||
|
bne a0, a3, 1b
|
||||||
|
|
||||||
|
bytecmp:
|
||||||
|
addu a3, a2, a0
|
||||||
|
blez a2, cmpdone
|
||||||
|
1:
|
||||||
|
lbu v0, (a0)
|
||||||
|
lbu v1, (a1)
|
||||||
|
addu a0, a0, 1
|
||||||
|
addu a1, a1, 1
|
||||||
|
bne v0, v1, cmpne
|
||||||
|
bne a0, a3, 1b
|
||||||
|
|
||||||
|
cmpdone:
|
||||||
|
move v0, zero
|
||||||
|
jr ra
|
||||||
|
|
||||||
|
cmpne:
|
||||||
|
li v0, 1
|
||||||
|
jr ra
|
||||||
|
END(bcmp)
|
||||||
|
|
@ -0,0 +1,211 @@
|
||||||
|
#include "PR/asm.h"
|
||||||
|
#include "PR/regdef.h"
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
LEAF(bcopy)
|
||||||
|
move a3, a1
|
||||||
|
beqz a2, ret
|
||||||
|
beq a0, a1, ret
|
||||||
|
blt a1, a0, goforwards
|
||||||
|
add v0, a0, a2
|
||||||
|
bge a1, v0, goforwards
|
||||||
|
b gobackwards
|
||||||
|
|
||||||
|
goforwards:
|
||||||
|
blt a2, 0x10, forwards_bytecopy
|
||||||
|
and v0, a0, 3
|
||||||
|
and v1, a1, 3
|
||||||
|
beq v0, v1, forwalignable
|
||||||
|
|
||||||
|
forwards_bytecopy:
|
||||||
|
beqz a2, ret
|
||||||
|
addu v1, a0, a2
|
||||||
|
99:
|
||||||
|
lb v0, (a0)
|
||||||
|
addu a0, a0, 1
|
||||||
|
sb v0, (a1)
|
||||||
|
addu a1, a1, 1
|
||||||
|
bne a0, v1, 99b
|
||||||
|
ret:
|
||||||
|
move v0, a3
|
||||||
|
jr ra
|
||||||
|
|
||||||
|
forwalignable:
|
||||||
|
beqz v0, forwards_32
|
||||||
|
beq v0, 1, forw_copy3
|
||||||
|
beq v0, 2, forw_copy2
|
||||||
|
|
||||||
|
lb v0, (a0)
|
||||||
|
addu a0, a0, 1
|
||||||
|
sb v0, (a1)
|
||||||
|
addu a1, a1, 1
|
||||||
|
addu a2, a2, -1
|
||||||
|
b forwards_32
|
||||||
|
|
||||||
|
forw_copy2:
|
||||||
|
lh v0, (a0)
|
||||||
|
addu a0, a0, 2
|
||||||
|
sh v0, (a1)
|
||||||
|
addu a1, a1, 2
|
||||||
|
addu a2, a2, -2
|
||||||
|
b forwards_32
|
||||||
|
|
||||||
|
forw_copy3:
|
||||||
|
lb v0, (a0)
|
||||||
|
lh v1, 1(a0)
|
||||||
|
addiu a0, a0, 3
|
||||||
|
sb v0, (a1)
|
||||||
|
sh v1, 1(a1)
|
||||||
|
addiu a1, a1, 3
|
||||||
|
addiu a2, a2, -3
|
||||||
|
|
||||||
|
forwards:
|
||||||
|
forwards_32:
|
||||||
|
blt a2, 32, forwards_16
|
||||||
|
lw v0, 0(a0)
|
||||||
|
lw v1, 4(a0)
|
||||||
|
lw t0, 8(a0)
|
||||||
|
lw t1, 12(a0)
|
||||||
|
lw t2, 16(a0)
|
||||||
|
lw t3, 20(a0)
|
||||||
|
lw t4, 24(a0)
|
||||||
|
lw t5, 28(a0)
|
||||||
|
addiu a0, a0, 32
|
||||||
|
sw v0, 0(a1)
|
||||||
|
sw v1, 4(a1)
|
||||||
|
sw t0, 8(a1)
|
||||||
|
sw t1, 12(a1)
|
||||||
|
sw t2, 16(a1)
|
||||||
|
sw t3, 20(a1)
|
||||||
|
sw t4, 24(a1)
|
||||||
|
sw t5, 28(a1)
|
||||||
|
addiu a1, a1, 32
|
||||||
|
addiu a2, a2, -32
|
||||||
|
b forwards_32
|
||||||
|
|
||||||
|
forwards_16:
|
||||||
|
blt a2, 16, forwards_4
|
||||||
|
lw v0, 0(a0)
|
||||||
|
lw v1, 4(a0)
|
||||||
|
lw t0, 8(a0)
|
||||||
|
lw t1, 12(a0)
|
||||||
|
addiu a0, a0, 16
|
||||||
|
sw v0, 0(a1)
|
||||||
|
sw v1, 4(a1)
|
||||||
|
sw t0, 8(a1)
|
||||||
|
sw t1, 12(a1)
|
||||||
|
addiu a1, a1, 16
|
||||||
|
addiu a2, a2, -16
|
||||||
|
b forwards_16
|
||||||
|
|
||||||
|
forwards_4:
|
||||||
|
blt a2, 4, forwards_bytecopy
|
||||||
|
|
||||||
|
lw v0, 0(a0)
|
||||||
|
addiu a0, a0, 4
|
||||||
|
sw v0, 0(a1)
|
||||||
|
addiu a1, a1, 4
|
||||||
|
addiu a2, a2, -4
|
||||||
|
b forwards_4
|
||||||
|
|
||||||
|
gobackwards:
|
||||||
|
add a0, a0,a2
|
||||||
|
add a1, a1,a2
|
||||||
|
blt a2, 16, backwards_bytecopy
|
||||||
|
|
||||||
|
andi v0, a0, 0x3
|
||||||
|
andi v1, a1, 0x3
|
||||||
|
beq v0, v1, backalignable
|
||||||
|
|
||||||
|
backwards_bytecopy:
|
||||||
|
beqz a2, ret
|
||||||
|
addiu a0, a0, -1
|
||||||
|
addiu a1, a1, -1
|
||||||
|
subu v1, a0,a2
|
||||||
|
99:
|
||||||
|
lb v0, 0(a0)
|
||||||
|
addiu a0, a0, -1
|
||||||
|
sb v0, 0(a1)
|
||||||
|
addiu a1, a1, -1
|
||||||
|
bne a0, v1,99b
|
||||||
|
|
||||||
|
move v0, a3
|
||||||
|
jr ra
|
||||||
|
|
||||||
|
backalignable:
|
||||||
|
beqz v0, backwards
|
||||||
|
beq v0, 3, back_copy3
|
||||||
|
beq v0, 2, back_copy2
|
||||||
|
lb v0, -1(a0)
|
||||||
|
addiu a0, a0, -1
|
||||||
|
sb v0, -1(a1)
|
||||||
|
addiu a1, a1, -1
|
||||||
|
addiu a2, a2, -1
|
||||||
|
b backwards
|
||||||
|
|
||||||
|
back_copy2:
|
||||||
|
lh v0, -2(a0)
|
||||||
|
addiu a0, a0, -2
|
||||||
|
sh v0, -2(a1)
|
||||||
|
addiu a1, a1, -2
|
||||||
|
addiu a2, a2, -2
|
||||||
|
b backwards
|
||||||
|
|
||||||
|
back_copy3:
|
||||||
|
lb v0, -1(a0)
|
||||||
|
lh v1, -3(a0)
|
||||||
|
addiu a0, a0, -3
|
||||||
|
sb v0, -1(a1)
|
||||||
|
sh v1, -3(a1)
|
||||||
|
addiu a1, a1, -3
|
||||||
|
addiu a2, a2, -3
|
||||||
|
|
||||||
|
backwards:
|
||||||
|
backwards_32:
|
||||||
|
blt a2, 32, backwards_16
|
||||||
|
lw v0, -4(a0)
|
||||||
|
lw v1, -8(a0)
|
||||||
|
lw t0, -12(a0)
|
||||||
|
lw t1, -16(a0)
|
||||||
|
lw t2, -20(a0)
|
||||||
|
lw t3, -24(a0)
|
||||||
|
lw t4, -28(a0)
|
||||||
|
lw t5, -32(a0)
|
||||||
|
addiu a0, a0, -32
|
||||||
|
sw v0, -4(a1)
|
||||||
|
sw v1, -8(a1)
|
||||||
|
sw t0, -12(a1)
|
||||||
|
sw t1, -16(a1)
|
||||||
|
sw t2, -20(a1)
|
||||||
|
sw t3, -24(a1)
|
||||||
|
sw t4, -28(a1)
|
||||||
|
sw t5, -32(a1)
|
||||||
|
addiu a1, a1, -32
|
||||||
|
addiu a2, a2, -32
|
||||||
|
b backwards_32
|
||||||
|
|
||||||
|
backwards_16:
|
||||||
|
blt a2, 16, backwards_4
|
||||||
|
lw v0, -4(a0)
|
||||||
|
lw v1, -8(a0)
|
||||||
|
lw t0, -12(a0)
|
||||||
|
lw t1, -16(a0)
|
||||||
|
addiu a0, a0, -16
|
||||||
|
sw v0, -4(a1)
|
||||||
|
sw v1, -8(a1)
|
||||||
|
sw t0, -12(a1)
|
||||||
|
sw t1, -16(a1)
|
||||||
|
addiu a1, a1, -16
|
||||||
|
addiu a2, a2, -16
|
||||||
|
b backwards_16
|
||||||
|
|
||||||
|
backwards_4:
|
||||||
|
blt a2, 4, backwards_bytecopy
|
||||||
|
lw v0, -4(a0)
|
||||||
|
addiu a0, a0, -4
|
||||||
|
sw v0, -4(a1)
|
||||||
|
addiu a1, a1, -4
|
||||||
|
addiu a2, a2, -4
|
||||||
|
b backwards_4
|
||||||
|
END(bcopy)
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
#include "PR/asm.h"
|
||||||
|
#include "PR/regdef.h"
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
LEAF(bzero)
|
||||||
|
negu v1, a0
|
||||||
|
blt a1, 0xC, bytezero
|
||||||
|
|
||||||
|
and v1, v1, 3
|
||||||
|
subu a1, a1, v1
|
||||||
|
beqz v1, blkzero
|
||||||
|
|
||||||
|
swl zero, (a0)
|
||||||
|
addu a0, a0, v1
|
||||||
|
blkzero:
|
||||||
|
/* align backwards to 0x20 */
|
||||||
|
and a3, a1, ~(0x20 - 1)
|
||||||
|
/* If the result is zero, the amount to zero is less than 0x20 bytes */
|
||||||
|
subu a1, a1, a3
|
||||||
|
beqz a3, wordzero
|
||||||
|
/* zero in blocks of 0x20 at a time */
|
||||||
|
addu a3, a3, a0
|
||||||
|
1:
|
||||||
|
sw zero, 0(a0)
|
||||||
|
sw zero, 4(a0)
|
||||||
|
sw zero, 8(a0)
|
||||||
|
sw zero, 12(a0)
|
||||||
|
addiu a0, a0, 0x20
|
||||||
|
sw zero, -16(a0)
|
||||||
|
sw zero, -12(a0)
|
||||||
|
sw zero, -8(a0)
|
||||||
|
sw zero, -4(a0)
|
||||||
|
bne a0, a3, 1b
|
||||||
|
|
||||||
|
wordzero:
|
||||||
|
/* align backwards to 0x4 */
|
||||||
|
and a3, a1, ~3
|
||||||
|
/* If the result is zero, the amount to zero is less than 0x4 bytes */
|
||||||
|
subu a1, a1, a3
|
||||||
|
beqz a3, bytezero
|
||||||
|
/* zero one word at a time */
|
||||||
|
addu a3, a3, a0
|
||||||
|
1:
|
||||||
|
addu a0, a0, 4
|
||||||
|
sw zero, -4(a0)
|
||||||
|
bne a0, a3, 1b
|
||||||
|
bytezero:
|
||||||
|
/* test if nothing left to zero */
|
||||||
|
blez a1, zerodone
|
||||||
|
/* zero one byte at a time */
|
||||||
|
addu a1, a1, a0
|
||||||
|
1:
|
||||||
|
addiu a0, a0, 1
|
||||||
|
sb zero, -1(a0)
|
||||||
|
bne a0, a1, 1b
|
||||||
|
zerodone:
|
||||||
|
jr ra
|
||||||
|
END(bzero)
|
||||||
Loading…
Reference in New Issue