avr-fw-modules/core/src/fp4816_to_float_asm.S

126 lines
1.4 KiB
ArmAsm
Executable File

.global fp4816_to_float
fp4816_to_float:
; fp4816_t (int64) r18:r25
; return: float r22:r25
;
; work: float r12:r15
; exp r17
push r17
push r16
push r15
push r14
push r13
push r12
eor r15, r15
eor r14, r14
eor r13, r13
eor r12, r12
cp r18, r1
cpc r19, r1
cpc r20, r1
cpc r21, r1
cpc r22, r1
cpc r23, r1
cpc r24, r1
cpc r25, r1
breq _exit
ldi r17, 0x2f ; 47d
; value < 0 : SIGN=1, value * -1
sbrs r25, 7
rjmp _l1
ldi r16, 0x80
or r15, r16
com r25
com r24
com r23
com r22
com r21
com r20
com r19
com r18
ldi r16, 0x01
add r18, r16
adc r19, r1
adc r20, r1
adc r21, r1
adc r22, r1
adc r23, r1
adc r24, r1
adc r25, r1
_l1:
; exponent bestimmen
tst r25
brne _l2
mov r25, r24
mov r24, r23
mov r23, r22
mov r22, r21
mov r21, r20
mov r20, r19
mov r19, r18
eor r18, r18
ldi r16, 0x08
sub r17, r16
rjmp _l1
_l2:
mov r16, r25
andi r16, 0x80
brne _l3
clc
rol r18
rol r19
rol r20
rol r21
rol r22
rol r23
rol r24
rol r25
dec r17
rjmp _l2
_l3:
; Mantisse schreiben
mov r12, r23
mov r13, r24
mov r14, r25
ldi r16, 0x7F
and r14, r16
; exponent schreiben
add r17, r16
ldi r16, 0x80
sbrc r17, 0
or r14, r16
lsr r17
or r15, r17
_exit:
movw r22, r12
movw r24, r14
pop r12
pop r13
pop r14
pop r15
pop r16
pop r17
ret