1/* $NetBSD: n_sincos.S,v 1.8 2003/08/07 16:44:45 agc Exp $ */ 2/* 3 * Copyright (c) 1985, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. Neither the name of the University nor the names of its contributors 15 * may be used to endorse or promote products derived from this software 16 * without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * @(#)sincos.s 8.1 (Berkeley) 6/4/93 31 */ 32 33/* 34 * This is the implementation of Peter Tang's double precision 35 * sine and cosine for the VAX using Bob Corbett's argument reduction. 36 * 37 * Notes: 38 * under 1,024,000 random arguments testing on [0,2*pi] 39 * sin() observed maximum error = 0.814 ulps 40 * cos() observed maximum error = 0.792 ulps 41 * 42 * double sin(arg) 43 * double arg; 44 * method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett 45 * S. McDonald, April 4, 1985 46 */ 47#include <machine/asm.h> 48 49ENTRY(sinf, 0) 50 cvtfd 4(%ap),-(%sp) 51 calls $2,_C_LABEL(sin) 52 cvtdf %r0,%r0 53 ret 54 55ENTRY(sin, 0xfc0) 56 movq 4(%ap),%r0 57 bicw3 $0x807f,%r0,%r2 58 beql 1f # if x is zero or reserved operand then return x 59/* 60 * Save the PSL's IV & FU bits on the stack. 61 */ 62 movpsl %r2 63 bicw3 $0xff9f,%r2,-(%sp) 64/* 65 * Clear the IV & FU bits. 66 */ 67 bicpsw $0x0060 68/* 69 * Entered by sine ; save 0 in %r4 . 70 */ 71 jsb _C_LABEL(__libm_argred)+2 72 movl $0,%r4 73 jsb _C_LABEL(__libm_sincos)+2 74 bispsw (%sp)+ 751: ret 76 77/* 78 * double cos(arg) 79 * double arg; 80 * method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett 81 * S. McDonald, April 4, 1985 82 */ 83 84ENTRY(cosf, 0) 85 cvtfd 4(%ap),-(%sp) 86 calls $2,_C_LABEL(cos) 87 cvtdf %r0,%r0 88 ret 89 90ENTRY(cos, 0x0fc0) 91 movq 4(%ap),%r0 92 bicw3 $0x7f,%r0,%r2 93 cmpw $0x8000,%r2 94 beql 1f # if x is reserved operand then return x 95/* 96 * Save the PSL's IV & FU bits on the stack. 97 */ 98 movpsl %r2 99 bicw3 $0xff9f,%r2,-(%sp) 100/* 101 * Clear the IV & FU bits. 102 */ 103 bicpsw $0x0060 104/* 105 * Entered by cosine ; save 1 in %r4 . 106 */ 107 jsb _C_LABEL(__libm_argred)+2 108 movl $1,%r4 109 jsb _C_LABEL(__libm_sincos)+2 110 bispsw (%sp)+ 1111: ret 112