~ubuntu-branches/ubuntu/breezy/avr-libc/breezy

« back to all changes in this revision

Viewing changes to libm/fplib/log.S

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2002-04-15 14:53:38 UTC
  • Revision ID: james.westby@ubuntu.com-20020415145338-c8hi0tn5bx74w7o3
Tags: upstream-20020203
ImportĀ upstreamĀ versionĀ 20020203

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  -*- Mode: Asm -*-  */
 
2
/*
 
3
    log.S is part of     FPlib V 0.3.0       ported to avr-as
 
4
    for copyright and details see readme.fplib
 
5
 
 
6
 *----------------------------------------------------------------------------------------
 
7
 *
 
8
 *      A = log(A)
 
9
 *
 
10
 * log( x ) = exponent(x)*ln(2) + log(matissae(x))
 
11
 *
 
12
 *
 
13
 * x = [0.5,1.0[
 
14
 * z = (x*sqrt(2)-1)/(x*sqrt(2)+1) = (x - 1/sqrt(2)/(x+1/sqrt(2))
 
15
 * log( x ) =  ((F2 * z*z + F1)*z*z + F0)*z - ln(sqrt(2))
 
16
 *             P0 + x (P1 + x * (P2 + x * (P3 + x * (P4 + x * P5))))
 
17
 *          =  -----------------------------------------------------
 
18
 *             Q0 + x (Q1 + x * (Q2 + x * (Q3 + x * (Q4 + x * Q5))))
 
19
 * P0 = -3.42819 [C0 5B 67 82]
 
20
 * P1 = -7.05769 [C0 E1 D8 A1]
 
21
 * P2 = -20.5693 [C1 A4 8D D9]
 
22
 * P3 = 9.48417  [41 17 BF 24]
 
23
 * P4 = 6.09923  [40 C3 2C E2]
 
24
 * P5 = 15.4718  [41 77 8C 4F]
 
25
 * Q0 = 1        [3F 80 00 00]
 
26
 * Q1 = 7.07107  [40 E2 46 30]
 
27
 * Q2 = 20       [41 A0 00 00]
 
28
 * Q3 = 28.2843  [41 E2 46 32]
 
29
 * Q4 = 20       [41 A0 00 01]
 
30
 * Q5 = 5.65685  [40 B5 04 F4]
 
31
 */
 
32
 
 
33
 
 
34
#include "gasava.inc"
 
35
#include "fplib.inc"
 
36
 
 
37
          TEXT_SEG(fplib, log)
 
38
          FUNCTION(log)
 
39
 
 
40
GLOBAL(log)
 
41
   SBRC  rA3,7
 
42
   RJMP  _U(__fp_nanEDOM)       ; A < 0 argument range error
 
43
 _log_10:
 
44
   RCALL _U(__fp_split1)
 
45
   TST   rA3
 
46
   BRNE  _log_20
 
47
   RJMP  _U(__fp_nanEDOM)       ; A == 0 argument range error
 
48
 
 
49
 _log_20:
 
50
   PUSH  rS0
 
51
   PUSH  rS1
 
52
   PUSH  rS2
 
53
   PUSH  rS3
 
54
   MOV   rS3,rA3
 
55
   LDI   rA3,0x3F               ; load 0x7E as exponent =>
 
56
   ANDI  rA2,0x7F               ; 2^-1 * 1.m = [0.5..1.0[
 
57
 
 
58
   LDI     ZL,LOW(table_log)
 
59
   LDI     ZH,HIGH(table_log)
 
60
   RCALL   _U(fp_powerseries)
 
61
 
 
62
   MOV    rT0,rS3
 
63
   MOV    rS3,rA3
 
64
   MOV    rS2,rA2
 
65
   MOV    rS1,rA1
 
66
   MOV    rS0,rA0
 
67
   MOV    rA0,rT0
 
68
   SUBI   rA0,0x7E
 
69
   SBC    rA1,rA1
 
70
   MOV    rA2,rA1
 
71
   MOV    rA3,rA1
 
72
   RCALL  _U(__floatsisf)
 
73
   LDI    rB3,0x3F
 
74
   LDI    rB2,0x31
 
75
   LDI    rB1,0x72
 
76
   LDI    rB0,0x18              ; ln(2)
 
77
   RCALL  _U(__mulsf3)
 
78
   MOV    rB3,rS3
 
79
   MOV    rB2,rS2
 
80
   MOV    rB1,rS1
 
81
   MOV    rB0,rS0
 
82
   POP    rS3
 
83
   POP    rS2
 
84
   POP    rS1
 
85
   POP    rS0
 
86
   RJMP   _U(__addsf3)
 
87
 
 
88
          ENDFUNC
 
89
 
 
90
        /* these constants are *no* IEEE float values:  exponent unpacked allready
 
91
         *                                              first byte : exponent
 
92
         *                                              2nd byte   : msb of mantissa with sign as bit 7
 
93
         *                                              3rd & 4th byte : mantissa
 
94
         */
 
95
 
 
96
 table_log:
 
97
   DCB 5                ; no of table entries - 1 (preload value)
 
98
   DCB 0x81,0x35,0x04,0xF4 /* Q5 = 5.65685   */
 
99
   DCB 0x83,0x20,0x00,0x01 /* Q4 = 20        */
 
100
   DCB 0x83,0x62,0x46,0x32 /* Q3 = 28.2843   */
 
101
   DCB 0x83,0x20,0x00,0x00 /* Q2 = 20        */
 
102
   DCB 0x81,0x62,0x46,0x30 /* Q1 = 7.07107   */
 
103
   DCB 0x7F,0x00,0x00,0x00 /* Q0 = 1         */
 
104
   DCB 5
 
105
   DCB 0x82,0x77,0x8C,0x4F /* P5 = 15.4718   */
 
106
   DCB 0x81,0x43,0x2C,0xE2 /* P4 = 6.09923   */
 
107
   DCB 0x82,0x17,0xBF,0x24 /* P3 = 9.48417   */
 
108
   DCB 0x83,0xA4,0x8D,0xD9 /* P2 = -20.5693  */
 
109
   DCB 0x81,0xE1,0xD8,0xA1 /* P1 = -7.05769  */
 
110
   DCB 0x80,0xDB,0x67,0x82 /* P0 = -3.42819  */
 
111
 
 
112