1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
/* -*- Mode: Asm -*- */
/*
fp_split.S is part of FPlib V 0.3.0 ported to avr-as
for copyright and details see readme.fplib
*----------------------------------------------------------------------------------------------
* split up in exponent : fraction : fraction extention
* x rA3 rA2:rA1:rA0: rAE
* y rB3 rB2:rB1:rB0: rBE
* signs are lost !
*
* if defined FPLIB_CHECK_FOR_NAN
* does not return to calling function in case of NaN !
* -> call fp_split before pushing locals to stack!!!
*
* split 2 incoming operands , x and y, y first
*/
#include "gasava.inc"
#include "fplib.inc"
TEXT_SEG(fplib, __fp_split)
FUNCTION(__fp_split3)
GLOBAL(__fp_split3)
MOV rT0,rB3 ;
EOR rT0,rA3 ;
BST rT0,7 ; different signs : T = 1
GLOBAL(__fp_split2)
ADD rB2,rB2 ; MSB of exponent to carry
adc rB3,rB3 ; whole exponent in rB3, sign in C
CPI rB3,0xFF ; check for NAN
BREQ fp_split_nan ; if no jump then C as hidden one is set
CLR rBE ; clear fraction extension
cp rBE,rB3 ; set C if nonzero exponent. -MM 2000-11-25
brcs 1f
ldi rB3,1 ; zero exponent really means 1 with hidden bit = 0
1:
ROR rB2 ; sets hidden bit
GLOBAL(__fp_split1)
ADD rA2,rA2 ; MSB of exponent to carry
adc rA3,rA3 ; whole exponent in rA3, sign in C
CPI rA3,0xFF ; if no jump then C as hidden one is set
BREQ fp_split_nan
CLR rAE ; clear fraction extension
cp rAE,rA3 ; set C if nonzero exponent. -MM 2000-11-25
brcs 1f
ldi rA3,1 ; zero exponent really means 1 with hidden bit = 0
1:
ROR rA2 ; sets hidden bit
RET
fp_split_nan:
POP rA3
POP rA3 ; pop return adress
#ifdef __ERRNO__
LDI rA3,EDOM ; NaN is argument domain error !
#endif
RJMP _U(__fp_nan)
ENDFUNC
|