/*- * Copyright (c) 1985 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Computer Consoles Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)Ksinfcosf.s 7.1 (Berkeley) 12/6/90 */ #include "../tahoe/SYS.h" .text ENTRY(Kcosf, 0) tstl 4(fp) # if (arg < 0) jgeq L23 lnd 4(fp) std 4(fp) # arg = -arg; L23: pushl 20(fp) # hfs pushl $1 pushl 8(fp) pushl 4(fp) callf $20,_sinus ret # return(sinus(arg,1)); ENTRY(Ksinf, 0) pushl 20(fp) # hfs pushl $0 pushl 8(fp) pushl 4(fp) callf $20,_sinus ret # return(sinus(arg, 0)); ENTRY(sinus, 0) subl3 $112,fp,sp movl 8(fp),-80(fp) movl 4(fp),-84(fp) # x = arg; jgeq L34 # if (x < 0) { lnd -84(fp) std -84(fp) # x = -x; addl2 $2,12(fp) # quad = quad + 2;} L34: pushl 16(fp) ldd _twoopi pushd ldd -84(fp) pushd callf $24,_Kmuld movl r1,-88(fp) movl r0,-84(fp) # std -84(fp) x = x * twoopi; cmpd2 -84(fp),L36 # if (x > 32764) { jleq L35 pushl 16(fp) # hfs subl3 $60,fp,-(sp) # &e pushl -80(fp) pushl -84(fp) # x callf $20,_Kmodf clrl -92+4(fp) movl r0,-92(fp) # y = modf(x, &e); pushl 16(fp) # hfs pushl $0 pushl 12(fp) # quad pushl $0 pushl $0 # dummy acc callf $24,_Kcvtld pushl 16(fp) # hfs pushl r1 pushl r0 # pushd (double)quad ldd -60(fp) pushd # &e callf $24,_Kaddd movl r1,-56(fp) movl r0,-60(fp) # std -60(fp) e = e + quad; pushl 16(fp) # hfs subl3 $68,fp,-(sp) # &f pushl 16(fp) # hfs ldd -60(fp) pushd # &e ldd L37 pushd # 0.25 callf $24,_Kmuld pushl r1 pushl r0 # pushd 0.25 * e callf $20,_Kmodf # modf(0.25 * e, &f); pushl 16(fp) # hfs movl r1,-64(fp) movl r0,-68(fp) # ldd -68(fp) &f pushl r1 pushl r0 # pushd ldd L38 pushd callf $24,_Kmuld # 4*f # std r0 pushl 16(fp) # hfs pushl r1 pushl r0 # pushd ldd -60(fp) pushd callf $24,_Ksubd # e - 4 * f ldd r0 # load acc with result of Ksubd cvdl 12(fp) # quad = (e - 4 * f); } jbr L39 L35: ldd -84(fp) # else { cvdl -96(fp) # k = x; pushl 16(fp) # hfs pushl $0 pushl -96(fp) pushl $0 pushl $0 # acc callf $24,_Kcvtld # std r0 pushl 16(fp) # hfs pushl r1 pushl r0 # pushd (double)k ldd -84(fp) pushd # x callf $24,_Ksubd movl r1,-88(fp) movl r0,-92(fp) # std -92(fp) y = x - k; addl3 -96(fp),12(fp),r0 andl3 $3,r0,12(fp) # quad = (quad + k) & 03; } L39: bitl $1,12(fp) # if (quad & 01) jeql L40 pushl 16(fp) # hfs ldd -92(fp) pushd # y ldd L41 pushd # 1.0 callf $24,_Ksubd movl r1,-88(fp) movl r0,-92(fp) # std -92(fp) y = 1 - y; L40: cmpl 12(fp),$1 # if (quad > 1) jleq L42 lnd -92(fp) std -92(fp) # y = -y; L42: pushl 16(fp) # hfs ldd -92(fp) pushd pushd callf $24,_Kmuld # y*y movl r1,-72(fp) movl r0,-76(fp) # std -76(fp) ysq=y*y; pushl 16(fp) # hfs ldd -76(fp) pushd ldd _p4 pushd callf $24,_Kmuld # p4*ysq pushl 16(fp) # hfs pushl _p3+4 pushl _p3 pushl r1 pushl r0 # pushd callf $24,_Kaddd # p4*ysq+p3 pushl 16(fp) # hfs pushl -72(fp) pushl -76(fp) pushl r1 pushl r0 # pushd callf $24,_Kmuld # (p4*ysq+p3)*ysq pushl 16(fp) # hfs pushl _p2+4 pushl _p2 pushl r1 pushl r0 # pushd callf $24,_Kaddd # (p4*ysq+p3)*ysq+p2 pushl 16(fp) # hfs pushl -72(fp) pushl -76(fp) pushl r1 pushl r0 # pushd callf $24,_Kmuld # ((p4*ysq+p3)*ysq+p2)*ysq pushl 16(fp) # hfs pushl _p1+4 pushl _p1 pushl r1 pushl r0 # pushd callf $24,_Kaddd # ((p4*ysq+p3)*ysq+p2)*ysq+p1 pushl 16(fp) # hfs pushl -72(fp) pushl -76(fp) pushl r1 pushl r0 # pushd callf $24,_Kmuld # (((p4*ysq+p3)*ysq+p2)*ysq+p1)*ysq pushl 16(fp) # hfs pushl _p0+4 pushl _p0 pushl r1 pushl r0 # pushd callf $24,_Kaddd # (((p4*ysq+p3)*ysq+p2)*ysq+p1)*ysq+p0 pushl 16(fp) # hfs pushl -88(fp) pushl -92(fp) pushl r1 pushl r0 # pushd callf $24,_Kmuld # ((((p4*ysq+p3)*ysq+p2)*ysq+p1)*ysq+p0)*y; movl r1,-100(fp) movl r0,-104(fp) # std -104(fp) temp1 ldd r0 cvdf stf r0 ret#1 .data .align 2 _twoopi:.long 0x4022F983, 0x6E4E4415 # .double .63661977236758134 _p0: .long 0x40C90FDA, 0x90304197 # .double 1.57079631844 _p1: .long 0xC0255DE0, 0xB36CEE75 # .double -.645963710599 _p2: .long 0x3EA33457, 0xA736E807 # .double .079689678945999999 _p3: .long 0xBC992665, 0x5E9A6554 # .double -.0046737666099999999 _p4: .long 0x3A1ED7FA, 0xCC54924E # .double .000151485129 L36: .long 0x47FFF800, 0x00000000 # .double 32764 L37: .long 0x3F800000, 0x00000000 # .double .25 L38: .long 0x41800000, 0x00000000 # .double 4 L41: .long 0x40800000, 0x00000000 # .double 1