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