pokediamond/arm9/asm/SSL_biginteger.s
2020-05-25 10:39:22 -04:00

1137 lines
18 KiB
ArmAsm

.include "asm/macros.inc"
.include "global.inc"
.section .text
arm_func_start get48bits_1
get48bits_1: ; 0x020A4ABC
ldrh r1, [r0, #0x0]
mov r0, #0x0
bx lr
arm_func_start get48bits_2
get48bits_2: ; 0x020A4AC8
ldrh r1, [r0, #0x0]
ldrh r0, [r0, #-0x2]
mov r0, r0, lsl #0x10
bx lr
arm_func_start get48bits_3
get48bits_3: ; 0x020A4AD8
ldrh r1, [r0, #0x0]
ldrh r2, [r0, #-0x2]
ldrh r3, [r0, #-0x4]
orr r0, r3, r2, lsl #0x10
bx lr
arm_func_start get64bits
get64bits: ; 0x020A4AEC
ldrh r2, [r0, #0x0]
ldrh r3, [r0, #-0x2]
orr r1, r3, r2, lsl #0x10
ldrh r2, [r0, #-0x4]
ldrh r3, [r0, #-0x6]
orr r0, r3, r2, lsl #0x10
bx lr
arm_func_start CPSi_char_from_big
CPSi_char_from_big: ; 0x020A4B08
sub r3, r2, #0x1
cmp r2, #0x1
add r0, r0, r3
ble _020A4B40
_020A4B18:
ldrh r3, [r1, #0x0]
sub r2, r2, #0x2
sub r12, r0, #0x1
strb r3, [r0, #0x0]
ldrh r3, [r1], #0x2
cmp r2, #0x1
sub r0, r0, #0x2
mov r3, r3, asr #0x8
strb r3, [r12, #0x0]
bgt _020A4B18
_020A4B40:
cmp r2, #0x0
ldrgth r1, [r1, #0x0]
strgtb r1, [r0, #0x0]
bx lr
arm_func_start CPSi_big_from_char
CPSi_big_from_char: ; 0x020A4B50
stmdb sp!, {r4-r6,lr}
mov r6, r1
mov r5, r2
mov r2, r3, lsl #0x1
mov r1, #0x0
mov r4, r0
bl MI_CpuFill8
sub r0, r5, #0x1
cmp r5, #0x1
add r6, r6, r0
ble _020A4B9C
_020A4B7C:
ldrb r1, [r6, #0x0]
ldrb r0, [r6, #-0x1]
sub r5, r5, #0x2
cmp r5, #0x1
add r0, r1, r0, lsl #0x8
strh r0, [r4], #0x2
sub r6, r6, #0x2
bgt _020A4B7C
_020A4B9C:
cmp r5, #0x0
ldrgtb r0, [r6, #0x0]
strgth r0, [r4, #0x0]
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start CPSi_big_montpower
CPSi_big_montpower: ; 0x020A4BB0
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x34
mov r10, r3
mov r3, #0x16
mul r4, r10, r3
ldr r3, _020A4DE0 ; =CPSiAlloc
mov r11, r0
ldr r3, [r3, #0x0]
mov r0, r4
ldr r9, [sp, #0x58]
str r1, [sp, #0x14]
str r2, [sp, #0x18]
blx r3
str r0, [sp, #0x1c]
cmp r0, #0x0
addeq sp, sp, #0x34
ldmeqia sp!, {r4-r11,lr}
bxeq lr
mov r2, r4
mov r1, #0x0
bl MI_CpuFill8
ldr r0, [sp, #0x1c]
mov r1, r10
add r6, r0, r10, lsl #0x1
add r0, r6, r10, lsl #0x1
add r5, r0, r10, lsl #0x1
add r4, r5, r10, lsl #0x1
str r0, [sp, #0x20]
add r0, r4, r10, lsl #0x1
str r0, [sp, #0x24]
add r7, r0, r10, lsl #0x1
mov r0, r9
bl count_digits
mov r8, r0
ldr r0, [sp, #0x1c]
mov r2, #0x1
mov r1, r8, lsl #0x1
strh r2, [r0, r1]
ldr r0, [sp, #0x20]
ldr r1, [sp, #0x1c]
str r0, [sp, #0x0]
mov r0, r6
mov r2, r9
mov r3, r10
bl CPSi_big_modinv
ldr r1, [sp, #0x1c]
mov r0, r5
mov r2, r6
mov r3, r10
bl CPSi_big_mult
mov r0, r6
mov r1, r5
mov r2, #0x1
mov r3, r10
bl CPSi_big_subsmall
str r10, [sp, #0x0]
mov r0, r6
mov r1, r6
mov r2, r9
mov r3, #0x0
str r7, [sp, #0x4]
bl CPSi_big_div
ldr r1, [sp, #0x14]
ldr r0, [sp, #0x20]
ldr r2, [sp, #0x1c]
mov r3, r10
bl CPSi_big_mult
ldr r1, [sp, #0x20]
str r10, [sp, #0x0]
mov r0, #0x0
mov r2, r9
mov r3, r1
str r7, [sp, #0x4]
bl CPSi_big_div
str r10, [sp, #0x0]
ldr r1, [sp, #0x1c]
mov r0, #0x0
mov r2, r9
mov r3, r11
str r7, [sp, #0x4]
bl CPSi_big_div
movs r0, r8, lsl #0x4
mov r7, #0x0
str r0, [sp, #0x28]
beq _020A4D9C
mov r0, #0x1
str r0, [sp, #0x2c]
mov r0, #0x8000
str r0, [sp, #0x30]
_020A4D14:
str r8, [sp, #0x0]
str r9, [sp, #0x4]
str r6, [sp, #0x8]
str r5, [sp, #0xc]
ldr r1, [sp, #0x24]
ldr r2, [sp, #0x2c]
mov r0, r11
mov r3, r10
str r4, [sp, #0x10]
bl CPSi_big_montmult
ldr r0, [sp, #0x30]
and r1, r7, #0xf
mov r0, r0, lsr r1
sub r1, r8, r7, asr #0x4
sub r1, r1, #0x1
mov r2, r1, lsl #0x1
ldr r1, [sp, #0x18]
ldrh r1, [r1, r2]
ands r0, r0, r1
beq _020A4D8C
str r8, [sp, #0x0]
str r9, [sp, #0x4]
str r6, [sp, #0x8]
str r5, [sp, #0xc]
ldr r1, [sp, #0x24]
ldr r2, [sp, #0x20]
mov r0, r11
mov r3, r10
str r4, [sp, #0x10]
bl CPSi_big_montmult
_020A4D8C:
ldr r0, [sp, #0x28]
add r7, r7, #0x1
cmp r7, r0
blo _020A4D14
_020A4D9C:
str r8, [sp, #0x0]
str r9, [sp, #0x4]
str r6, [sp, #0x8]
str r5, [sp, #0xc]
ldr r1, [sp, #0x24]
mov r0, r11
mov r3, r10
mov r2, #0x0
str r4, [sp, #0x10]
bl CPSi_big_montmult
ldr r1, _020A4DE4 ; =CPSiFree
ldr r0, [sp, #0x1c]
ldr r1, [r1, #0x0]
blx r1
add sp, sp, #0x34
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020A4DE0: .word CPSiAlloc
_020A4DE4: .word CPSiFree
arm_func_start CPSi_big_montmult
CPSi_big_montmult: ; 0x020A4DE8
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4
mov r5, r3
mov r7, r5, lsl #0x1
mov r8, r2
mov r2, r7
mov r6, r0
mov r9, r1
ldr r4, [sp, #0x20]
bl MI_CpuCopy8
cmp r8, #0x1
bne _020A4E2C
mov r0, r6
mov r1, r9
mov r2, r5
bl CPSi_big_sqr
b _020A4E48
_020A4E2C:
cmp r8, #0x0
beq _020A4E48
mov r0, r6
mov r1, r9
mov r2, r8
mov r3, r5
bl CPSi_big_mult
_020A4E48:
ldr r0, [sp, #0x2c]
ldr r2, [sp, #0x28]
mov r1, r6
mov r3, r4
bl CPSi_big_mult
sub r1, r5, r4
ldr r0, [sp, #0x2c]
mov r8, r1, lsl #0x1
mov r2, r8
add r0, r0, r4, lsl #0x1
mov r1, #0x0
bl MI_CpuFill8
ldr r0, [sp, #0x30]
ldr r1, [sp, #0x2c]
ldr r2, [sp, #0x24]
mov r3, r5
bl CPSi_big_mult
mov r0, r6
mov r1, r6
ldr r2, [sp, #0x30]
mov r3, r5
bl CPSi_big_add
mov r2, r8
mov r0, r6
add r1, r6, r4, lsl #0x1
bl memmove
add r0, r6, r5, lsl #0x1
sub r0, r0, r4, lsl #0x1
mov r2, r4, lsl #0x1
mov r1, #0x0
bl MI_CpuFill8
mov r0, r6
ldr r1, [sp, #0x24]
mov r2, r5
bl CPSi_big_compare
cmp r0, #0x0
beq _020A4EF0
cmp r0, #0x1
beq _020A4F0C
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
_020A4EF0:
mov r0, r6
mov r2, r7
mov r1, #0x0
bl MI_CpuFill8
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
_020A4F0C:
ldr r2, [sp, #0x24]
mov r0, r6
mov r1, r6
mov r3, r5
bl CPSi_big_sub
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
arm_func_start CPSi_big_modinv
CPSi_big_modinv: ; 0x020A4F2C
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x14
ldr r9, [sp, #0x38]
mov r10, r3
add r11, r9, r10, lsl #0x1
add r8, r11, r10, lsl #0x1
add r7, r8, r10, lsl #0x1
add r6, r7, r10, lsl #0x1
add r5, r6, r10, lsl #0x1
str r0, [sp, #0x8]
mov r0, r1
add r1, r5, r10, lsl #0x1
str r1, [sp, #0x10]
mov r4, r10, lsl #0x1
str r2, [sp, #0xc]
mov r1, r9
mov r2, r4
bl MI_CpuCopy8
ldr r0, [sp, #0xc]
mov r1, r8
mov r2, r4
bl MI_CpuCopy8
mov r0, #0x1
strh r0, [r8, r4]
mov r0, r9
mov r1, r10
bl CPSi_big_sign
cmp r0, #0x0
ble _020A503C
_020A4FA0:
ldr r3, [sp, #0x10]
str r10, [sp, #0x0]
str r3, [sp, #0x4]
mov r0, r11
mov r1, r8
mov r2, r9
mov r3, r5
bl CPSi_big_div
mov r0, r9
mov r1, r8
mov r2, r4
bl MI_CpuCopy8
mov r0, r5
mov r1, r9
mov r2, r4
bl MI_CpuCopy8
mov r0, r5
mov r1, r11
mov r2, r7
mov r3, r10
bl CPSi_big_mult
mov r0, r5
mov r1, r6
mov r2, r5
mov r3, r10
bl CPSi_big_sub
mov r0, r7
mov r1, r6
mov r2, r4
bl MI_CpuCopy8
mov r0, r5
mov r1, r7
mov r2, r4
bl MI_CpuCopy8
mov r0, r9
mov r1, r10
bl CPSi_big_sign
cmp r0, #0x0
bgt _020A4FA0
_020A503C:
ldr r2, [sp, #0xc]
mov r0, r6
mov r1, r6
mov r3, r10
bl CPSi_big_add
ldr r2, [sp, #0xc]
ldr r3, [sp, #0x8]
ldr r4, [sp, #0x10]
str r10, [sp, #0x0]
mov r1, r6
mov r0, #0x0
str r4, [sp, #0x4]
bl CPSi_big_div
add sp, sp, #0x14
ldmia sp!, {r4-r11,lr}
bx lr
arm_func_start CPSi_big_power
CPSi_big_power: ; 0x020A507C
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x1c
ldr r4, _020A5238 ; =CPSiAlloc
mov r8, r3
ldr r3, [r4, #0x0]
mov r10, r0
mov r0, r8, lsl #0x3
ldr r7, [sp, #0x40]
str r1, [sp, #0x8]
mov r9, r2
blx r3
movs r6, r0
addeq sp, sp, #0x1c
ldmeqia sp!, {r4-r11,lr}
bxeq lr
sub r1, r8, #0x1
add r0, r10, #0x2
mov r2, r1, lsl #0x1
mov r1, #0x0
add r11, r6, r8, lsl #0x1
bl MI_CpuFill8
mov r2, #0x1
mov r0, r9
mov r1, r8
strh r2, [r10, #0x0]
bl count_digits
sub r0, r8, r0
mov r5, r0, lsl #0x4
mov r4, r8, lsl #0x4
cmp r5, r4
bhs _020A5140
mov r0, #0x8000
_020A50FC:
sub r1, r8, r5, asr #0x4
sub r1, r1, #0x1
mov r1, r1, lsl #0x1
and r2, r5, #0xf
ldrh r1, [r9, r1]
mov r2, r0, lsr r2
ands r1, r2, r1
beq _020A5134
ldr r0, [sp, #0x8]
mov r1, r10
mov r2, r8, lsl #0x1
bl MI_CpuCopy8
add r5, r5, #0x1
b _020A5140
_020A5134:
add r5, r5, #0x1
cmp r5, r4
blo _020A50FC
_020A5140:
cmp r5, r4
bhs _020A521C
mov r0, r8, lsl #0x1
str r0, [sp, #0xc]
mov r0, #0x0
str r0, [sp, #0x10]
mov r0, #0x8000
str r0, [sp, #0x14]
_020A5160:
mov r0, r6
mov r1, r10
mov r2, r8
bl CPSi_big_sqr
ldr r2, [sp, #0xc]
mov r0, r6
mov r1, r10
bl MI_CpuCopy8
cmp r7, #0x0
beq _020A51A4
ldr r0, [sp, #0x10]
str r8, [sp, #0x0]
mov r1, r10
mov r2, r7
mov r3, r10
str r11, [sp, #0x4]
bl CPSi_big_div
_020A51A4:
sub r0, r8, r5, asr #0x4
sub r0, r0, #0x1
mov r1, r0, lsl #0x1
ldr r0, [sp, #0x14]
and r2, r5, #0xf
mov r2, r0, lsr r2
ldrh r0, [r9, r1]
ands r0, r2, r0
beq _020A5210
ldr r2, [sp, #0x8]
mov r0, r6
mov r1, r10
mov r3, r8
bl CPSi_big_mult
ldr r2, [sp, #0xc]
mov r0, r6
mov r1, r10
bl MI_CpuCopy8
cmp r7, #0x0
beq _020A5210
ldr r0, [sp, #0x10]
str r8, [sp, #0x0]
mov r1, r10
mov r2, r7
mov r3, r10
str r11, [sp, #0x4]
bl CPSi_big_div
_020A5210:
add r5, r5, #0x1
cmp r5, r4
blo _020A5160
_020A521C:
ldr r1, _020A523C ; =CPSiFree
mov r0, r6
ldr r1, [r1, #0x0]
blx r1
add sp, sp, #0x1c
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020A5238: .word CPSiAlloc
_020A523C: .word CPSiFree
arm_func_start CPSi_big_div
CPSi_big_div: ; 0x020A5240
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x24
ldr r9, [sp, #0x48]
ldr r6, [sp, #0x4c]
str r1, [sp, #0x4]
add r5, r6, r9, lsl #0x1
str r0, [sp, #0x0]
mov r10, r2
mov r0, r5
mov r2, r9, lsl #0x2
mov r1, #0x0
str r3, [sp, #0x8]
add r4, r5, r9, lsl #0x1
bl MI_CpuFill8
ldr r0, [sp, #0x4]
mov r1, r9
bl count_digits
mov r11, r0
mov r0, r10
mov r1, r9
bl count_digits
mov r7, r0
cmp r11, #0x0
ble _020A53E8
cmp r7, #0x0
ble _020A53E8
sub r0, r9, r11
add r0, r7, r0
sub r8, r0, #0x1
cmp r8, r9
blt _020A52D0
ldr r0, [sp, #0x4]
mov r1, r4
mov r2, r9, lsl #0x1
bl MI_CpuCopy8
b _020A53E8
_020A52D0:
ldr r0, [sp, #0x4]
add r1, r5, r8, lsl #0x1
mov r2, r11, lsl #0x1
bl MI_CpuCopy8
cmp r7, #0x2
ble _020A5304
add r0, r10, r7, lsl #0x1
sub r0, r0, #0x2
mov r7, r7, lsl #0x1
bl get48bits_3
str r0, [sp, #0x14]
str r1, [sp, #0x10]
b _020A5340
_020A5304:
cmp r7, #0x1
ble _020A5328
add r0, r10, r7, lsl #0x1
sub r0, r0, #0x2
mov r7, r7, lsl #0x1
bl get48bits_2
str r0, [sp, #0x14]
str r1, [sp, #0x10]
b _020A5340
_020A5328:
add r0, r10, r7, lsl #0x1
sub r0, r0, #0x2
mov r7, r7, lsl #0x1
bl get48bits_1
str r0, [sp, #0x14]
str r1, [sp, #0x10]
_020A5340:
cmp r8, r9
bge _020A53E8
mov r0, r9, lsl #0x1
sub r0, r0, #0x1
mov r11, r0, lsl #0x1
add r0, r4, r7
str r0, [sp, #0x1c]
_020A535C:
mov r1, r5
add r0, r5, #0x2
mov r2, r11
bl memmove
ldr r0, [sp, #0x1c]
bl get64bits
ldr r2, [sp, #0x14]
ldr r3, [sp, #0x10]
bl _ll_udiv
mov r7, r0
ldr r0, _020A5434 ; =0x0000FFFF
cmp r7, r0
movhi r7, r0
_020A5390:
mov r2, r7, lsl #0x10
mov r0, r6
mov r1, r10
mov r2, r2, lsr #0x10
mov r3, r9
bl CPSi_big_mult_small
mov r0, r4
mov r1, r6
mov r2, r9
bl CPSi_big_compare
cmp r0, #0x0
sublt r7, r7, #0x1
blt _020A5390
mov r0, r4
mov r1, r4
mov r2, r6
mov r3, r9
bl CPSi_big_sub
strh r7, [r5, #0x0]
add r8, r8, #0x1
cmp r8, r9
blt _020A535C
_020A53E8:
ldr r0, [sp, #0x0]
cmp r0, #0x0
beq _020A5404
ldr r1, [sp, #0x0]
mov r0, r5
mov r2, r9, lsl #0x1
bl MI_CpuCopy8
_020A5404:
ldr r0, [sp, #0x8]
cmp r0, #0x0
addeq sp, sp, #0x24
ldmeqia sp!, {r4-r11,lr}
bxeq lr
ldr r1, [sp, #0x8]
mov r0, r4
mov r2, r9, lsl #0x1
bl MI_CpuCopy8
add sp, sp, #0x24
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020A5434: .word 0x0000FFFF
arm_func_start CPSi_big_sqr
CPSi_big_sqr: ; 0x020A5438
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
mov r9, r1
mov r8, r2
mov r10, r0
mov r0, r9
mov r1, r8
bl count_digits
mov r11, r0
mov r0, r11, lsl #0x1
cmp r0, r8
bge _020A547C
sub r1, r8, r0
add r0, r10, r0, lsl #0x1
mov r2, r1, lsl #0x1
mov r1, #0x0
bl MI_CpuFill8
_020A547C:
cmp r11, #0x0
mov r1, #0x0
ble _020A54D4
mov r0, r1
sub r4, r8, #0x1
_020A5490:
cmp r0, r8
bge _020A54D4
mov r2, r1, lsl #0x1
ldrh r5, [r9, r2]
mov r2, r0, lsl #0x1
cmp r0, r4
mul r3, r5, r5
strh r3, [r10, r2]
beq _020A54D4
add r2, r0, #0x1
add r1, r1, #0x1
mov r3, r3, lsr #0x10
mov r2, r2, lsl #0x1
strh r3, [r10, r2]
cmp r1, r11
add r0, r0, #0x2
blt _020A5490
_020A54D4:
cmp r11, #0x0
mov r6, #0x0
addle sp, sp, #0x4
ldmleia sp!, {r4-r11,lr}
bxle lr
_020A54E8:
add r7, r6, #0x1
b _020A5554
_020A54F0:
mov r1, r7, lsl #0x1
mov r0, r6, lsl #0x1
ldrh r1, [r9, r1]
ldrh r0, [r9, r0]
mul r4, r1, r0
ldr r0, _020A5580 ; =0x7FFF8000
cmp r4, r0
bhi _020A5528
mov r0, r10
mov r2, r5
mov r3, r8
mov r1, r4, lsl #0x1
bl CPSi_big_add_part
b _020A5550
_020A5528:
mov r0, r10
mov r1, r4
mov r2, r5
mov r3, r8
bl CPSi_big_add_part
mov r0, r10
mov r1, r4
mov r2, r5
mov r3, r8
bl CPSi_big_add_part
_020A5550:
add r7, r7, #0x1
_020A5554:
cmp r7, r11
bge _020A5568
add r5, r6, r7
cmp r5, r8
blt _020A54F0
_020A5568:
add r6, r6, #0x1
cmp r6, r11
blt _020A54E8
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020A5580: .word 0x7FFF8000
arm_func_start CPSi_big_mult_small
CPSi_big_mult_small: ; 0x020A5584
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r1
mov r4, r3
mov r7, r0
mov r0, r6
mov r1, r4
mov r5, r2
bl count_digits
mov r3, #0x0
mov r12, r3
cmp r0, #0x0
ble _020A55D8
_020A55B8:
mov r2, r12, lsl #0x1
ldrh r1, [r6, r2]
add r12, r12, #0x1
cmp r12, r0
mla r1, r5, r1, r3
strh r1, [r7, r2]
mov r3, r1, lsr #0x10
blt _020A55B8
_020A55D8:
cmp r12, r4
movlt r0, r12, lsl #0x1
addlt r12, r12, #0x1
sub r1, r4, r12
strlth r3, [r7, r0]
mov r2, r1, lsl #0x1
add r0, r7, r12, lsl #0x1
mov r1, #0x0
bl MI_CpuFill8
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start CPSi_big_mult
CPSi_big_mult: ; 0x020A5608
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0xc
mov r8, r3
mov r10, r1
mov r9, r2
mov r2, r8, lsl #0x1
mov r1, #0x0
mov r11, r0
bl MI_CpuFill8
mov r0, r10
mov r1, r8
bl count_digits
mov r5, r0
mov r0, r9
mov r1, r8
bl count_digits
str r0, [sp, #0x0]
cmp r0, #0x0
mov r7, #0x0
addle sp, sp, #0xc
ldmleia sp!, {r4-r11,lr}
bxle lr
str r7, [sp, #0x4]
_020A5664:
ldr r6, [sp, #0x4]
sub r4, r8, r7
b _020A5698
_020A5670:
mov r1, r6, lsl #0x1
mov r0, r7, lsl #0x1
ldrh r2, [r10, r1]
ldrh r1, [r9, r0]
mov r0, r11
mov r3, r8
mul r1, r2, r1
add r2, r7, r6
bl CPSi_big_add_part
add r6, r6, #0x1
_020A5698:
cmp r6, r5
bge _020A56A8
cmp r6, r4
blt _020A5670
_020A56A8:
ldr r0, [sp, #0x0]
add r7, r7, #0x1
cmp r7, r0
blt _020A5664
add sp, sp, #0xc
ldmia sp!, {r4-r11,lr}
bx lr
arm_func_start CPSi_big_add_part
CPSi_big_add_part: ; 0x020A56C4
stmdb sp!, {lr}
sub sp, sp, #0x4
b _020A56E8
_020A56D0:
mov lr, r2, lsl #0x1
ldrh r12, [r0, lr]
add r2, r2, #0x1
add r1, r1, r12
strh r1, [r0, lr]
mov r1, r1, lsr #0x10
_020A56E8:
cmp r1, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {lr}
bxeq lr
cmp r2, r3
blt _020A56D0
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start CPSi_big_compare
CPSi_big_compare:
subs r12, r2, #0x1
bmi _020A5740
_020A5714:
mov r2, r12, lsl #0x1
ldrh r3, [r1, r2]
ldrh r2, [r0, r2]
cmp r2, r3
movhi r0, #0x1
bxhi lr
cmp r2, r3
mvncc r0, #0x0
bxcc lr
subs r12, r12, #0x1
bpl _020A5714
_020A5740:
mov r0, #0x0
bx lr
arm_func_start CPSi_big_subsmall
CPSi_big_subsmall: ; 0x020A5748
stmdb sp!, {r4,lr}
cmp r3, #0x0
mov r4, #0x0
ble _020A5780
_020A5758:
mov lr, r4, lsl #0x1
ldrh r12, [r1, lr]
sub r12, r12, r2
mov r2, r12, lsr #0x10
strh r12, [r0, lr]
ands r2, r2, #0x1
beq _020A5780
add r4, r4, #0x1
cmp r4, r3
blt _020A5758
_020A5780:
cmp r0, r1
ldmeqia sp!, {r4,lr}
bxeq lr
add r4, r4, #0x1
cmp r4, r3
ldmgeia sp!, {r4,lr}
bxge lr
_020A579C:
mov r12, r4, lsl #0x1
ldrh r2, [r1, r12]
add r4, r4, #0x1
cmp r4, r3
strh r2, [r0, r12]
blt _020A579C
ldmia sp!, {r4,lr}
bx lr
arm_func_start CPSi_big_sub
CPSi_big_sub: ; 0x020A57BC
stmdb sp!, {r4-r8,lr}
mov r7, r1
mov r5, r3
mov r8, r0
mov r6, r2
mov r0, r7
mov r1, r5
bl count_digits
mov r4, r0
mov r0, r6
mov r1, r5
bl count_digits
cmp r4, r0
movlt r4, r0
mov r3, #0x0
cmp r4, r5
addne r4, r4, #0x1
mov r12, r3
b _020A5828
_020A5808:
mov r2, r12, lsl #0x1
ldrh r1, [r7, r2]
ldrh r0, [r6, r2]
add r12, r12, #0x1
sub r0, r1, r0
add r0, r3, r0
strh r0, [r8, r2]
mov r3, r0, asr #0x10
_020A5828:
cmp r12, r4
blt _020A5808
cmp r12, r5
bge _020A5840
cmp r3, #0x0
bne _020A5808
_020A5840:
cmp r8, r7
ldmeqia sp!, {r4-r8,lr}
bxeq lr
cmp r8, r6
ldmeqia sp!, {r4-r8,lr}
bxeq lr
sub r1, r5, r12
add r0, r8, r12, lsl #0x1
mov r2, r1, lsl #0x1
mov r1, #0x0
bl MI_CpuFill8
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start CPSi_big_negate
CPSi_big_negate: ; 0x020A5874
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r3, r1
cmp r3, #0x0
mov r12, #0x0
ble _020A58A8
_020A588C:
mov r2, r12, lsl #0x1
ldrh r1, [r0, r2]
add r12, r12, #0x1
cmp r12, r3
mvn r1, r1
strh r1, [r0, r2]
blt _020A588C
_020A58A8:
mov r1, r0
mov r2, #0x1
bl CPSi_big_add_small
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start CPSi_big_add_small
CPSi_big_add_small: ; 0x020A58C0
stmdb sp!, {r4,lr}
cmp r3, #0x0
mov r4, #0x0
ble _020A58F4
_020A58D0:
mov lr, r4, lsl #0x1
ldrh r12, [r1, lr]
add r2, r2, r12
strh r2, [r0, lr]
movs r2, r2, lsr #0x10
beq _020A58F4
add r4, r4, #0x1
cmp r4, r3
blt _020A58D0
_020A58F4:
cmp r0, r1
ldmeqia sp!, {r4,lr}
bxeq lr
add r4, r4, #0x1
cmp r4, r3
ldmgeia sp!, {r4,lr}
bxge lr
_020A5910:
mov r12, r4, lsl #0x1
ldrh r2, [r1, r12]
add r4, r4, #0x1
cmp r4, r3
strh r2, [r0, r12]
blt _020A5910
ldmia sp!, {r4,lr}
bx lr
arm_func_start CPSi_big_add
CPSi_big_add: ; 0x020A5930
stmdb sp!, {r4-r8,lr}
mov r7, r1
mov r5, r3
mov r8, r0
mov r6, r2
mov r0, r7
mov r1, r5
bl count_digits
mov r4, r0
mov r0, r6
mov r1, r5
bl count_digits
cmp r4, r0
movlt r4, r0
cmp r4, r5
addne r4, r4, #0x1
mov r3, #0x0
mov r12, r3
cmp r4, #0x0
ble _020A59A8
_020A5980:
mov r2, r12, lsl #0x1
ldrh r1, [r7, r2]
ldrh r0, [r6, r2]
add r12, r12, #0x1
cmp r12, r4
add r0, r1, r0
add r0, r3, r0
strh r0, [r8, r2]
mov r3, r0, lsr #0x10
blt _020A5980
_020A59A8:
cmp r8, r7
ldmeqia sp!, {r4-r8,lr}
bxeq lr
cmp r8, r6
ldmeqia sp!, {r4-r8,lr}
bxeq lr
sub r1, r5, r12
add r0, r8, r12, lsl #0x1
mov r2, r1, lsl #0x1
mov r1, #0x0
bl MI_CpuFill8
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start CPSi_big_sign
CPSi_big_sign:
stmdb sp!, {lr}
sub sp, sp, #0x4
sub r2, r1, #0x1
mov r2, r2, lsl #0x1
ldrh r2, [r0, r2]
ands r2, r2, #0x8000
addne sp, sp, #0x4
mvnne r0, #0x0
ldmneia sp!, {lr}
bxne lr
bl count_digits
cmp r0, #0x0
movne r0, #0x1
moveq r0, #0x0
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start count_digits
count_digits:
b _020A5A28
_020A5A24:
sub r1, r1, #0x1
_020A5A28:
cmp r1, #0x0
beq _020A5A44
sub r2, r1, #0x1
mov r2, r2, lsl #0x1
ldrh r2, [r0, r2]
cmp r2, #0x0
beq _020A5A24
_020A5A44:
mov r0, r1
bx lr