1# 2# Copyright (c) 1985 Regents of the University of California. 3# 4# Use and reproduction of this software are granted in accordance with 5# the terms and conditions specified in the Berkeley Software License 6# Agreement (in particular, this entails acknowledgement of the programs' 7# source, and inclusion of this notice) with the additional understanding 8# that all recipients should regard themselves as participants in an 9# ongoing research project and hence should feel obligated to report 10# their experiences (good or bad) with these elementary function codes, 11# using "sendbug 4bsd-bugs@BERKELEY", to the authors. 12# 13 14# @(#)tan.s 1.1 (Berkeley) 08/21/85 15 16# This is the implementation of Peter Tang's double precision 17# tangent for the VAX using Bob Corbett's argument reduction. 18# 19# Notes: 20# under 1,024,000 random arguments testing on [0,2*pi] 21# tan() observed maximum error = 2.15 ulps 22# 23# double tan(arg) 24# double arg; 25# method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett 26# S. McDonald, April 4, 1985 27# 28 .globl _tan 29 .text 30 .align 1 31 32_tan: .word 0xffc # save r2-r11 33 movq 4(ap),r0 34 bicw3 $0x807f,r0,r2 35 beql 1f # if x is zero or reserved operand then return x 36# 37# Save the PSL's IV & FU bits on the stack. 38# 39 movpsl r2 40 bicw3 $0xff9f,r2,-(sp) 41# 42# Clear the IV & FU bits. 43# 44 bicpsw $0x0060 45 jsb libm$argred 46# 47# At this point, 48# r0 contains the quadrant number, 0, 1, 2, or 3; 49# r2/r1 contains the reduced argument as a D-format number; 50# r3 contains a F-format extension to the reduced argument; 51# 52# Save r3/r0 so that we can call cosine after calling sine. 53# 54 movq r2,-(sp) 55 movq r0,-(sp) 56# 57# Call sine. r4 = 0 implies sine. 58# 59 movl $0,r4 60 jsb libm$sincos 61# 62# Save sin(x) in r11/r10 . 63# 64 movd r0,r10 65# 66# Call cosine. r4 = 1 implies cosine. 67# 68 movq (sp)+,r0 69 movq (sp)+,r2 70 movl $1,r4 71 jsb libm$sincos 72 divd3 r0,r10,r0 73 bispsw (sp)+ 741: ret 75