11da177e4SLinus Torvalds| 21da177e4SLinus Torvalds| sasin.sa 3.3 12/19/90 31da177e4SLinus Torvalds| 41da177e4SLinus Torvalds| Description: The entry point sAsin computes the inverse sine of 51da177e4SLinus Torvalds| an input argument; sAsind does the same except for denormalized 61da177e4SLinus Torvalds| input. 71da177e4SLinus Torvalds| 81da177e4SLinus Torvalds| Input: Double-extended number X in location pointed to 91da177e4SLinus Torvalds| by address register a0. 101da177e4SLinus Torvalds| 111da177e4SLinus Torvalds| Output: The value arcsin(X) returned in floating-point register Fp0. 121da177e4SLinus Torvalds| 131da177e4SLinus Torvalds| Accuracy and Monotonicity: The returned result is within 3 ulps in 141da177e4SLinus Torvalds| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the 151da177e4SLinus Torvalds| result is subsequently rounded to double precision. The 161da177e4SLinus Torvalds| result is provably monotonic in double precision. 171da177e4SLinus Torvalds| 181da177e4SLinus Torvalds| Speed: The program sASIN takes approximately 310 cycles. 191da177e4SLinus Torvalds| 201da177e4SLinus Torvalds| Algorithm: 211da177e4SLinus Torvalds| 221da177e4SLinus Torvalds| ASIN 231da177e4SLinus Torvalds| 1. If |X| >= 1, go to 3. 241da177e4SLinus Torvalds| 251da177e4SLinus Torvalds| 2. (|X| < 1) Calculate asin(X) by 261da177e4SLinus Torvalds| z := sqrt( [1-X][1+X] ) 271da177e4SLinus Torvalds| asin(X) = atan( x / z ). 281da177e4SLinus Torvalds| Exit. 291da177e4SLinus Torvalds| 301da177e4SLinus Torvalds| 3. If |X| > 1, go to 5. 311da177e4SLinus Torvalds| 321da177e4SLinus Torvalds| 4. (|X| = 1) sgn := sign(X), return asin(X) := sgn * Pi/2. Exit. 331da177e4SLinus Torvalds| 341da177e4SLinus Torvalds| 5. (|X| > 1) Generate an invalid operation by 0 * infinity. 351da177e4SLinus Torvalds| Exit. 361da177e4SLinus Torvalds| 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds| Copyright (C) Motorola, Inc. 1990 391da177e4SLinus Torvalds| All Rights Reserved 401da177e4SLinus Torvalds| 41*e00d82d0SMatt Waddel| For details on the license for this file, please see the 42*e00d82d0SMatt Waddel| file, README, in this same directory. 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds|SASIN idnt 2,1 | Motorola 040 Floating Point Software Package 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds |section 8 471da177e4SLinus Torvalds 481da177e4SLinus TorvaldsPIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds |xref t_operr 511da177e4SLinus Torvalds |xref t_frcinx 521da177e4SLinus Torvalds |xref t_extdnrm 531da177e4SLinus Torvalds |xref satan 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds .global sasind 561da177e4SLinus Torvaldssasind: 571da177e4SLinus Torvalds|--ASIN(X) = X FOR DENORMALIZED X 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds bra t_extdnrm 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds .global sasin 621da177e4SLinus Torvaldssasin: 631da177e4SLinus Torvalds fmovex (%a0),%fp0 | ...LOAD INPUT 641da177e4SLinus Torvalds 651da177e4SLinus Torvalds movel (%a0),%d0 661da177e4SLinus Torvalds movew 4(%a0),%d0 671da177e4SLinus Torvalds andil #0x7FFFFFFF,%d0 681da177e4SLinus Torvalds cmpil #0x3FFF8000,%d0 691da177e4SLinus Torvalds bges asinbig 701da177e4SLinus Torvalds 711da177e4SLinus Torvalds|--THIS IS THE USUAL CASE, |X| < 1 721da177e4SLinus Torvalds|--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) ) 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds fmoves #0x3F800000,%fp1 751da177e4SLinus Torvalds fsubx %fp0,%fp1 | ...1-X 761da177e4SLinus Torvalds fmovemx %fp2-%fp2,-(%a7) 771da177e4SLinus Torvalds fmoves #0x3F800000,%fp2 781da177e4SLinus Torvalds faddx %fp0,%fp2 | ...1+X 791da177e4SLinus Torvalds fmulx %fp2,%fp1 | ...(1+X)(1-X) 801da177e4SLinus Torvalds fmovemx (%a7)+,%fp2-%fp2 811da177e4SLinus Torvalds fsqrtx %fp1 | ...SQRT([1-X][1+X]) 821da177e4SLinus Torvalds fdivx %fp1,%fp0 | ...X/SQRT([1-X][1+X]) 831da177e4SLinus Torvalds fmovemx %fp0-%fp0,(%a0) 841da177e4SLinus Torvalds bsr satan 851da177e4SLinus Torvalds bra t_frcinx 861da177e4SLinus Torvalds 871da177e4SLinus Torvaldsasinbig: 881da177e4SLinus Torvalds fabsx %fp0 | ...|X| 891da177e4SLinus Torvalds fcmps #0x3F800000,%fp0 901da177e4SLinus Torvalds fbgt t_operr |cause an operr exception 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds|--|X| = 1, ASIN(X) = +- PI/2. 931da177e4SLinus Torvalds 941da177e4SLinus Torvalds fmovex PIBY2,%fp0 951da177e4SLinus Torvalds movel (%a0),%d0 961da177e4SLinus Torvalds andil #0x80000000,%d0 | ...SIGN BIT OF X 971da177e4SLinus Torvalds oril #0x3F800000,%d0 | ...+-1 IN SGL FORMAT 981da177e4SLinus Torvalds movel %d0,-(%sp) | ...push SIGN(X) IN SGL-FMT 991da177e4SLinus Torvalds fmovel %d1,%FPCR 1001da177e4SLinus Torvalds fmuls (%sp)+,%fp0 1011da177e4SLinus Torvalds bra t_frcinx 1021da177e4SLinus Torvalds 1031da177e4SLinus Torvalds |end 104