1*20008Sdist# 2*20008Sdist# Copyright (c) 1980 Regents of the University of California. 3*20008Sdist# All rights reserved. The Berkeley software License Agreement 4*20008Sdist# specifies the terms and conditions for redistribution. 5*20008Sdist# 6*20008Sdist# @(#)atan.s 5.1 (Berkeley) 05/08/85 7*20008Sdist# 8*20008Sdist# 919994Sdist# double atan(arg1); -pi/2 < atan < pi/2 1019994Sdist#double atan2(arg1,arg2); -pi< atan2<pi 1119994Sdist#double arg1,arg2 1219994Sdist#method: range reduction to [sqrt(2)-1,sqrt(2)+1] 1319994Sdist# followed by Hart&Cheney ARCTN 5076 D=17.55 1419994Sdist# J. F. Jarvis August 8, 1978 1519994Sdist.globl _atan 1619994Sdist.globl _atan2 1719994Sdist.text 1819994Sdist.align 1 1919994Sdist_atan: 2019994Sdist .word 0x03c0 2119994Sdist bispsw $0xe0 2219994Sdist movd 4(ap),r0 2319994Sdist jgtr a1 2419994Sdist mnegd r0,r0 # atan(arg1), arg1<0 2519994Sdist bsbb satan 2619994Sdist mnegd r0,r0 2719994Sdist ret 2819994Sdista1: bsbb satan # atan(arg1), arg1>=0 2919994Sdist ret 3019994Sdist# 3119994Sdist.align 1 3219994Sdist_atan2: 3319994Sdist .word 0x03c0 3419994Sdist bispsw $0xe0 3519994Sdist movd 4(ap),r0 # atan(arg1/arg2) 3619994Sdist movd 12(ap),r2 3719994Sdist addd3 r0,r2,r4 3819994Sdist cmpd r0,r4 3919994Sdist jneq b1 4019994Sdist tstd r0 4119994Sdist jgeq b2 4219994Sdist mnegd pio2,r0 4319994Sdist ret 4419994Sdistb2: movd pio2,r0 4519994Sdist ret 4619994Sdist# 4719994Sdistb1: tstd r2 4819994Sdist jgeq b3 4919994Sdist divd2 r2,r0 5019994Sdist jleq b4 5119994Sdist bsbb satan # arg1<0, arg2<0 5219994Sdist subd2 pi,r0 5319994Sdist ret 5419994Sdistb4: mnegd r0,r0 # arg1>0, arg2<0 5519994Sdist bsbb satan 5619994Sdist subd3 r0,pi,r0 5719994Sdist ret 5819994Sdist# 5919994Sdistb3: divd2 r2,r0 6019994Sdist jleq b5 6119994Sdist bsbb satan # arg1>0, arg2>0 6219994Sdist ret 6319994Sdistb5: mnegd r0,r0 # arg1<0, arg2>0 6419994Sdist bsbb satan 6519994Sdist mnegd r0,r0 6619994Sdist ret 6719994Sdist# 6819994Sdist.globl satan 6919994Sdistsatan: # range reduction on positive arg(r0) 7019994Sdist cmpd r0,sq2m1 7119994Sdist jgeq c1 7219994Sdist bsbb xatan 7319994Sdist rsb 7419994Sdistc1: cmpd r0,sq2p1 7519994Sdist jleq c2 7619994Sdist divd3 r0,$0d1.0e+0,r0 7719994Sdist bsbb xatan 7819994Sdist subd3 r0,pio2,r0 7919994Sdist rsb 8019994Sdistc2: addd3 $0d1.0e+0,r0,r2 8119994Sdist subd2 $0d1.0e+0,r0 8219994Sdist divd2 r2,r0 8319994Sdist bsbb xatan 8419994Sdist addd2 pio4,r0 8519994Sdist rsb 8619994Sdist# 8719994Sdistxatan: # compute arctan(r0) for:sqrt(2)-1<r0<sqrt(2)+1 8819994Sdist# Hart&Cheney ARCTN 5076 is evaluated 8919994Sdist movd r0,r8 9019994Sdist muld3 r0,r0,r6 9119994Sdist polyd r6,$4,pcoef 9219994Sdist muld2 r0,r8 9319994Sdist polyd r6,$4,qcoef 9419994Sdist divd3 r0,r8,r0 9519994Sdist rsb 9619994Sdist.data 9719994Sdist.align 2 9819994Sdistpcoef: 9919994Sdist .double 0d0.1589740288482307048e+0 10019994Sdist .double 0d0.66605790170092626575e+1 10119994Sdist .double 0d0.40969264832102256374e+2 10219994Sdist .double 0d0.77477687719204208616e+2 10319994Sdist .double 0d0.44541340059290680319e+2 10419994Sdistqcoef: 10519994Sdist .double 0d1.0e+0 10619994Sdist .double 0d0.15503977551421987525e+2 10719994Sdist .double 0d0.62835930511032376833e+2 10819994Sdist .double 0d0.92324801072300974840e+2 10919994Sdist .double 0d0.44541340059290680444e+2 11019994Sdistpio4: .double 0d0.78539816339744830961e+0 11119994Sdistpio2: .double 0d1.57079632679489661923e+0 11219994Sdistsq2p1: .double 0d2.41421356237309504880e+0 11319994Sdistsq2m1: .double 0d0.41421356237309504880e+0 11419994Sdistpi: .double 0d3.14159265358979323846e+0 115