~ubuntu-branches/ubuntu/raring/avr-libc/raring-proposed

« back to all changes in this revision

Viewing changes to libm/fplib/fp_rempio2.S

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2008-04-04 17:05:32 UTC
  • mto: This revision was merged to the branch mainline in revision 8.
  • Revision ID: james.westby@ubuntu.com-20080404170532-t84huz4qk2928pt3
Tags: upstream-1.6.2
ImportĀ upstreamĀ versionĀ 1.6.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (c) 2002  Michael Stumpf  <mistumpf@de.pepperl-fuchs.com>
 
2
   Copyright (c) 2006  Dmitry Xmelkov
 
3
   All rights reserved.
 
4
 
 
5
   Redistribution and use in source and binary forms, with or without
 
6
   modification, are permitted provided that the following conditions are met:
 
7
 
 
8
   * Redistributions of source code must retain the above copyright
 
9
     notice, this list of conditions and the following disclaimer.
 
10
   * Redistributions in binary form must reproduce the above copyright
 
11
     notice, this list of conditions and the following disclaimer in
 
12
     the documentation and/or other materials provided with the
 
13
     distribution.
 
14
   * Neither the name of the copyright holders nor the names of
 
15
     contributors may be used to endorse or promote products derived
 
16
     from this software without specific prior written permission.
 
17
 
 
18
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 
19
   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
20
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
21
   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 
22
   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
23
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
24
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
25
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
26
   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
27
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
28
   POSSIBILITY OF SUCH DAMAGE. */
 
29
 
 
30
/* $Id: fp_rempio2.S,v 1.1 2007/01/14 14:58:04 dmix Exp $ */
 
31
 
 
32
#include "fp32def.h"
 
33
#include "asmdef.h"
 
34
 
 
35
/* <non_standart> __fp_rempio2 (float x);
 
36
     The __fp_rempio2() function computes the remainder of dividing
 
37
     absolute value of x by Pi/2. The return value is x - n*Pi/2, where
 
38
     n is the quotient of abs(x)/(Pi/2), rounded towards zero to an integer.
 
39
   Output:
 
40
        rA3.rA2.rA1.rA0.rAE     - flt40_t remainder
 
41
        ZL                      - low byte of n
 
42
 */
 
43
 
 
44
#define HI40_PIO2       0x3FC90FDA      /* (flt40_t) Pi/2       */
 
45
#define LO40_PIO2       0xA2
 
46
#define MNT32_PIO2      0xC90FDAA2      /* mantissa of Pi/2, 32 bits    */
 
47
#define SPLIT_PIO2      0x7FC80FDA      /* split(HI40_PIO2)     */
 
48
 
 
49
FUNCTION __fp_rempio2
 
50
 
 
51
0:      rjmp    _U(__fp_nan)
 
52
 
 
53
ENTRY __fp_rempio2
 
54
  ; split and check finite
 
55
        rcall   _U(__fp_splitA)
 
56
        brcs    0b              ; only finite numbers are valid
 
57
        clt                     ; ignore a sign
 
58
  ; init division result ('com' at the end)
 
59
        ldi     ZL, -1
 
60
  ; compare A with Pi/2
 
61
        clr     rAE
 
62
        ldi     rB1,  hi8(SPLIT_PIO2 + 1)
 
63
        ldi     rB2, hlo8(SPLIT_PIO2 + 1)
 
64
        ldi     rB3, hhi8(SPLIT_PIO2 + 1)
 
65
        cpi     rA0,  lo8(SPLIT_PIO2 + 1)
 
66
        cpc     rA1, rB1
 
67
        cpc     rA2, rB2
 
68
        cpc     rA3, rB3
 
69
        brlo    .L_pack                 ; A < Pi/2 ==> return A
 
70
  ; prepare loop
 
71
        clr     ZH                              ; highest A byte
 
72
        subi    rA3, hhi8(HI40_PIO2 << 1)       ; ilogb(A) - ilogb(B)
 
73
.Loop:
 
74
        subi    rAE,  lo8(MNT32_PIO2)
 
75
        sbci    rA0,  hi8(MNT32_PIO2)
 
76
        sbci    rA1, hlo8(MNT32_PIO2)
 
77
        sbci    rA2, hhi8(MNT32_PIO2)
 
78
        sbci    ZH, 0
 
79
        brpl    5f
 
80
        subi    rAE,  lo8(-MNT32_PIO2)
 
81
        sbci    rA0,  hi8(-MNT32_PIO2)
 
82
        sbci    rA1, hlo8(-MNT32_PIO2)
 
83
        sbci    rA2, hhi8(-MNT32_PIO2)
 
84
        sbci    ZH, -1
 
85
        sec
 
86
5:      rol     ZL
 
87
        subi    rA3, 1
 
88
        brlo    6f
 
89
        lsl     rAE
 
90
        rol     rA0
 
91
        rol     rA1
 
92
        rol     rA2
 
93
        rol     ZH
 
94
        rjmp    .Loop
 
95
6:
 
96
  ; normalize
 
97
        /* FIXME: Is it possible to obtain a zero value in rA2.1.0.E ?
 
98
           I do't known. So, there is a check in exponent decrement.    */
 
99
        ldi     rA3, hhi8((HI40_PIO2 << 1) - 0x01000000)
 
100
7:      tst     rA2
 
101
        brmi    8f
 
102
        lsl     rAE
 
103
        rol     rA0
 
104
        rol     rA1
 
105
        rol     rA2
 
106
        dec     rA3
 
107
        brne    7b
 
108
8:      inc     rA3
 
109
.L_pack:
 
110
        com     ZL
 
111
        rjmp    _U(__fp_mpack)
 
112
ENDFUNC