sm64/lib/asm/osGetCount.s
2023-08-17 08:56:02 -04:00

84 lines
1.9 KiB
ArmAsm

.set noreorder // don't insert nops after branches
#include "macros.inc"
.section .text, "ax"
#ifdef VERSION_CN
glabel osGetCount
addiu $sp, $sp, -0x38
sd $ra, 0x30($sp)
sd $fp, 0x28($sp)
jal __osDisableInt
move $fp, $sp
sw $v0, 0x24($fp)
mfc0 $a1, $9
sw $a1, 0x20($fp)
lw $v0, 0x20($fp)
lui $v1, %hi(sLastHighestCount) # $v1, 0x8032
lw $v1, %lo(sLastHighestCount)($v1)
sltu $v0, $v0, $v1
beqz $v0, .L80304FCC
nop
lui $v0, %hi(sNumCountOverflows) # $v0, 0x8032
lw $v0, %lo(sNumCountOverflows)($v0)
addiu $v1, $v0, 1
sw $v1, sNumCountOverflows
.L80304FCC:
lw $v0, 0x20($fp)
sw $v0, sLastHighestCount
lui $v0, %hi(sNumCountOverflows) // $v0, 0x8032
lwu $v0, %lo(sNumCountOverflows)($v0)
dsll32 $v1, $v0, 0
lwu $a0, 0x20($fp)
or $v0, $v1, $a0
move $a0, $v0
dsll $v1, $a0, 5
dsubu $v1, $v1, $v0
dsll $a0, $v1, 2
daddu $a0, $a0, $v0
.set noat // gas seems to add an extra mflo $zero after, if we don't manually use $at
li $at, 192
ddivu $zero, $a0, $at
.set at
mflo $v0
dsll32 $v0, $v0, 0
dsra32 $v0, $v0, 0
sw $v0, 0x20($fp)
lw $v0, 0x20($fp)
lui $v1, %hi(sLastHighestCount2) // $v1, 0x8032
lw $v1, %lo(sLastHighestCount2)($v1)
sltu $v0, $v0, $v1
beqz $v0, .L80305044
nop
lui $v0, %hi(sNumCountOverflows2) // $v0, 0x8032
lw $v0, %lo(sNumCountOverflows2)($v0)
addiu $v1, $v0, 1
sw $v1, sNumCountOverflows2
.L80305044:
lw $v0, 0x20($fp)
sw $v0, sLastHighestCount2
jal __osRestoreInt
lw $a0, 0x24($fp)
lw $v1, 0x20($fp)
j .L80305064
move $v0, $v1
.L80305064:
move $sp, $fp
ld $ra, 0x30($sp)
ld $fp, 0x28($sp)
jr $ra
addiu $sp, $sp, 0x38
#else
glabel osGetCount
mfc0 $v0, $9
jr $ra
nop
nop
#endif