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/rmon/%.o: OPTFLAGS := -O2 | ||||
| 
 | ||||
| $(BUILD_DIR)/src/libultra/libc/%.o: ASOPTFLAGS := -O2 | ||||
| 
 | ||||
| $(BUILD_DIR)/src/boot/libu64/%.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/destroythread.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/siacs.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/io/epirawdma.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/gu/rotate.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/io/dpgetstat.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/io/pfsdeletefile.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
	
	 Tharo
						Tharo