11da177e4SLinus Torvalds| 21da177e4SLinus Torvalds| sacos.sa 3.3 12/19/90 31da177e4SLinus Torvalds| 41da177e4SLinus Torvalds| Description: The entry point sAcos computes the inverse cosine of 51da177e4SLinus Torvalds| an input argument; sAcosd 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 arccos(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 sCOS takes approximately 310 cycles. 191da177e4SLinus Torvalds| 201da177e4SLinus Torvalds| Algorithm: 211da177e4SLinus Torvalds| 221da177e4SLinus Torvalds| ACOS 231da177e4SLinus Torvalds| 1. If |X| >= 1, go to 3. 241da177e4SLinus Torvalds| 251da177e4SLinus Torvalds| 2. (|X| < 1) Calculate acos(X) by 261da177e4SLinus Torvalds| z := (1-X) / (1+X) 271da177e4SLinus Torvalds| acos(X) = 2 * atan( sqrt(z) ). 281da177e4SLinus Torvalds| Exit. 291da177e4SLinus Torvalds| 301da177e4SLinus Torvalds| 3. If |X| > 1, go to 5. 311da177e4SLinus Torvalds| 321da177e4SLinus Torvalds| 4. (|X| = 1) If X > 0, return 0. Otherwise, return Pi. 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| 41e00d82d0SMatt Waddel| For details on the license for this file, please see the 42e00d82d0SMatt Waddel| file, README, in this same directory. 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds|SACOS idnt 2,1 | Motorola 040 Floating Point Software Package 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds |section 8 471da177e4SLinus Torvalds 481da177e4SLinus TorvaldsPI: .long 0x40000000,0xC90FDAA2,0x2168C235,0x00000000 491da177e4SLinus TorvaldsPIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds |xref t_operr 521da177e4SLinus Torvalds |xref t_frcinx 531da177e4SLinus Torvalds |xref satan 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds .global sacosd 561da177e4SLinus Torvaldssacosd: 571da177e4SLinus Torvalds|--ACOS(X) = PI/2 FOR DENORMALIZED X 581da177e4SLinus Torvalds fmovel %d1,%fpcr | ...load user's rounding mode/precision 591da177e4SLinus Torvalds fmovex PIBY2,%fp0 601da177e4SLinus Torvalds bra t_frcinx 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds .global sacos 631da177e4SLinus Torvaldssacos: 641da177e4SLinus Torvalds fmovex (%a0),%fp0 | ...LOAD INPUT 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds movel (%a0),%d0 | ...pack exponent with upper 16 fraction 671da177e4SLinus Torvalds movew 4(%a0),%d0 681da177e4SLinus Torvalds andil #0x7FFFFFFF,%d0 691da177e4SLinus Torvalds cmpil #0x3FFF8000,%d0 701da177e4SLinus Torvalds bges ACOSBIG 711da177e4SLinus Torvalds 721da177e4SLinus Torvalds|--THIS IS THE USUAL CASE, |X| < 1 731da177e4SLinus Torvalds|--ACOS(X) = 2 * ATAN( SQRT( (1-X)/(1+X) ) ) 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds fmoves #0x3F800000,%fp1 761da177e4SLinus Torvalds faddx %fp0,%fp1 | ...1+X 771da177e4SLinus Torvalds fnegx %fp0 | ... -X 781da177e4SLinus Torvalds fadds #0x3F800000,%fp0 | ...1-X 791da177e4SLinus Torvalds fdivx %fp1,%fp0 | ...(1-X)/(1+X) 801da177e4SLinus Torvalds fsqrtx %fp0 | ...SQRT((1-X)/(1+X)) 811da177e4SLinus Torvalds fmovemx %fp0-%fp0,(%a0) | ...overwrite input 821da177e4SLinus Torvalds movel %d1,-(%sp) |save original users fpcr 831da177e4SLinus Torvalds clrl %d1 841da177e4SLinus Torvalds bsr satan | ...ATAN(SQRT([1-X]/[1+X])) 851da177e4SLinus Torvalds fmovel (%sp)+,%fpcr |restore users exceptions 861da177e4SLinus Torvalds faddx %fp0,%fp0 | ...2 * ATAN( STUFF ) 871da177e4SLinus Torvalds bra t_frcinx 881da177e4SLinus Torvalds 891da177e4SLinus TorvaldsACOSBIG: 901da177e4SLinus Torvalds fabsx %fp0 911da177e4SLinus Torvalds fcmps #0x3F800000,%fp0 921da177e4SLinus Torvalds fbgt t_operr |cause an operr exception 931da177e4SLinus Torvalds 941da177e4SLinus Torvalds|--|X| = 1, ACOS(X) = 0 OR PI 951da177e4SLinus Torvalds movel (%a0),%d0 | ...pack exponent with upper 16 fraction 961da177e4SLinus Torvalds movew 4(%a0),%d0 971da177e4SLinus Torvalds cmpl #0,%d0 |D0 has original exponent+fraction 981da177e4SLinus Torvalds bgts ACOSP1 991da177e4SLinus Torvalds 1001da177e4SLinus Torvalds|--X = -1 1011da177e4SLinus Torvalds|Returns PI and inexact exception 1021da177e4SLinus Torvalds fmovex PI,%fp0 1031da177e4SLinus Torvalds fmovel %d1,%FPCR 1041da177e4SLinus Torvalds fadds #0x00800000,%fp0 |cause an inexact exception to be put 1051da177e4SLinus Torvalds| ;into the 040 - will not trap until next 1061da177e4SLinus Torvalds| ;fp inst. 1071da177e4SLinus Torvalds bra t_frcinx 1081da177e4SLinus Torvalds 1091da177e4SLinus TorvaldsACOSP1: 1101da177e4SLinus Torvalds fmovel %d1,%FPCR 1111da177e4SLinus Torvalds fmoves #0x00000000,%fp0 1121da177e4SLinus Torvalds rts |Facos ; of +1 is exact 1131da177e4SLinus Torvalds 1141da177e4SLinus Torvalds |end 115