OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [m68k/] [fpsp040/] [sasin.S] - Blame information for rev 1782

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1623 jcastillo
|
2
|       sasin.sa 3.3 12/19/90
3
|
4
|       Description: The entry point sAsin computes the inverse sine of
5
|               an input argument; sAsind does the same except for denormalized
6
|               input.
7
|
8
|       Input: Double-extended number X in location pointed to
9
|               by address register a0.
10
|
11
|       Output: The value arcsin(X) returned in floating-point register Fp0.
12
|
13
|       Accuracy and Monotonicity: The returned result is within 3 ulps in
14
|               64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
15
|               result is subsequently rounded to double precision. The
16
|               result is provably monotonic in double precision.
17
|
18
|       Speed: The program sASIN takes approximately 310 cycles.
19
|
20
|       Algorithm:
21
|
22
|       ASIN
23
|       1. If |X| >= 1, go to 3.
24
|
25
|       2. (|X| < 1) Calculate asin(X) by
26
|               z := sqrt( [1-X][1+X] )
27
|               asin(X) = atan( x / z ).
28
|               Exit.
29
|
30
|       3. If |X| > 1, go to 5.
31
|
32
|       4. (|X| = 1) sgn := sign(X), return asin(X) := sgn * Pi/2. Exit.
33
|
34
|       5. (|X| > 1) Generate an invalid operation by 0 * infinity.
35
|               Exit.
36
|
37
 
38
|               Copyright (C) Motorola, Inc. 1990
39
|                       All Rights Reserved
40
|
41
|       THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
42
|       The copyright notice above does not evidence any
43
|       actual or intended publication of such source code.
44
 
45
|SASIN  idnt    2,1 | Motorola 040 Floating Point Software Package
46
 
47
        |section        8
48
 
49
PIBY2:  .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
50
 
51
        |xref   t_operr
52
        |xref   t_frcinx
53
        |xref   t_extdnrm
54
        |xref   satan
55
 
56
        .global sasind
57
sasind:
58
|--ASIN(X) = X FOR DENORMALIZED X
59
 
60
        bra             t_extdnrm
61
 
62
        .global sasin
63
sasin:
64
        fmovex          (%a0),%fp0      | ...LOAD INPUT
65
 
66
        movel           (%a0),%d0
67
        movew           4(%a0),%d0
68
        andil           #0x7FFFFFFF,%d0
69
        cmpil           #0x3FFF8000,%d0
70
        bges            asinbig
71
 
72
|--THIS IS THE USUAL CASE, |X| < 1
73
|--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) )
74
 
75
        fmoves          #0x3F800000,%fp1
76
        fsubx           %fp0,%fp1               | ...1-X
77
        fmovemx %fp2-%fp2,-(%a7)
78
        fmoves          #0x3F800000,%fp2
79
        faddx           %fp0,%fp2               | ...1+X
80
        fmulx           %fp2,%fp1               | ...(1+X)(1-X)
81
        fmovemx (%a7)+,%fp2-%fp2
82
        fsqrtx          %fp1            | ...SQRT([1-X][1+X])
83
        fdivx           %fp1,%fp0               | ...X/SQRT([1-X][1+X])
84
        fmovemx %fp0-%fp0,(%a0)
85
        bsr             satan
86
        bra             t_frcinx
87
 
88
asinbig:
89
        fabsx           %fp0     | ...|X|
90
        fcmps           #0x3F800000,%fp0
91
        fbgt            t_operr         |cause an operr exception
92
 
93
|--|X| = 1, ASIN(X) = +- PI/2.
94
 
95
        fmovex          PIBY2,%fp0
96
        movel           (%a0),%d0
97
        andil           #0x80000000,%d0 | ...SIGN BIT OF X
98
        oril            #0x3F800000,%d0 | ...+-1 IN SGL FORMAT
99
        movel           %d0,-(%sp)      | ...push SIGN(X) IN SGL-FMT
100
        fmovel          %d1,%FPCR
101
        fmuls           (%sp)+,%fp0
102
        bra             t_frcinx
103
 
104
        |end

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.