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