forked from haraldwolff/avr-fw-modules
126 lines
1.4 KiB
ArmAsm
Executable File
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 |