mirror of
https://github.com/FunKey-Project/picodrive-irixxxx.git
synced 2026-02-02 21:15:40 +01:00
203 lines
4.1 KiB
ArmAsm
203 lines
4.1 KiB
ArmAsm
/*
|
|
# ___ _ _ ___
|
|
# | | | | |
|
|
# ___| | | ___| PS2DEV Open Source Project.
|
|
#----------------------------------------------------------
|
|
# MUL64 is pulled from some binary library (I don't remember which one).
|
|
# mips_memcpy routine is pulled from 'sde' library from MIPS.
|
|
#
|
|
*/
|
|
.set noat
|
|
.set noreorder
|
|
.set nomacro
|
|
|
|
.globl MUL64
|
|
.globl mips_memcpy
|
|
.globl mips_memset
|
|
|
|
.text
|
|
|
|
MUL64:
|
|
pmultuw $v0, $a0, $a1
|
|
dsra32 $a2, $a0, 0
|
|
dsra32 $v1, $a1, 0
|
|
mult $v1, $a0, $v1
|
|
mult1 $a2, $a2, $a1
|
|
addu $v1, $v1, $a2
|
|
dsll32 $v1, $v1, 0
|
|
jr $ra
|
|
daddu $v0, $v0, $v1
|
|
|
|
mips_memcpy:
|
|
addu $v0, $a0, $zero
|
|
beqz $a2, 1f
|
|
sltiu $t2, $a2, 12
|
|
bnez $t2, 2f
|
|
xor $v1, $a1, $a0
|
|
andi $v1, $v1, 7
|
|
negu $a3, $a0
|
|
beqz $v1, 3f
|
|
andi $a3, $a3, 7
|
|
beqz $a3, 4f
|
|
subu $a2, $a2, $a3
|
|
ldr $v1, 0($a1)
|
|
ldl $v1, 7($a1)
|
|
addu $a1, $a1, $a3
|
|
sdr $v1, 0($a0)
|
|
addu $a0, $a0, $a3
|
|
4:
|
|
andi $v1, $a2, 31
|
|
subu $a3, $a2, $v1
|
|
beqz $a3, 5f
|
|
addu $a2, $v1, $zero
|
|
addu $a3, $a3, $a1
|
|
6:
|
|
ldr $v1, 0($a1)
|
|
ldl $v1, 7($a1)
|
|
ldr $t0, 8($a1)
|
|
ldl $t0, 15($a1)
|
|
ldr $t1, 16($a1)
|
|
ldl $t1, 23($a1)
|
|
ldr $t2, 24($a1)
|
|
ldl $t2, 31($a1)
|
|
sd $v1, 0($a0)
|
|
sd $t0, 8($a0)
|
|
sd $t1, 16($a0)
|
|
addiu $a1, $a1, 32
|
|
addiu $a0, $a0, 32
|
|
bne $a1, $a3, 6b
|
|
sd $t2, -8($a0)
|
|
5:
|
|
andi $v1, $a2, 7
|
|
subu $a3, $a2, $v1
|
|
beqz $a3, 2f
|
|
addu $a2, $v1, $zero
|
|
addu $a3, $a3, $a1
|
|
7:
|
|
ldr $v1, 0($a1)
|
|
ldl $v1, 7($a1)
|
|
addiu $a1, $a1, 8
|
|
addiu $a0, $a0, 8
|
|
nop
|
|
bne $a1, $a3, 7b
|
|
sd $v1, -8($a0)
|
|
beq $zero, $zero, 2f
|
|
nop
|
|
3:
|
|
beqz $a3, 8f
|
|
subu $a2, $a2, $a3
|
|
ldr $v1, 0($a1)
|
|
addu $a1, $a1, $a3
|
|
sdr $v1, 0($a0)
|
|
addu $a0, $a0, $a3
|
|
8:
|
|
andi $v1, $a2, 31
|
|
subu $a3, $a2, $v1
|
|
beqz $a3, 9f
|
|
addu $a2, $v1, $zero
|
|
addu $a3, $a3, $a1
|
|
10:
|
|
ld $v1, 0($a1)
|
|
ld $t0, 8($a1)
|
|
ld $t1, 16($a1)
|
|
ld $t2, 24($a1)
|
|
sd $v1, 0($a0)
|
|
sd $t0, 8($a0)
|
|
sd $t1, 16($a0)
|
|
addiu $a1, $a1, 32
|
|
addiu $a0, $a0, 32
|
|
bne $a1, $a3, 10b
|
|
sd $t2, -8($a0)
|
|
9:
|
|
andi $v1, $a2, 7
|
|
subu $a3, $a2, $v1
|
|
beqz $a3, 2f
|
|
addu $a2, $v1, $zero
|
|
addu $a3, $a3, $a1
|
|
11:
|
|
ld $v1, 0($a1)
|
|
addiu $a1, $a1, 8
|
|
addiu $a0, $a0, 8
|
|
nop
|
|
nop
|
|
bne $a1, $a3, 11b
|
|
sd $v1, -8($a0)
|
|
2:
|
|
beqz $a2, 1f
|
|
addu $a3, $a2, $a1
|
|
12:
|
|
lbu $v1, 0($a1)
|
|
addiu $a1, $a1, 1
|
|
addiu $a0, $a0, 1
|
|
nop
|
|
nop
|
|
bne $a1, $a3, 12b
|
|
sb $v1, -1($a0)
|
|
1:
|
|
jr $ra
|
|
nop
|
|
|
|
mips_memset:
|
|
beqz $a2, 1f
|
|
sltiu $at, $a2, 16
|
|
bnez $at, 2f
|
|
andi $a1, $a1, 0xFF
|
|
dsll $at, $a1, 0x8
|
|
or $a1, $a1, $at
|
|
dsll $at, $a1, 0x10
|
|
or $a1, $a1, $at
|
|
dsll32 $at, $a1, 0x0
|
|
or $a1, $a1, $at
|
|
andi $v1, $a0, 0x7
|
|
beqz $v1, 3f
|
|
li $a3, 8
|
|
subu $a3, $a3, $v1
|
|
subu $a2, $a2, $a3
|
|
sdr $a1, 0($a0)
|
|
addu $a0, $a0, $a3
|
|
3:
|
|
andi $v1, $a2, 0x1f
|
|
subu $a3, $a2, $v1
|
|
beqz $a3, 4f
|
|
move $a2, $v1
|
|
addu $a3, $a3, $a0
|
|
5:
|
|
sd $a1, 0($a0)
|
|
sd $a1, 8($a0)
|
|
sd $a1, 16($a0)
|
|
addiu $a0, $a0, 32
|
|
sd $a1, -8($a0)
|
|
bne $a0, $a3, 5b
|
|
4:
|
|
andi $v1, $a2, 0x7
|
|
subu $a3, $a2, $v1
|
|
beqz $a3, 2f
|
|
move $a2, $v1
|
|
addu $a3, $a3, $a0
|
|
6:
|
|
addiu $a0, $a0, 8
|
|
beq $a0, $a3, 2f
|
|
sd $a1, -8($a0)
|
|
addiu $a0, $a0, 8
|
|
beq $a0, $a3, 2f
|
|
sd $a1, -8($a0)
|
|
addiu $a0, $a0, 8
|
|
bne $a0, $a3, 6b
|
|
sd $a1, -8($a0)
|
|
2:
|
|
beqz $a2, 1f
|
|
addu $a3, $a2, $a0
|
|
7:
|
|
addiu $a0, $a0, 1
|
|
beq $a0, $a3, 1f
|
|
sb $a1, -1($a0)
|
|
addiu $a0, $a0, 1
|
|
beq $a0, $a3, 1f
|
|
sb $a1, -1($a0)
|
|
addiu $a0, $a0, 1
|
|
bne $a0, $a3, 7b
|
|
sb $a1, -1($a0)
|
|
1:
|
|
jr $ra
|
|
nop
|