1/* $NetBSD: n_sincos.S,v 1.10 2024/05/06 15:33:04 riastradh 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 49WEAK_ALIAS(sinf, _sinf) 50ENTRY(_sinf, 0) 51 cvtfd 4(%ap),-(%sp) 52 calls $2,_C_LABEL(_sin) 53 cvtdf %r0,%r0 54 ret 55END(_sinf) 56 57WEAK_ALIAS(sinl, _sinl) 58STRONG_ALIAS(_sinl, _sin) 59 60WEAK_ALIAS(sin, _sin) 61ENTRY(_sin, 0xfc0) 62 movq 4(%ap),%r0 63 bicw3 $0x807f,%r0,%r2 64 beql 1f # if x is zero or reserved operand then return x 65/* 66 * Save the PSL's IV & FU bits on the stack. 67 */ 68 movpsl %r2 69 bicw3 $0xff9f,%r2,-(%sp) 70/* 71 * Clear the IV & FU bits. 72 */ 73 bicpsw $0x0060 74/* 75 * Entered by sine ; save 0 in %r4 . 76 */ 77 jsb _C_LABEL(__libm_argred)+2 78 movl $0,%r4 79 jsb _C_LABEL(__libm_sincos)+2 80 bispsw (%sp)+ 811: ret 82END(_sin) 83 84/* 85 * double cos(arg) 86 * double arg; 87 * method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett 88 * S. McDonald, April 4, 1985 89 */ 90 91WEAK_ALIAS(cosf, _cosf) 92ENTRY(_cosf, 0) 93 cvtfd 4(%ap),-(%sp) 94 calls $2,_C_LABEL(_cos) 95 cvtdf %r0,%r0 96 ret 97END(_cosf) 98 99WEAK_ALIAS(cosl, _cosl) 100STRONG_ALIAS(_cosl, _cos) 101 102WEAK_ALIAS(cos, _cos) 103ENTRY(_cos, 0x0fc0) 104 movq 4(%ap),%r0 105 bicw3 $0x7f,%r0,%r2 106 cmpw $0x8000,%r2 107 beql 1f # if x is reserved operand then return x 108/* 109 * Save the PSL's IV & FU bits on the stack. 110 */ 111 movpsl %r2 112 bicw3 $0xff9f,%r2,-(%sp) 113/* 114 * Clear the IV & FU bits. 115 */ 116 bicpsw $0x0060 117/* 118 * Entered by cosine ; save 1 in %r4 . 119 */ 120 jsb _C_LABEL(__libm_argred)+2 121 movl $1,%r4 122 jsb _C_LABEL(__libm_sincos)+2 123 bispsw (%sp)+ 1241: ret 125END(_cos) 126