~ubuntu-branches/ubuntu/gutsy/avr-libc/gutsy

« back to all changes in this revision

Viewing changes to libm/fplib/ldexp.S

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2006-05-01 12:03:39 UTC
  • mto: (3.1.1 edgy)
  • mto: This revision was merged to the branch mainline in revision 4.
  • Revision ID: james.westby@ubuntu.com-20060501120339-q93dxulpunby36dj
Tags: upstream-1.4.4
ImportĀ upstreamĀ versionĀ 1.4.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*  -*- Mode: Asm -*-  */
2
2
 
3
3
/* Copyright (c) 2002  Michael Stumpf  <mistumpf@de.pepperl-fuchs.com>
 
4
   Copyright (c) 2005  Anatoly Sokolov <aesok@post.ru>
4
5
   All rights reserved.
5
6
 
6
7
 
32
33
   POSSIBILITY OF SUCH DAMAGE. 
33
34
*/
34
35
 
 
36
/* $Id: ldexp.S,v 1.7.2.3 2006/01/06 14:30:17 aesok Exp $ */
 
37
 
35
38
/*
36
39
    ldexp.S is part of     FPlib V 0.3.0       ported to avr-as
37
40
    for details see readme.fplib
43
46
 * double y = ldexp( 3.45, 2 ) = 2^2 * 3.45 = 13.8
44
47
 */
45
48
 
46
 
#if !defined(DOXYGEN)
 
49
#if !defined(__DOXYGEN__)
47
50
 
48
51
#include "gasava.inc"
 
52
#include "macros.inc"
49
53
#include "fplib.inc"
50
54
 
51
 
          TEXT_SEG(fplib, ldexp)
52
 
          FUNCTION(ldexp)
 
55
#define rExpH   rBE
 
56
 
 
57
        TEXT_SEG(fplib, ldexp)
 
58
        FUNCTION(ldexp)
53
59
 
54
60
GLOBAL(ldexp)
55
 
        BST     rA3,7
56
 
        RCALL   _U(__fp_split1)         ; clears rAE
 
61
        RCALL   _U(__fp_split_a)        ; Non return if NaN; clears rAE
 
62
 
57
63
        TST     rA3                     ;
58
 
        BREQ    _ldexp_01               ; 2^x*0 = 0
59
 
        CPI     rPH,0xFF
60
 
        BREQ    _ldexp_10               ; negative
61
 
        TST     rPH
62
 
        BREQ    _ldexp_10
63
 
                                ; overflow or underflow
64
 
 _dlexp_00:
65
 
        BRPL    _ldexp_NaN              ; overflow
66
 
 _ldexp_01:
 
64
        BREQ    .L_zero                 ; 2^x*0 = 0
 
65
        
 
66
        CLR     rExpH
 
67
        ADD     rA3, rPL                ; rExpH.rA3 := sum of exponent and arg
 
68
        ADC     rExpH, rPH
 
69
 
 
70
        BRVS    .L_Inf                  ; overflow is possible for positive only
 
71
        BRMI    .L_zero                 ; if underflow return 0
 
72
 
 
73
        LDI     rPL, lo8(EMAX)
 
74
        LDI     rPH, hi8(EMAX)
 
75
        CP      rA3, rPL
 
76
        CPC     rExpH, rPH
 
77
        BRGE    .L_Inf                  ; if overflow return +/-Inf
 
78
        
 
79
        RJMP    _U(__fp_merge)          ; rT0 must not be cleared : rAE=0 no rounding anyway
 
80
 
 
81
.L_zero:
67
82
        RJMP    _U(__fp_zero)
68
 
 _ldexp_NaN:
69
 
        RJMP    _U(__fp_nanERANGE)      ; overflow
70
 
 
71
 
 _ldexp_10:
72
 
        ADD     rA3,rPL
73
 
        adc     rT1c,rPH                ;
74
 
                                ; check for overflow
75
 
        BRNE    _ldexp_20
76
 
 _ldexp_20:
77
 
        RJMP    _U(__fp_merge)          ; rT0 must not be cleared : rAE=0 no rounding anyway
78
 
 
79
 
          ENDFUNC
80
 
 
81
 
#endif /* not DOXYGEN */
 
83
 
 
84
.L_Inf:
 
85
        BRTS    .L_mInf                 ; branch if arg negative
 
86
        RJMP    _U(__fp_p_inf)
 
87
.L_mInf:
 
88
        RJMP    _U(__fp_m_inf)
 
89
 
 
90
        ENDFUNC
 
91
 
 
92
#endif /* not __DOXYGEN__ */