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