18c2ecf20Sopenharmony_ci| 28c2ecf20Sopenharmony_ci| sasin.sa 3.3 12/19/90 38c2ecf20Sopenharmony_ci| 48c2ecf20Sopenharmony_ci| Description: The entry point sAsin computes the inverse sine of 58c2ecf20Sopenharmony_ci| an input argument; sAsind does the same except for denormalized 68c2ecf20Sopenharmony_ci| input. 78c2ecf20Sopenharmony_ci| 88c2ecf20Sopenharmony_ci| Input: Double-extended number X in location pointed to 98c2ecf20Sopenharmony_ci| by address register a0. 108c2ecf20Sopenharmony_ci| 118c2ecf20Sopenharmony_ci| Output: The value arcsin(X) returned in floating-point register Fp0. 128c2ecf20Sopenharmony_ci| 138c2ecf20Sopenharmony_ci| Accuracy and Monotonicity: The returned result is within 3 ulps in 148c2ecf20Sopenharmony_ci| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the 158c2ecf20Sopenharmony_ci| result is subsequently rounded to double precision. The 168c2ecf20Sopenharmony_ci| result is provably monotonic in double precision. 178c2ecf20Sopenharmony_ci| 188c2ecf20Sopenharmony_ci| Speed: The program sASIN takes approximately 310 cycles. 198c2ecf20Sopenharmony_ci| 208c2ecf20Sopenharmony_ci| Algorithm: 218c2ecf20Sopenharmony_ci| 228c2ecf20Sopenharmony_ci| ASIN 238c2ecf20Sopenharmony_ci| 1. If |X| >= 1, go to 3. 248c2ecf20Sopenharmony_ci| 258c2ecf20Sopenharmony_ci| 2. (|X| < 1) Calculate asin(X) by 268c2ecf20Sopenharmony_ci| z := sqrt( [1-X][1+X] ) 278c2ecf20Sopenharmony_ci| asin(X) = atan( x / z ). 288c2ecf20Sopenharmony_ci| Exit. 298c2ecf20Sopenharmony_ci| 308c2ecf20Sopenharmony_ci| 3. If |X| > 1, go to 5. 318c2ecf20Sopenharmony_ci| 328c2ecf20Sopenharmony_ci| 4. (|X| = 1) sgn := sign(X), return asin(X) := sgn * Pi/2. Exit. 338c2ecf20Sopenharmony_ci| 348c2ecf20Sopenharmony_ci| 5. (|X| > 1) Generate an invalid operation by 0 * infinity. 358c2ecf20Sopenharmony_ci| Exit. 368c2ecf20Sopenharmony_ci| 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci| Copyright (C) Motorola, Inc. 1990 398c2ecf20Sopenharmony_ci| All Rights Reserved 408c2ecf20Sopenharmony_ci| 418c2ecf20Sopenharmony_ci| For details on the license for this file, please see the 428c2ecf20Sopenharmony_ci| file, README, in this same directory. 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci|SASIN idnt 2,1 | Motorola 040 Floating Point Software Package 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci |section 8 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ciPIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci |xref t_operr 518c2ecf20Sopenharmony_ci |xref t_frcinx 528c2ecf20Sopenharmony_ci |xref t_extdnrm 538c2ecf20Sopenharmony_ci |xref satan 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci .global sasind 568c2ecf20Sopenharmony_cisasind: 578c2ecf20Sopenharmony_ci|--ASIN(X) = X FOR DENORMALIZED X 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci bra t_extdnrm 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci .global sasin 628c2ecf20Sopenharmony_cisasin: 638c2ecf20Sopenharmony_ci fmovex (%a0),%fp0 | ...LOAD INPUT 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci movel (%a0),%d0 668c2ecf20Sopenharmony_ci movew 4(%a0),%d0 678c2ecf20Sopenharmony_ci andil #0x7FFFFFFF,%d0 688c2ecf20Sopenharmony_ci cmpil #0x3FFF8000,%d0 698c2ecf20Sopenharmony_ci bges asinbig 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci|--THIS IS THE USUAL CASE, |X| < 1 728c2ecf20Sopenharmony_ci|--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) ) 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci fmoves #0x3F800000,%fp1 758c2ecf20Sopenharmony_ci fsubx %fp0,%fp1 | ...1-X 768c2ecf20Sopenharmony_ci fmovemx %fp2-%fp2,-(%a7) 778c2ecf20Sopenharmony_ci fmoves #0x3F800000,%fp2 788c2ecf20Sopenharmony_ci faddx %fp0,%fp2 | ...1+X 798c2ecf20Sopenharmony_ci fmulx %fp2,%fp1 | ...(1+X)(1-X) 808c2ecf20Sopenharmony_ci fmovemx (%a7)+,%fp2-%fp2 818c2ecf20Sopenharmony_ci fsqrtx %fp1 | ...SQRT([1-X][1+X]) 828c2ecf20Sopenharmony_ci fdivx %fp1,%fp0 | ...X/SQRT([1-X][1+X]) 838c2ecf20Sopenharmony_ci fmovemx %fp0-%fp0,(%a0) 848c2ecf20Sopenharmony_ci bsr satan 858c2ecf20Sopenharmony_ci bra t_frcinx 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ciasinbig: 888c2ecf20Sopenharmony_ci fabsx %fp0 | ...|X| 898c2ecf20Sopenharmony_ci fcmps #0x3F800000,%fp0 908c2ecf20Sopenharmony_ci fbgt t_operr |cause an operr exception 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci|--|X| = 1, ASIN(X) = +- PI/2. 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci fmovex PIBY2,%fp0 958c2ecf20Sopenharmony_ci movel (%a0),%d0 968c2ecf20Sopenharmony_ci andil #0x80000000,%d0 | ...SIGN BIT OF X 978c2ecf20Sopenharmony_ci oril #0x3F800000,%d0 | ...+-1 IN SGL FORMAT 988c2ecf20Sopenharmony_ci movel %d0,-(%sp) | ...push SIGN(X) IN SGL-FMT 998c2ecf20Sopenharmony_ci fmovel %d1,%FPCR 1008c2ecf20Sopenharmony_ci fmuls (%sp)+,%fp0 1018c2ecf20Sopenharmony_ci bra t_frcinx 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci |end 104