mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-07-22 02:10:53 -05:00
158 lines
2.6 KiB
ArmAsm
158 lines
2.6 KiB
ArmAsm
.include "macros/function.inc"
|
|
.include "include/_f_mul.inc"
|
|
|
|
|
|
|
|
.text
|
|
|
|
arm_func_start _fmul
|
|
arm_func_start _f_mul
|
|
_fmul:
|
|
_f_mul: ; 0x020E18B0
|
|
eor r2, r0, r1
|
|
and r2, r2, #0x80000000
|
|
mov ip, #0xff
|
|
ands r3, ip, r0, lsr #23
|
|
mov r0, r0, lsl #8
|
|
cmpne r3, #0xff
|
|
beq _020E192C
|
|
orr r0, r0, #0x80000000
|
|
ands ip, ip, r1, lsr #23
|
|
mov r1, r1, lsl #8
|
|
cmpne ip, #0xff
|
|
beq _020E196C
|
|
orr r1, r1, #0x80000000
|
|
_020E18E4:
|
|
add ip, r3, ip
|
|
umull r1, r3, r0, r1
|
|
movs r0, r3
|
|
addpl r0, r0, r0
|
|
subpl ip, ip, #1
|
|
subs ip, ip, #0x7f
|
|
bmi _020E19F8
|
|
cmp ip, #0xfe
|
|
bge _020E1A64
|
|
ands r3, r0, #0xff
|
|
orr r0, r2, r0, lsr #8
|
|
add r0, r0, ip, lsl #23
|
|
tst r3, #0x80
|
|
bxeq lr
|
|
orrs r1, r1, r3, lsl #25
|
|
andeqs r3, r0, #1
|
|
addne r0, r0, #1
|
|
bx lr
|
|
_020E192C:
|
|
cmp r3, #0
|
|
beq _020E1980
|
|
movs r0, r0, lsl #1
|
|
bne __f_result_x_NaN
|
|
mov ip, r1, lsr #0x17
|
|
mov r1, r1, lsl #9
|
|
ands ip, ip, #0xff
|
|
beq _020E1960
|
|
cmp ip, #0xff
|
|
blt __f_result_INF
|
|
cmp r1, #0
|
|
beq __f_result_INF
|
|
b __f_result_x_NaN
|
|
_020E1960:
|
|
cmp r1, #0
|
|
beq __f_result_invalid
|
|
b __f_result_INF
|
|
_020E196C:
|
|
cmp ip, #0
|
|
beq _020E19DC
|
|
_020E1974:
|
|
movs r1, r1, lsl #1
|
|
bne __f_result_x_NaN
|
|
b __f_result_INF
|
|
_020E1980:
|
|
movs r0, r0, lsl #1
|
|
beq _020E19B8
|
|
mov r0, r0, lsr #1
|
|
clz r3, r0
|
|
movs r0, r0, lsl r3
|
|
rsb r3, r3, #1
|
|
mov ip, r1, lsr #0x17
|
|
mov r1, r1, lsl #8
|
|
ands ip, ip, #0xff
|
|
beq _020E19DC
|
|
cmp ip, #0xff
|
|
beq _020E1974
|
|
orr r1, r1, #0x80000000
|
|
b _020E18E4
|
|
_020E19B8:
|
|
mov ip, r1, lsr #0x17
|
|
mov r1, r1, lsl #9
|
|
ands ip, ip, #0xff
|
|
beq _020E1A88
|
|
cmp ip, #0xff
|
|
blt _020E1A88
|
|
cmp r1, #0
|
|
beq __f_result_invalid
|
|
b __f_result_x_NaN
|
|
_020E19DC:
|
|
movs r1, r1, lsl #1
|
|
beq _020E1A88
|
|
mov r1, r1, lsr #1
|
|
clz ip, r1
|
|
movs r1, r1, lsl ip
|
|
rsb ip, ip, #1
|
|
b _020E18E4
|
|
_020E19F8:
|
|
cmn ip, #0x18
|
|
beq _020E1A40
|
|
bmi _020E1A80
|
|
cmp r1, #0
|
|
orrne r0, r0, #1
|
|
mov r3, r0
|
|
mov r0, r0, lsr #8
|
|
rsb ip, ip, #0
|
|
orr r0, r2, r0, lsr ip
|
|
rsb ip, ip, #0x18
|
|
movs r1, r3, lsl ip
|
|
bxeq lr
|
|
tst r1, #-0x80000000
|
|
bxeq lr
|
|
movs r1, r1, lsl #1
|
|
andeqs r1, r0, #1
|
|
addne r0, r0, #1
|
|
bx lr
|
|
_020E1A40:
|
|
mov r0, r0, lsl #1
|
|
b _020E1A70
|
|
arm_func_end _f_mul
|
|
|
|
arm_func_start __f_result_INF
|
|
__f_result_INF: ; 0x020E1A48
|
|
mov r0, #-0x1000000
|
|
orr r0, r2, r0, lsr #1
|
|
bx lr
|
|
arm_func_end __f_result_INF
|
|
|
|
arm_func_start __f_result_x_NaN
|
|
__f_result_x_NaN: ; 0x020E1A54
|
|
mvn r0, #0x80000000
|
|
bx lr
|
|
arm_func_end __f_result_x_NaN
|
|
|
|
arm_func_start __f_result_invalid
|
|
__f_result_invalid: ; 0x020E1A5C
|
|
mvn r0, #0x80000000
|
|
bx lr
|
|
_020E1A64:
|
|
mov r0, #-0x1000000
|
|
orr r0, r2, r0, lsr #1
|
|
bx lr
|
|
_020E1A70:
|
|
movs r1, r0
|
|
mov r0, r2
|
|
addne r0, r0, #1
|
|
bx lr
|
|
_020E1A80:
|
|
mov r0, r2
|
|
bx lr
|
|
_020E1A88:
|
|
mov r0, r2
|
|
bx lr
|
|
arm_func_end __f_result_invalid |