diff options
Diffstat (limited to 'lib/libm/arch')
-rw-r--r-- | lib/libm/arch/vax/n_argred.S | 789 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_atan2.S | 222 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_cbrt.S | 92 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_hypot.S | 124 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_infnan.S | 52 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_sincos.S | 115 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_sqrt.S | 116 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_support.S | 238 | ||||
-rw-r--r-- | lib/libm/arch/vax/n_tan.S | 98 |
9 files changed, 0 insertions, 1846 deletions
diff --git a/lib/libm/arch/vax/n_argred.S b/lib/libm/arch/vax/n_argred.S deleted file mode 100644 index 822486cbaa6..00000000000 --- a/lib/libm/arch/vax/n_argred.S +++ /dev/null @@ -1,789 +0,0 @@ -/* $OpenBSD: n_argred.S,v 1.4 2013/07/05 21:10:50 miod Exp $ */ -/* $NetBSD: n_argred.S,v 1.1 1995/10/10 23:40:21 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)argred.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> - -/* - * __libm_argred implements Bob Corbett's argument reduction and - * __libm_sincos implements Peter Tang's double precision sin/cos. - * - * Note: The two entry points __libm_argred and __libm_sincos are meant - * to be used only by sin, cos and tan. - * - * method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett - * S. McDonald, April 4, 1985 - */ - .text - _ALIGN_TEXT -_ALTENTRY(__libm_argred) -/* - * Compare the argument with the largest possible that can - * be reduced by table lookup. r3 := |x| will be used in table_lookup . - */ - movd %r0,%r3 - bgeq abs1 - mnegd %r3,%r3 -abs1: - cmpd %r3,$0d+4.55530934770520019583e+01 - blss small_arg - jsb trigred - rsb -small_arg: - jsb table_lookup - rsb -/* - * At this point, - * r0 contains the quadrant number, 0, 1, 2, or 3; - * r2/r1 contains the reduced argument as a D-format number; - * r3 contains a F-format extension to the reduced argument; - * r4 contains a 0 or 1 corresponding to a sin or cos entry. - */ -_ALTENTRY(__libm_sincos) -/* - * Compensate for a cosine entry by adding one to the quadrant number. - */ - addl2 %r4,%r0 -/* - * Polyd clobbers r5-r0 ; save X in r7/r6 . - * This can be avoided by rewriting trigred . - */ - movd %r1,%r6 -/* - * Likewise, save alpha in r8 . - * This can be avoided by rewriting trigred . - */ - movf %r3,%r8 -/* - * Odd or even quadrant? cosine if odd, sine otherwise. - * Save floor(quadrant/2) in r9 ; it determines the final sign. - */ - rotl $-1,%r0,%r9 - blss cosine -sine: - muld2 %r1,%r1 # Xsq = X * X - cmpw $0x2480,%r1 # [zl] Xsq > 2^-56? - blss 1f # [zl] yes, go ahead and do polyd - clrq %r1 # [zl] work around 11/780 FPA polyd bug -1: - polyd %r1,$7,sin_coef # Q = P(Xsq) , of deg 7 - mulf3 $0f3.0,%r8,%r4 # beta = 3 * alpha - mulf2 %r0,%r4 # beta = Q * beta - addf2 %r8,%r4 # beta = alpha + beta - muld2 %r6,%r0 # S(X) = X * Q -/* cvtfd %r4,%r4 ... r5 = 0 after a polyd. */ - addd2 %r4,%r0 # S(X) = beta + S(X) - addd2 %r6,%r0 # S(X) = X + S(X) - brb done -cosine: - muld2 %r6,%r6 # Xsq = X * X - beql zero_arg - mulf2 %r1,%r8 # beta = X * alpha - polyd %r6,$7,cos_coef /* Q = P'(Xsq) , of deg 7 */ - subd3 %r0,%r8,%r0 # beta = beta - Q - subw2 $0x80,%r6 # Xsq = Xsq / 2 - addd2 %r0,%r6 # Xsq = Xsq + beta -zero_arg: - subd3 %r6,$0d1.0,%r0 # C(X) = 1 - Xsq -done: - blbc %r9,even - mnegd %r0,%r0 -even: - rsb - -.data - .align 2 - -sin_coef: - .double 0d-7.53080332264191085773e-13 # s7 = 2^-29 -1.a7f2504ffc49f8.. - .double 0d+1.60573519267703489121e-10 # s6 = 2^-21 1.611adaede473c8.. - .double 0d-2.50520965150706067211e-08 # s5 = 2^-1a -1.ae644921ed8382.. - .double 0d+2.75573191800593885716e-06 # s4 = 2^-13 1.71de3a4b884278.. - .double 0d-1.98412698411850507950e-04 # s3 = 2^-0d -1.a01a01a0125e7d.. - .double 0d+8.33333333333325688985e-03 # s2 = 2^-07 1.11111111110e50 - .double 0d-1.66666666666666664354e-01 # s1 = 2^-03 -1.55555555555554 - .double 0d+0.00000000000000000000e+00 # s0 = 0 - -cos_coef: - .double 0d-1.13006966202629430300e-11 # s7 = 2^-25 -1.8D9BA04D1374BE.. - .double 0d+2.08746646574796004700e-09 # s6 = 2^-1D 1.1EE632650350BA.. - .double 0d-2.75573073031284417300e-07 # s5 = 2^-16 -1.27E4F31411719E.. - .double 0d+2.48015872682668025200e-05 # s4 = 2^-10 1.A01A0196B902E8.. - .double 0d-1.38888888888464709200e-03 # s3 = 2^-0A -1.6C16C16C11FACE.. - .double 0d+4.16666666666664761400e-02 # s2 = 2^-05 1.5555555555539E - .double 0d+0.00000000000000000000e+00 # s1 = 0 - .double 0d+0.00000000000000000000e+00 # s0 = 0 - -/* - * Multiples of pi/2 expressed as the sum of three doubles, - * - * trailing: n * pi/2 , n = 0, 1, 2, ..., 29 - * trailing[n] , - * - * middle: n * pi/2 , n = 0, 1, 2, ..., 29 - * middle[n] , - * - * leading: n * pi/2 , n = 0, 1, 2, ..., 29 - * leading[n] , - * - * where - * leading[n] := (n * pi/2) rounded, - * middle[n] := (n * pi/2 - leading[n]) rounded, - * trailing[n] := (( n * pi/2 - leading[n]) - middle[n]) rounded . - */ -trailing: - .double 0d+0.00000000000000000000e+00 # 0 * pi/2 trailing - .double 0d+4.33590506506189049611e-35 # 1 * pi/2 trailing - .double 0d+8.67181013012378099223e-35 # 2 * pi/2 trailing - .double 0d+1.30077151951856714215e-34 # 3 * pi/2 trailing - .double 0d+1.73436202602475619845e-34 # 4 * pi/2 trailing - .double 0d-1.68390735624352669192e-34 # 5 * pi/2 trailing - .double 0d+2.60154303903713428430e-34 # 6 * pi/2 trailing - .double 0d-8.16726343231148352150e-35 # 7 * pi/2 trailing - .double 0d+3.46872405204951239689e-34 # 8 * pi/2 trailing - .double 0d+3.90231455855570147991e-34 # 9 * pi/2 trailing - .double 0d-3.36781471248705338384e-34 # 10 * pi/2 trailing - .double 0d-1.06379439835298071785e-33 # 11 * pi/2 trailing - .double 0d+5.20308607807426856861e-34 # 12 * pi/2 trailing - .double 0d+5.63667658458045770509e-34 # 13 * pi/2 trailing - .double 0d-1.63345268646229670430e-34 # 14 * pi/2 trailing - .double 0d-1.19986217995610764801e-34 # 15 * pi/2 trailing - .double 0d+6.93744810409902479378e-34 # 16 * pi/2 trailing - .double 0d-8.03640094449267300110e-34 # 17 * pi/2 trailing - .double 0d+7.80462911711140295982e-34 # 18 * pi/2 trailing - .double 0d-7.16921993148029483506e-34 # 19 * pi/2 trailing - .double 0d-6.73562942497410676769e-34 # 20 * pi/2 trailing - .double 0d-6.30203891846791677593e-34 # 21 * pi/2 trailing - .double 0d-2.12758879670596143570e-33 # 22 * pi/2 trailing - .double 0d+2.53800212047402350390e-33 # 23 * pi/2 trailing - .double 0d+1.04061721561485371372e-33 # 24 * pi/2 trailing - .double 0d+6.11729905311472319056e-32 # 25 * pi/2 trailing - .double 0d+1.12733531691609154102e-33 # 26 * pi/2 trailing - .double 0d-3.70049587943078297272e-34 # 27 * pi/2 trailing - .double 0d-3.26690537292459340860e-34 # 28 * pi/2 trailing - .double 0d-1.14812616507957271361e-34 # 29 * pi/2 trailing - -middle: - .double 0d+0.00000000000000000000e+00 # 0 * pi/2 middle - .double 0d+5.72118872610983179676e-18 # 1 * pi/2 middle - .double 0d+1.14423774522196635935e-17 # 2 * pi/2 middle - .double 0d-3.83475850529283316309e-17 # 3 * pi/2 middle - .double 0d+2.28847549044393271871e-17 # 4 * pi/2 middle - .double 0d-2.69052076007086676522e-17 # 5 * pi/2 middle - .double 0d-7.66951701058566632618e-17 # 6 * pi/2 middle - .double 0d-1.54628301484890040587e-17 # 7 * pi/2 middle - .double 0d+4.57695098088786543741e-17 # 8 * pi/2 middle - .double 0d+1.07001849766246313192e-16 # 9 * pi/2 middle - .double 0d-5.38104152014173353044e-17 # 10 * pi/2 middle - .double 0d-2.14622680169080983801e-16 # 11 * pi/2 middle - .double 0d-1.53390340211713326524e-16 # 12 * pi/2 middle - .double 0d-9.21580002543456677056e-17 # 13 * pi/2 middle - .double 0d-3.09256602969780081173e-17 # 14 * pi/2 middle - .double 0d+3.03066796603896507006e-17 # 15 * pi/2 middle - .double 0d+9.15390196177573087482e-17 # 16 * pi/2 middle - .double 0d+1.52771359575124969107e-16 # 17 * pi/2 middle - .double 0d+2.14003699532492626384e-16 # 18 * pi/2 middle - .double 0d-1.68853170360202329427e-16 # 19 * pi/2 middle - .double 0d-1.07620830402834670609e-16 # 20 * pi/2 middle - .double 0d+3.97700719404595604379e-16 # 21 * pi/2 middle - .double 0d-4.29245360338161967602e-16 # 22 * pi/2 middle - .double 0d-3.68013020380794313406e-16 # 23 * pi/2 middle - .double 0d-3.06780680423426653047e-16 # 24 * pi/2 middle - .double 0d-2.45548340466059054318e-16 # 25 * pi/2 middle - .double 0d-1.84316000508691335411e-16 # 26 * pi/2 middle - .double 0d-1.23083660551323675053e-16 # 27 * pi/2 middle - .double 0d-6.18513205939560162346e-17 # 28 * pi/2 middle - .double 0d-6.18980636588357585202e-19 # 29 * pi/2 middle - -leading: - .double 0d+0.00000000000000000000e+00 # 0 * pi/2 leading - .double 0d+1.57079632679489661351e+00 # 1 * pi/2 leading - .double 0d+3.14159265358979322702e+00 # 2 * pi/2 leading - .double 0d+4.71238898038468989604e+00 # 3 * pi/2 leading - .double 0d+6.28318530717958645404e+00 # 4 * pi/2 leading - .double 0d+7.85398163397448312306e+00 # 5 * pi/2 leading - .double 0d+9.42477796076937979208e+00 # 6 * pi/2 leading - .double 0d+1.09955742875642763501e+01 # 7 * pi/2 leading - .double 0d+1.25663706143591729081e+01 # 8 * pi/2 leading - .double 0d+1.41371669411540694661e+01 # 9 * pi/2 leading - .double 0d+1.57079632679489662461e+01 # 10 * pi/2 leading - .double 0d+1.72787595947438630262e+01 # 11 * pi/2 leading - .double 0d+1.88495559215387595842e+01 # 12 * pi/2 leading - .double 0d+2.04203522483336561422e+01 # 13 * pi/2 leading - .double 0d+2.19911485751285527002e+01 # 14 * pi/2 leading - .double 0d+2.35619449019234492582e+01 # 15 * pi/2 leading - .double 0d+2.51327412287183458162e+01 # 16 * pi/2 leading - .double 0d+2.67035375555132423742e+01 # 17 * pi/2 leading - .double 0d+2.82743338823081389322e+01 # 18 * pi/2 leading - .double 0d+2.98451302091030359342e+01 # 19 * pi/2 leading - .double 0d+3.14159265358979324922e+01 # 20 * pi/2 leading - .double 0d+3.29867228626928286062e+01 # 21 * pi/2 leading - .double 0d+3.45575191894877260523e+01 # 22 * pi/2 leading - .double 0d+3.61283155162826226103e+01 # 23 * pi/2 leading - .double 0d+3.76991118430775191683e+01 # 24 * pi/2 leading - .double 0d+3.92699081698724157263e+01 # 25 * pi/2 leading - .double 0d+4.08407044966673122843e+01 # 26 * pi/2 leading - .double 0d+4.24115008234622088423e+01 # 27 * pi/2 leading - .double 0d+4.39822971502571054003e+01 # 28 * pi/2 leading - .double 0d+4.55530934770520019583e+01 # 29 * pi/2 leading - -twoOverPi: - .double 0d+6.36619772367581343076e-01 - - .text - _ALIGN_TEXT - -table_lookup: - muld3 %r3,twoOverPi,%r0 - cvtrdl %r0,%r0 # n = nearest int to ((2/pi)*|x|) rnded - mull3 $8,%r0,%r5 - subd2 leading(%r5),%r3 # p = (|x| - leading n*pi/2) exactly - subd3 middle(%r5),%r3,%r1 # q = (p - middle n*pi/2) rounded - subd2 %r1,%r3 # r = (p - q) - subd2 middle(%r5),%r3 # r = r - middle n*pi/2 - subd2 trailing(%r5),%r3 # r = r - trailing n*pi/2 rounded -/* - * If the original argument was negative, - * negate the reduce argument and - * adjust the octant/quadrant number. - */ - tstw 4(%ap) - bgeq abs2 - mnegf %r1,%r1 - mnegf %r3,%r3 -/* subb3 %r0,$8,%r0 ...used for pi/4 reduction -S.McD */ - subb3 %r0,$4,%r0 -abs2: -/* - * Clear all unneeded octant/quadrant bits. - */ -/* bicb2 $0xf8,%r0 ...used for pi/4 reduction -S.McD */ - bicb2 $0xfc,%r0 - rsb -/* - * p.0 - */ - .text - _ALIGN_TEXT -/* - * Only 256 (actually 225) bits of 2/pi are needed for VAX double - * precision; this was determined by enumerating all the nearest - * machine integer multiples of pi/2 using continued fractions. - * (8a8d3673775b7ff7 required the most bits.) -S.McD - */ - .long 0 - .long 0 - .long 0xaef1586d - .long 0x9458eaf7 - .long 0x10e4107f - .long 0xd8a5664f - .long 0x4d377036 - .long 0x09d5f47d - .long 0x91054a7f - .long 0xbe60db93 -bits2opi: - .long 0x00000028 - .long 0 -/* - * Note: wherever you see the word `octant', read `quadrant'. - * Currently this code is set up for pi/2 argument reduction. - * By uncommenting/commenting the appropriate lines, it will - * also serve as a pi/4 argument reduction code. - */ - -/* p.1 - * Trigred preforms argument reduction - * for the trigonometric functions. It - * takes one input argument, a D-format - * number in r1/r0 . The magnitude of - * the input argument must be greater - * than or equal to 1/2 . Trigred produces - * three results: the number of the octant - * occupied by the argument, the reduced - * argument, and an extension of the - * reduced argument. The octant number is - * returned in r0 . The reduced argument - * is returned as a D-format number in - * r2/r1 . An 8 bit extension of the - * reduced argument is returned as an - * F-format number in r3. - * p.2 - */ -trigred: -/* - * Save the sign of the input argument. - */ - movw %r0,-(%sp) -/* - * Extract the exponent field. - */ - extzv $7,$7,%r0,%r2 -/* - * Convert the fraction part of the input - * argument into a quadword integer. - */ - bicw2 $0xff80,%r0 - bisb2 $0x80,%r0 # -S.McD - rotl $16,%r0,%r0 - rotl $16,%r1,%r1 -/* - * If r1 is negative, add 1 to r0 . This - * adjustment is made so that the two's - * complement multiplications done later - * will produce unsigned results. - */ - bgeq posmid - incl %r0 -posmid: -/* p.3 - * - * Set r3 to the address of the first quadword - * used to obtain the needed portion of 2/pi . - * The address is longword aligned to ensure - * efficient access. - */ - ashl $-3,%r2,%r3 - bicb2 $3,%r3 - subl3 %r3,$bits2opi,%r3 -/* - * Set r2 to the size of the shift needed to - * obtain the correct portion of 2/pi . - */ - bicb2 $0xe0,%r2 -/* p.4 - * - * Move the needed 128 bits of 2/pi into - * r11 - r8 . Adjust the numbers to allow - * for unsigned multiplication. - */ - ashq %r2,(%r3),%r10 - - subl2 $4,%r3 - ashq %r2,(%r3),%r9 - bgeq signoff1 - incl %r11 -signoff1: - subl2 $4,%r3 - ashq %r2,(%r3),%r8 - bgeq signoff2 - incl %r10 -signoff2: - subl2 $4,%r3 - ashq %r2,(%r3),%r7 - bgeq signoff3 - incl %r9 -signoff3: -/* p.5 - * - * Multiply the contents of r0/r1 by the - * slice of 2/pi in r11 - r8 . - */ - emul %r0,%r8,$0,%r4 - emul %r0,%r9,%r5,%r5 - emul %r0,%r10,%r6,%r6 - - emul %r1,%r8,$0,%r7 - emul %r1,%r9,%r8,%r8 - emul %r1,%r10,%r9,%r9 - emul %r1,%r11,%r10,%r10 - - addl2 %r4,%r8 - adwc %r5,%r9 - adwc %r6,%r10 -/* p.6 - * - * If there are more than five leading zeros - * after the first two quotient bits or if there - * are more than five leading ones after the first - * two quotient bits, generate more fraction bits. - * Otherwise, branch to code to produce the result. - */ - bicl3 $0xc1ffffff,%r10,%r4 - beql more1 - cmpl $0x3e000000,%r4 - bneq result -more1: -/* p.7 - * - * generate another 32 result bits. - */ - subl2 $4,%r3 - ashq %r2,(%r3),%r5 - bgeq signoff4 - - emul %r1,%r6,$0,%r4 - addl2 %r1,%r5 - emul %r0,%r6,%r5,%r5 - addl2 %r0,%r6 - brb addbits1 - -signoff4: - emul %r1,%r6,$0,%r4 - emul %r0,%r6,%r5,%r5 - -addbits1: - addl2 %r5,%r7 - adwc %r6,%r8 - adwc $0,%r9 - adwc $0,%r10 -/* p.8 - * - * Check for massive cancellation. - */ - bicl3 $0xc0000000,%r10,%r6 -/* bneq more2 -S.McD Test was backwards */ - beql more2 - cmpl $0x3fffffff,%r6 - bneq result -more2: -/* p.9 - * - * If massive cancellation has occurred, - * generate another 24 result bits. - * Testing has shown there will always be - * enough bits after this point. - */ - subl2 $4,%r3 - ashq %r2,(%r3),%r5 - bgeq signoff5 - - emul %r0,%r6,%r4,%r5 - addl2 %r0,%r6 - brb addbits2 - -signoff5: - emul %r0,%r6,%r4,%r5 - -addbits2: - addl2 %r6,%r7 - adwc $0,%r8 - adwc $0,%r9 - adwc $0,%r10 -/* p.10 - * - * The following code produces the reduced - * argument from the product bits contained - * in r10 - r7 . - */ -result: -/* - * Extract the octant number from r10 . - */ -/* extzv $29,$3,%r10,%r0 ...used for pi/4 reduction -S.McD */ - extzv $30,$2,%r10,%r0 -/* - * Clear the octant bits in r10 . - */ -/* bicl2 $0xe0000000,%r10 ...used for pi/4 reduction -S.McD */ - bicl2 $0xc0000000,%r10 -/* - * Zero the sign flag. - */ - clrl %r5 -/* p.11 - * - * Check to see if the fraction is greater than - * or equal to one-half. If it is, add one - * to the octant number, set the sign flag - * on, and replace the fraction with 1 minus - * the fraction. - */ -/* bitl $0x10000000,%r10 ...used for pi/4 reduction -S.McD */ - bitl $0x20000000,%r10 - beql small - incl %r0 - incl %r5 -/* subl3 %r10,$0x1fffffff,%r10 ...used for pi/4 reduction -S.McD */ - subl3 %r10,$0x3fffffff,%r10 - mcoml %r9,%r9 - mcoml %r8,%r8 - mcoml %r7,%r7 -small: -/* p.12 - * - * Test whether the first 29 bits of the ...used for pi/4 reduction -S.McD - * Test whether the first 30 bits of the - * fraction are zero. - */ - tstl %r10 - beql tiny -/* - * Find the position of the first one bit in r10 . - */ - cvtld %r10,%r1 - extzv $7,$7,%r1,%r1 -/* - * Compute the size of the shift needed. - */ - subl3 %r1,$32,%r6 -/* - * Shift up the high order 64 bits of the - * product. - */ - ashq %r6,%r9,%r10 - ashq %r6,%r8,%r9 - brb mult -/* p.13 - * - * Test to see if the sign bit of r9 is on. - */ -tiny: - tstl %r9 - bgeq tinier -/* - * If it is, shift the product bits up 32 bits. - */ - movl $32,%r6 - movq %r8,%r10 - tstl %r10 - brb mult -/* p.14 - * - * Test whether r9 is zero. It is probably - * impossible for both r10 and r9 to be - * zero, but until proven to be so, the test - * must be made. - */ -tinier: - beql zero -/* - * Find the position of the first one bit in r9 . - */ - cvtld %r9,%r1 - extzv $7,$7,%r1,%r1 -/* - * Compute the size of the shift needed. - */ - subl3 %r1,$32,%r1 - addl3 $32,%r1,%r6 -/* - * Shift up the high order 64 bits of the - * product. - */ - ashq %r1,%r8,%r10 - ashq %r1,%r7,%r9 - brb mult -/* p.15 - * - * The following code sets the reduced - * argument to zero. - */ -zero: - clrl %r1 - clrl %r2 - clrl %r3 - brw return -/* p.16 - * - * At this point, r0 contains the octant number, - * r6 indicates the number of bits the fraction - * has been shifted, r5 indicates the sign of - * the fraction, r11/r10 contain the high order - * 64 bits of the fraction, and the condition - * codes indicate where the sign bit of r10 - * is on. The following code multiplies the - * fraction by pi/2 . - */ -mult: -/* - * Save r11/r10 in r4/r1 . -S.McD - */ - movl %r11,%r4 - movl %r10,%r1 -/* - * If the sign bit of r10 is on, add 1 to r11 . - */ - bgeq signoff6 - incl %r11 -signoff6: -/* p.17 - * - * Move pi/2 into r3/r2 . - */ - movq $0xc90fdaa22168c235,%r2 -/* - * Multiply the fraction by the portion of pi/2 - * in r2 . - */ - emul %r2,%r10,$0,%r7 - emul %r2,%r11,%r8,%r7 -/* - * Multiply the fraction by the portion of pi/2 - * in r3 . - */ - emul %r3,%r10,$0,%r9 - emul %r3,%r11,%r10,%r10 -/* - * Add the product bits together. - */ - addl2 %r7,%r9 - adwc %r8,%r10 - adwc $0,%r11 -/* - * Compensate for not sign extending r8 above.-S.McD - */ - tstl %r8 - bgeq signoff6a - decl %r11 -signoff6a: -/* - * Compensate for r11/r10 being unsigned. -S.McD - */ - addl2 %r2,%r10 - adwc %r3,%r11 -/* - * Compensate for r3/r2 being unsigned. -S.McD - */ - addl2 %r1,%r10 - adwc %r4,%r11 -/* p.18 - * - * If the sign bit of r11 is zero, shift the - * product bits up one bit and increment r6 . - */ - blss signon - incl %r6 - ashq $1,%r10,%r10 - tstl %r9 - bgeq signoff7 - incl %r10 -signoff7: -signon: -/* p.19 - * - * Shift the 56 most significant product - * bits into r9/r8 . The sign extension - * will be handled later. - */ - ashq $-8,%r10,%r8 -/* - * Convert the low order 8 bits of r10 - * into an F-format number. - */ - cvtbf %r10,%r3 -/* - * If the result of the conversion was - * negative, add 1 to r9/r8 . - */ - bgeq chop - incl %r8 - adwc $0,%r9 -/* - * If r9 is now zero, branch to special - * code to handle that possibility. - */ - beql carryout -chop: -/* p.20 - * - * Convert the number in r9/r8 into - * D-format number in r2/r1 . - */ - rotl $16,%r8,%r2 - rotl $16,%r9,%r1 -/* - * Set the exponent field to the appropriate - * value. Note that the extra bits created by - * sign extension are now eliminated. - */ - subw3 %r6,$131,%r6 - insv %r6,$7,$9,%r1 -/* - * Set the exponent field of the F-format - * number in r3 to the appropriate value. - */ - tstf %r3 - beql return -/* extzv $7,$8,%r3,%r4 -S.McD */ - extzv $7,$7,%r3,%r4 - addw2 %r4,%r6 -/* subw2 $217,%r6 -S.McD */ - subw2 $64,%r6 - insv %r6,$7,$8,%r3 - brb return -/* p.21 - * - * The following code generates the appropriate - * result for the unlikely possibility that - * rounding the number in r9/r8 resulted in - * a carry out. - */ -carryout: - clrl %r1 - clrl %r2 - subw3 %r6,$132,%r6 - insv %r6,$7,$9,%r1 - tstf %r3 - beql return - extzv $7,$8,%r3,%r4 - addw2 %r4,%r6 - subw2 $218,%r6 - insv %r6,$7,$8,%r3 -/* p.22 - * - * The following code makes an needed - * adjustments to the signs of the - * results or to the octant number, and - * then returns. - */ -return: -/* - * Test if the fraction was greater than or - * equal to 1/2 . If so, negate the reduced - * argument. - */ - blbc %r5,signoff8 - mnegf %r1,%r1 - mnegf %r3,%r3 -signoff8: -/* p.23 - * - * If the original argument was negative, - * negate the reduce argument and - * adjust the octant number. - */ - tstw (%sp)+ - bgeq signoff9 - mnegf %r1,%r1 - mnegf %r3,%r3 -/* subb3 %r0,$8,%r0 ...used for pi/4 reduction -S.McD */ - subb3 %r0,$4,%r0 -signoff9: -/* - * Clear all unneeded octant bits. - * - * bicb2 $0xf8,%r0 ...used for pi/4 reduction -S.McD */ - bicb2 $0xfc,%r0 -/* - * Return. - */ - rsb diff --git a/lib/libm/arch/vax/n_atan2.S b/lib/libm/arch/vax/n_atan2.S deleted file mode 100644 index ba1a022a55e..00000000000 --- a/lib/libm/arch/vax/n_atan2.S +++ /dev/null @@ -1,222 +0,0 @@ -/* $OpenBSD: n_atan2.S,v 1.10 2013/07/15 18:50:32 miod Exp $ */ -/* $NetBSD: n_atan2.S,v 1.1 1995/10/10 23:40:25 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)atan2.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> - -/* - * ATAN2(Y,X) - * RETURN ARG (X+iY) - * VAX D FORMAT (56 BITS PRECISION) - * CODED IN VAX ASSEMBLY LANGUAGE BY K.C. NG, 4/16/85; - * - * - * Method : - * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x). - * 2. Reduce x to positive by (if x and y are unexceptional): - * ARG (x+iy) = arctan(y/x) ... if x > 0, - * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0, - * 3. According to the integer k=4t+0.25 truncated , t=y/x, the argument - * is further reduced to one of the following intervals and the - * arctangent of y/x is evaluated by the corresponding formula: - * - * [0,7/16] atan(y/x) = t - t^3*(a1+t^2*(a2+...(a10+t^2*a11)...) - * [7/16,11/16] atan(y/x) = atan(1/2) + atan( (y-x/2)/(x+y/2) ) - * [11/16.19/16] atan(y/x) = atan( 1 ) + atan( (y-x)/(x+y) ) - * [19/16,39/16] atan(y/x) = atan(3/2) + atan( (y-1.5x)/(x+1.5y) ) - * [39/16,INF] atan(y/x) = atan(INF) + atan( -x/y ) - * - * Special cases: - * Notations: atan2(y,x) == ARG (x+iy) == ARG(x,y). - * - * ARG( NAN , (anything) ) is NaN; - * ARG( (anything), NaN ) is NaN; - * ARG(+(anything but NaN), +-0) is +-0 ; - * ARG(-(anything but NaN), +-0) is +-PI ; - * ARG( 0, +-(anything but 0 and NaN) ) is +-PI/2; - * ARG( +INF,+-(anything but INF and NaN) ) is +-0 ; - * ARG( -INF,+-(anything but INF and NaN) ) is +-PI; - * ARG( +INF,+-INF ) is +-PI/4 ; - * ARG( -INF,+-INF ) is +-3PI/4; - * ARG( (anything but,0,NaN, and INF),+-INF ) is +-PI/2; - * - * Accuracy: - * atan2(y,x) returns the exact ARG(x+iy) nearly rounded. - */ - -ENTRY(atan2f, 0) - cvtfd 8(%ap),-(%sp) - cvtfd 4(%ap),-(%sp) - calls $4,_C_LABEL(atan2) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(atan2l,atan2) -ENTRY(atan2, R2|R3|R4|R5|R6|R7|R8|R9|R10|R11) - movq 4(%ap),%r2 # r2 = y - movq 12(%ap),%r4 # r4 = x - bicw3 $0x7f,%r2,%r0 - bicw3 $0x7f,%r4,%r1 - cmpw %r0,$0x8000 # y is the reserved operand - jeql resop - cmpw %r1,$0x8000 # x is the reserved operand - jeql resop - subl2 $8,%sp - bicw3 $0x7fff,%r2,-4(%fp) # copy y sign bit to -4(fp) - bicw3 $0x7fff,%r4,-8(%fp) # copy x sign bit to -8(fp) - cmpd %r4,$0x4080 # x = 1.0 ? - bneq xnot1 - movq %r2,%r0 - bicw2 $0x8000,%r0 # t = |y| - movq %r0,%r2 # y = |y| - brb begin -xnot1: - bicw3 $0x807f,%r2,%r11 # yexp - jeql yeq0 # if y=0 goto yeq0 - bicw3 $0x807f,%r4,%r10 # xexp - jeql pio2 # if x=0 goto pio2 - subw2 %r10,%r11 # k = yexp - xexp - cmpw %r11,$0x2000 # k >= 64 (exp) ? - jgeq pio2 # atan2 = +-pi/2 - divd3 %r4,%r2,%r0 # t = y/x never overflow - bicw2 $0x8000,%r0 # t > 0 - bicw2 $0xff80,%r2 # clear the exponent of y - bicw2 $0xff80,%r4 # clear the exponent of x - bisw2 $0x4080,%r2 # normalize y to [1,2) - bisw2 $0x4080,%r4 # normalize x to [1,2) - subw2 %r11,%r4 # scale x so that yexp-xexp=k -begin: - cmpw %r0,$0x411c # t : 39/16 - jgeq L50 - addl3 $0x180,%r0,%r10 # 8*t - cvtrfl %r10,%r10 # [8*t] rounded to int - ashl $-1,%r10,%r10 # [8*t]/2 - casel %r10,$0,$4 -L1: - .word L20-L1 - .word L20-L1 - .word L30-L1 - .word L40-L1 - .word L40-L1 -L10: - movq $0xb4d9940f985e407b,%r6 # Hi=.98279372324732906796d0 - movq $0x21b1879a3bc2a2fc,%r8 # Lo=-.17092002525602665777d-17 - subd3 %r4,%r2,%r0 # y-x - addw2 $0x80,%r0 # 2(y-x) - subd2 %r4,%r0 # 2(y-x)-x - addw2 $0x80,%r4 # 2x - movq %r2,%r10 - addw2 $0x80,%r10 # 2y - addd2 %r10,%r2 # 3y - addd2 %r4,%r2 # 3y+2x - divd2 %r2,%r0 # (2y-3x)/(2x+3y) - brw L60 -L20: - cmpw %r0,$0x3280 # t : 2**(-28) - jlss L80 - clrq %r6 # Hi=r6=0, Lo=r8=0 - clrq %r8 - brw L60 -L30: - movq $0xda7b2b0d63383fed,%r6 # Hi=.46364760900080611433d0 - movq $0xf0ea17b2bf912295,%r8 # Lo=.10147340032515978826d-17 - movq %r2,%r0 - addw2 $0x80,%r0 # 2y - subd2 %r4,%r0 # 2y-x - addw2 $0x80,%r4 # 2x - addd2 %r2,%r4 # 2x+y - divd2 %r4,%r0 # (2y-x)/(2x+y) - brb L60 -L50: - movq $0x68c2a2210fda40c9,%r6 # Hi=1.5707963267948966135d1 - movq $0x06e0145c26332326,%r8 # Lo=.22517417741562176079d-17 - cmpw %r0,$0x5100 # y : 2**57 - bgeq L90 - divd3 %r2,%r4,%r0 - bisw2 $0x8000,%r0 # -x/y - brb L60 -L40: - movq $0x68c2a2210fda4049,%r6 # Hi=.78539816339744830676d0 - movq $0x06e0145c263322a6,%r8 # Lo=.11258708870781088040d-17 - subd3 %r4,%r2,%r0 # y-x - addd2 %r4,%r2 # y+x - divd2 %r2,%r0 # (y-x)/(y+x) -L60: - movq %r0,%r10 - muld2 %r0,%r0 - polyd %r0,$12,ptable - muld2 %r10,%r0 - subd2 %r0,%r8 - addd3 %r8,%r10,%r0 - addd2 %r6,%r0 -L80: - movw -8(%fp),%r2 - bneq pim - bisw2 -4(%fp),%r0 # return sign(y)*r0 - ret -L90: # x >= 2**25 - movq %r6,%r0 - brb L80 -pim: - subd3 %r0,$0x68c2a2210fda4149,%r0 # pi-t - bisw2 -4(%fp),%r0 - ret -yeq0: - movw -8(%fp),%r2 - beql zero # if sign(x)=1 return pi - movq $0x68c2a2210fda4149,%r0 # pi=3.1415926535897932270d1 - ret -zero: - clrq %r0 # return 0 - ret -pio2: - movq $0x68c2a2210fda40c9,%r0 # pi/2=1.5707963267948966135d1 - bisw2 -4(%fp),%r0 # return sign(y)*pi/2 - ret -resop: - movq $0x8000,%r0 # propagate the reserved operand - ret - .align 2 -ptable: - .quad 0xb50f5ce96e7abd60 - .quad 0x51e44a42c1073e02 - .quad 0x3487e3289643be35 - .quad 0xdb62066dffba3e54 - .quad 0xcf8e2d5199abbe70 - .quad 0x26f39cb884883e88 - .quad 0x135117d18998be9d - .quad 0x602ce9742e883eba - .quad 0xa35ad0be8e38bee3 - .quad 0xffac922249243f12 - .quad 0x7f14ccccccccbf4c - .quad 0xaa8faaaaaaaa3faa - .quad 0x0000000000000000 diff --git a/lib/libm/arch/vax/n_cbrt.S b/lib/libm/arch/vax/n_cbrt.S deleted file mode 100644 index 6e84d637660..00000000000 --- a/lib/libm/arch/vax/n_cbrt.S +++ /dev/null @@ -1,92 +0,0 @@ -/* $OpenBSD: n_cbrt.S,v 1.6 2013/07/15 04:03:41 espie Exp $ */ -/* $NetBSD: n_cbrt.S,v 1.1 1995/10/10 23:40:26 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)cbrt.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> - -/* - * double cbrt(double arg) - * W. Kahan, 10/13/80. revised 1/13/84 for keeping sign symmetry - * error check by E LeBlanc, 8/18/82 - * Revised and tested by K.C. Ng, 5/2/85 - * Max error less than 0.667 ulps (unit in the last places) - */ -ENTRY(cbrtf, 0) - cvtfd 4(%ap),-(%sp) - calls $2,_C_LABEL(cbrt) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(cbrtl,cbrt) -ENTRY(cbrt, R2|R3|R4|R5|R6|R7) - movq 4(%ap),%r0 # r0 = argument x - bicw3 $0x807f,%r0,%r2 # biased exponent of x - jeql return # cbrt(0)=0 cbrt(res)=res. operand - bicw3 $0x7fff,%r0,%ap # ap has sign(x) - xorw2 %ap,%r0 # r0 is abs(x) - movl %r0,%r2 # r2 has abs(x) - rotl $16,%r2,%r2 # r2 = |x| with bits unscrambled - divl2 $3,%r2 # rough cbrt with bias/3 - addl2 B,%r2 # restore bias, diminish fraction - rotl $16,%r2,%r2 # r2=|q|=|cbrt| to 5 bits - mulf3 %r2,%r2,%r3 # r3 =qq - divf2 %r0,%r3 # r3 = qq/x - mulf2 %r2,%r3 - addf2 C,%r3 # r3 = s = C + qqq/x - divf3 %r3,D,%r4 # r4 = D/s - addf2 E,%r4 - addf2 %r4,%r3 # r3 = s + E + D/s - divf3 %r3,F,%r3 # r3 = F / (s + E + D/s) - addf2 G,%r3 # r3 = G + F / (s + E + D/s) - mulf2 %r3,%r2 # r2 = qr3 = new q to 23 bits - clrl %r3 # r2:r3 = q as double float - muld3 %r2,%r2,%r4 # r4:r5 = qq exactly - divd2 %r4,%r0 # r0:r1 = x/(q*q) rounded - subd3 %r2,%r0,%r6 # r6:r7 = x/(q*q) - q exactly - movq %r2,%r4 # r4:r5 = q - addw2 $0x80,%r4 # r4:r5 = 2 * q - addd2 %r0,%r4 # r4:r5 = 2*q + x/(q*q) - divd2 %r4,%r6 # r6:r7 = (x/(q*q)-q)/(2*q+x/(q*q)) - muld2 %r2,%r6 # r6:r7 = q*(x/(q*q)-q)/(2*q+x/(q*q)) - addd3 %r6,%r2,%r0 # r0:r1 = q + r6:r7 - bisw2 %ap,%r0 # restore the sign bit -return: - ret # error less than 0.667 ulps - -.data - .align 2 -B : .long 721142941 # (86-0.03306235651)*(2^23) -C : .float 0f0.5428571429 # 19/35 -D : .float 0f-0.7053061224 # -864/1225 -E : .float 0f1.414285714 # 99/70 -F : .float 0f1.607142857 # 45/28 -G : .float 0f0.3571428571 # 5/14 diff --git a/lib/libm/arch/vax/n_hypot.S b/lib/libm/arch/vax/n_hypot.S deleted file mode 100644 index 680cfe5a792..00000000000 --- a/lib/libm/arch/vax/n_hypot.S +++ /dev/null @@ -1,124 +0,0 @@ -/* $OpenBSD: n_hypot.S,v 1.4 2013/07/15 18:50:32 miod Exp $ */ -/* $NetBSD: n_cabs.S,v 1.1 1995/10/10 23:40:26 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)cabs.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> - -/* - * double precision complex absolute value - * CABS by W. Kahan, 9/7/80. - * Revised for reserved operands by E. LeBlanc, 8/18/82 - * argument for complex absolute value by reference, *4(ap) - * argument for cabs and hypot (C fcns) by value, 4(ap) - * output is in r0:r1 (error less than 0.86 ulps) - */ - -/* entry for c functions cabs and hypot */ -ENTRY(hypotf, 0) - cvtfd 8(%ap),-(%sp) - cvtfd 4(%ap),-(%sp) - calls $4,_C_LABEL(hypot) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(hypotl, hypot) - -ENTRY(hypot, 0x8000|R2|R3|R4|R5|R6) # enable floating overflow - movq 4(%ap),%r0 # r0:1 = x - movq 12(%ap),%r2 # r2:3 = y - bicw3 $0x7f,%r0,%r4 # r4 has signed biased exp of x - cmpw $0x8000,%r4 - jeql return # x is a reserved operand, so return it - bicw3 $0x7f,%r2,%r5 # r5 has signed biased exp of y - cmpw $0x8000,%r5 - jneq cont /* y isn't a reserved operand */ - movq %r2,%r0 /* return y if it's reserved */ - ret - -cont: - bsbb regs_set # r0:1 = dsqrt(x^2+y^2)/2^r6 - addw2 %r6,%r0 # unscaled cdabs in r0:1 - jvc return # unless it overflows - subw2 $0x80,%r0 # halve r0 to get meaningful overflow - addd2 %r0,%r0 # overflow; r0 is half of true abs value -return: - ret - -#if 0 /* apparently not used */ -_ALTENTRY(__libm_cdabs_r6) # ENTRY POINT for cdsqrt - # calculates a scaled (factor in r6) - # complex absolute value - - movq (%r4)+,%r0 # r0:r1 = x via indirect addressing - movq (%r4),%r2 # r2:r3 = y via indirect addressing - - bicw3 $0x7f,%r0,%r5 # r5 has signed biased exp of x - cmpw $0x8000,%r5 - jeql cdreserved # x is a reserved operand - bicw3 $0x7f,%r2,%r5 # r5 has signed biased exp of y - cmpw $0x8000,%r5 - jneq regs_set /* y isn't a reserved operand either? */ - -cdreserved: - movl *4(%ap),%r4 # r4 -> (u,v), if x or y is reserved - movq %r0,(%r4)+ # copy u and v as is and return - movq %r2,(%r4) # (again addressing is indirect) - ret -#endif - -regs_set: - bicw2 $0x8000,%r0 # r0:r1 = dabs(x) - bicw2 $0x8000,%r2 # r2:r3 = dabs(y) - cmpw %r0,%r2 - jgeq ordered - movq %r0,%r4 - movq %r2,%r0 - movq %r4,%r2 # force y's exp <= x's exp -ordered: - bicw3 $0x7f,%r0,%r6 # r6 = exponent(x) + bias(129) - jeql retsb # if x = y = 0 then cdabs(x,y) = 0 - subw2 $0x4780,%r6 # r6 = exponent(x) - 14 - subw2 %r6,%r0 # 2^14 <= scaled x < 2^15 - bitw $0xff80,%r2 - jeql retsb # if y = 0 return dabs(x) - subw2 %r6,%r2 - cmpw $0x3780,%r2 # if scaled y < 2^-18 - jgtr retsb # return dabs(x) - emodd %r0,$0,%r0,%r4,%r0 # r4 + r0:1 = scaled x^2 - emodd %r2,$0,%r2,%r5,%r2 # r5 + r2:3 = scaled y^2 - addd2 %r2,%r0 - addl2 %r5,%r4 - cvtld %r4,%r2 - addd2 %r2,%r0 # r0:1 = scaled x^2 + y^2 - jmp __libm_dsqrt_r5 # r0:1 = dsqrt(x^2+y^2)/2^r6 -retsb: - rsb # error < 0.86 ulp diff --git a/lib/libm/arch/vax/n_infnan.S b/lib/libm/arch/vax/n_infnan.S deleted file mode 100644 index aff89c9fd46..00000000000 --- a/lib/libm/arch/vax/n_infnan.S +++ /dev/null @@ -1,52 +0,0 @@ -/* $OpenBSD: n_infnan.S,v 1.4 2013/07/05 21:10:50 miod Exp $ */ -/* $NetBSD: n_infnan.S,v 1.1 1995/10/10 23:40:27 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)infnan.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> -#include <sys/errno.h> - -/* - * infnan(arg) int arg; - * where arg := EDOM if result is NaN - * := ERANGE if result is +INF - * := -ERANGE if result is -INF - * - * The Reserved Operand Fault is generated inside of this routine. - */ -ENTRY(infnan,0) - cmpl 4(%ap),$ERANGE - bneq 1f - movl $ERANGE,_C_LABEL(errno) - brb 2f -1: movl $EDOM,_C_LABEL(errno) -2: emodd $0,$0,$0x8000,%r0,%r0 # generates the reserved operand fault - ret diff --git a/lib/libm/arch/vax/n_sincos.S b/lib/libm/arch/vax/n_sincos.S deleted file mode 100644 index 5c0e89930cf..00000000000 --- a/lib/libm/arch/vax/n_sincos.S +++ /dev/null @@ -1,115 +0,0 @@ -/* $OpenBSD: n_sincos.S,v 1.10 2013/07/15 04:03:41 espie Exp $ */ -/* $NetBSD: n_sincos.S,v 1.1 1995/10/10 23:40:28 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)sincos.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> - -/* - * This is the implementation of Peter Tang's double precision - * sine and cosine for the VAX using Bob Corbett's argument reduction. - * - * Notes: - * under 1,024,000 random arguments testing on [0,2*pi] - * sin() observed maximum error = 0.814 ulps - * cos() observed maximum error = 0.792 ulps - * - * double - * sin(double arg) - * method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett - * S. McDonald, April 4, 1985 - */ - -ENTRY(sinf, 0) - cvtfd 4(%ap),-(%sp) - calls $2,_C_LABEL(sin) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(sinl,sin) -ENTRY(sin, R2|R3|R4|R5|R6|R7|R8|R9|R10|R11) - movq 4(%ap),%r0 - bicw3 $0x807f,%r0,%r2 - beql 1f # if x is zero or reserved operand then return x -/* - * Save the PSL's IV & FU bits on the stack. - */ - movpsl %r2 - bicw3 $0xff9f,%r2,-(%sp) -/* - * Clear the IV & FU bits. - */ - bicpsw $0x0060 -/* - * Entered by sine ; save 0 in r4 . - */ - jsb __libm_argred - movl $0,%r4 - jsb __libm_sincos - bispsw (%sp)+ -1: ret - -/* - * double - * cos(double arg) - * method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett - * S. McDonald, April 4, 1985 - */ - -ENTRY(cosf, 0) - cvtfd 4(%ap),-(%sp) - calls $2,_C_LABEL(cos) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(cosl,cos) -ENTRY(cos, R2|R3|R4|R5|R6|R7|R8|R9|R10|R11) - movq 4(%ap),%r0 - bicw3 $0x7f,%r0,%r2 - cmpw $0x8000,%r2 - beql 1f # if x is reserved operand then return x -/* - * Save the PSL's IV & FU bits on the stack. - */ - movpsl %r2 - bicw3 $0xff9f,%r2,-(%sp) -/* - * Clear the IV & FU bits. - */ - bicpsw $0x0060 -/* - * Entered by cosine ; save 1 in r4 . - */ - jsb __libm_argred - movl $1,%r4 - jsb __libm_sincos - bispsw (%sp)+ -1: ret diff --git a/lib/libm/arch/vax/n_sqrt.S b/lib/libm/arch/vax/n_sqrt.S deleted file mode 100644 index 666a818f096..00000000000 --- a/lib/libm/arch/vax/n_sqrt.S +++ /dev/null @@ -1,116 +0,0 @@ -/* $OpenBSD: n_sqrt.S,v 1.11 2013/07/15 04:03:41 espie Exp $ */ -/* $NetBSD: n_sqrt.S,v 1.1 1995/10/10 23:40:29 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)sqrt.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> -#include <sys/errno.h> - -/* - * double - * sqrt(double arg) revised August 15,1982 - * if(arg<0.0) { errno = EDOM; return(<a reserved operand>); } - * if arg is a reserved operand it is returned as it is - * W. Kahan's magic square root - * coded by Heidi Stettner and revised by Emile LeBlanc 8/18/82 - * - * entry points: sqrt double arg is on the stack - */ - -ENTRY(sqrtf, 0) - cvtfd 4(%ap),-(%sp) - calls $2,_C_LABEL(sqrt) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(sqrtl,sqrt) -ENTRY(sqrt, R2|R3|R4|R5) - movq 4(%ap),%r0 -dsqrt2: bicw3 $0x807f,%r0,%r2 # check exponent of input - jeql noexp # biased exponent is zero -> 0.0 or reserved - bsbb __libm_dsqrt_r5 -noexp: ret - -/* **************************** internal procedure */ - -_ALTENTRY(__libm_dsqrt_r5) /* ENTRY POINT FOR cdabs and cdsqrt */ - /* returns double square root scaled by */ - /* 2^r6 */ - - movd %r0,%r4 - jleq nonpos # argument is not positive - movzwl %r4,%r2 - ashl $-1,%r2,%r0 - addw2 $0x203c,%r0 # r0 has magic initial approximation -/* - * Do two steps of Heron's rule - * ((arg/guess) + guess) / 2 = better guess - */ - divf3 %r0,%r4,%r2 - addf2 %r2,%r0 - subw2 $0x80,%r0 # divide by two - - divf3 %r0,%r4,%r2 - addf2 %r2,%r0 - subw2 $0x80,%r0 # divide by two - -/* Scale argument and approximation to prevent over/underflow */ - - bicw3 $0x807f,%r4,%r1 - subw2 $0x4080,%r1 # r1 contains scaling factor - subw2 %r1,%r4 - movl %r0,%r2 - subw2 %r1,%r2 - -/* Cubic step - * - * b = a + 2*a*(n-a*a)/(n+3*a*a) where b is better approximation, - * a is approximation, and n is the original argument. - * (let s be scale factor in the following comments) - */ - clrl %r1 - clrl %r3 - muld2 %r0,%r2 # r2:r3 = a*a/s - subd2 %r2,%r4 # r4:r5 = n/s - a*a/s - addw2 $0x100,%r2 # r2:r3 = 4*a*a/s - addd2 %r4,%r2 # r2:r3 = n/s + 3*a*a/s - muld2 %r0,%r4 # r4:r5 = a*n/s - a*a*a/s - divd2 %r2,%r4 # r4:r5 = a*(n-a*a)/(n+3*a*a) - addw2 $0x80,%r4 # r4:r5 = 2*a*(n-a*a)/(n+3*a*a) - addd2 %r4,%r0 # r0:r1 = a + 2*a*(n-a*a)/(n+3*a*a) - rsb # DONE! -nonpos: - jneq negarg - ret # argument and root are zero -negarg: - pushl $EDOM - calls $1,_C_LABEL(infnan) # generate the reserved op fault - ret diff --git a/lib/libm/arch/vax/n_support.S b/lib/libm/arch/vax/n_support.S deleted file mode 100644 index 61702f2d885..00000000000 --- a/lib/libm/arch/vax/n_support.S +++ /dev/null @@ -1,238 +0,0 @@ -/* $OpenBSD: n_support.S,v 1.19 2013/08/06 19:02:14 espie Exp $ */ -/* $NetBSD: n_support.S,v 1.1 1995/10/10 23:40:30 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)support.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> -#include <sys/errno.h> - -/* - * copysign(x,y), - * copysignf(x,y), - * logb(x), - * logbf(x), - * scalbn(x,N), - * remainder(x,y), - * Coded in vax assembly language by K.C. Ng, 3/14/85. - * Revised by K.C. Ng on 4/9/85. - * Float versions by M.V. on 11/19/08. - */ - -/* - * double - * copysign(double x, double y) - */ - -STRONG_ALIAS(copysignl,copysign) -ENTRY(copysign, R2) - movq 4(%ap),%r0 # load x into r0 - bicw3 $0x807f,%r0,%r2 # mask off the exponent of x - beql Lz # if zero or reserved op then return x - bicw3 $0x7fff,12(%ap),%r2 # copy the sign bit of y into r2 - bicw2 $0x8000,%r0 # replace x by |x| - bisw2 %r2,%r0 # copy the sign bit of y to x -Lz: ret - -/* - * float - * copysignf(float x, float y) - */ - -ENTRY(copysignf, R2) - movl 4(%ap),%r0 # load x into r0 - bicw3 $0x807f,%r0,%r2 # mask off the exponent of x - beql Fz # if zero or reserved op then return x - bicw3 $0x7fff,8(%ap),%r2 # copy the sign bit of y into r2 - bicw2 $0x8000,%r0 # replace x by |x| - bisw2 %r2,%r0 # copy the sign bit of y to x -Fz: ret - -/* - * double - * logb(double x) - */ - -STRONG_ALIAS(logbl,logb) -ENTRY(logb, 0) - bicl3 $0xffff807f,4(%ap),%r0 # mask off the exponent of x - beql Ln - ashl $-7,%r0,%r0 # get the bias exponent - subl2 $129,%r0 # get the unbias exponent - cvtld %r0,%r0 # return the answer in double - ret -Ln: movq 4(%ap),%r0 # r0:1 = x (zero or reserved op) - bneq 1f # simply return if reserved op - movq $0x0000fe00ffffcfff,%r0 # -2147483647.0 -1: ret - -/* - * float - * logbf(float x) - */ - -ENTRY(logbf, 0) - bicl3 $0xffff807f,4(%ap),%r0 # mask off the exponent of x - beql Fn - ashl $-7,%r0,%r0 # get the bias exponent - subl2 $129,%r0 # get the unbias exponent - cvtlf %r0,%r0 # return the answer in float - ret -Fn: movl 4(%ap),%r0 # r0:1 = x (zero or reserved op) - bneq 1f # simply return if reserved op - movl $0x0000d000,%r0 # -2147483647.0 -1: ret - -/* - * double - * scalbn(double x, int N) - */ - -ENTRY(scalbnf, 0) - movl 8(%ap),-(%sp) - cvtfd 4(%ap),-(%sp) - calls $3, _C_LABEL(scalbn) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(scalbnl,scalbn) -ENTRY(scalbn, R2|R3) - movq 4(%ap),%r0 - bicl3 $0xffff807f,%r0,%r3 - beql ret1 # 0 or reserved operand - movl 12(%ap),%r2 - cmpl %r2,$0x12c - bgeq ovfl - cmpl %r2,$-0x12c - bleq unfl - ashl $7,%r2,%r2 - addl2 %r2,%r3 - bleq unfl - cmpl %r3,$0x8000 - bgeq ovfl - addl2 %r2,%r0 - ret -ovfl: pushl $ERANGE - calls $1,_C_LABEL(infnan) # if it returns - bicw3 $0x7fff,4(%ap),%r2 # get the sign of input arg - bisw2 %r2,%r0 # re-attach the sign to r0/1 - ret -unfl: movq $0,%r0 -ret1: ret - -/* - * REMAINDER(X,Y) - * RETURN X REM Y =X-N*Y, N=[X/Y] ROUNDED (ROUNDED TO EVEN IN THE HALF WAY CASE) - * DOUBLE PRECISION (VAX D format 56 bits) - * CODED IN VAX ASSEMBLY LANGUAGE BY K.C. NG, 4/8/85. - */ - -ALTENTRY(drem) -ENTRY(remainder, R2|R3|R4|R5|R6|R7|R8|R9|R10|R11) - subl2 $12,%sp - movq 4(%ap),%r0 #r0=x - movq 12(%ap),%r2 #r2=y - jeql Rop #if y=0 then generate reserved op fault - bicw3 $0x007f,%r0,%r4 #check if x is Rop - cmpw %r4,$0x8000 - jeql Ret #if x is Rop then return Rop - bicl3 $0x007f,%r2,%r4 #check if y is Rop - cmpw %r4,$0x8000 - jeql Ret #if y is Rop then return Rop - bicw2 $0x8000,%r2 #y := |y| - movw $0,-4(%fp) #-4(fp) = nx := 0 - cmpw %r2,$0x1c80 #yexp ? 57 - bgtr C1 #if yexp > 57 goto C1 - addw2 $0x1c80,%r2 #scale up y by 2**57 - movw $0x1c80,-4(%fp) #nx := 57 (exponent field) -C1: - movw -4(%fp),-8(%fp) #-8(fp) = nf := nx - bicw3 $0x7fff,%r0,-12(%fp) #-12(fp) = sign of x - bicw2 $0x8000,%r0 #x := |x| - movq %r2,%r10 #y1 := y - bicl2 $0xffff07ff,%r11 #clear the last 27 bits of y1 -loop: - cmpd %r0,%r2 #x ? y - bleq E1 #if x <= y goto E1 - /* begin argument reduction */ - movq %r2,%r4 #t =y - movq %r10,%r6 #t1=y1 - bicw3 $0x807f,%r0,%r8 #xexp= exponent of x - bicw3 $0x807f,%r2,%r9 #yexp= exponent fo y - subw2 %r9,%r8 #xexp-yexp - subw2 $0x0c80,%r8 #k=xexp-yexp-25(exponent bit field) - blss C2 #if k<0 goto C2 - addw2 %r8,%r4 #t +=k - addw2 %r8,%r6 #t1+=k, scale up t and t1 -C2: - divd3 %r4,%r0,%r8 #x/t - cvtdl %r8,%r8 #n=[x/t] truncated - cvtld %r8,%r8 #float(n) - subd2 %r6,%r4 #t:=t-t1 - muld2 %r8,%r4 #n*(t-t1) - muld2 %r8,%r6 #n*t1 - subd2 %r6,%r0 #x-n*t1 - subd2 %r4,%r0 #(x-n*t1)-n*(t-t1) - brb loop -E1: - movw -4(%fp),%r6 #r6=nx - beql C3 #if nx=0 goto C3 - addw2 %r6,%r0 #x:=x*2**57 scale up x by nx - movw $0,-4(%fp) #clear nx - brb loop -C3: - movq %r2,%r4 #r4 = y - subw2 $0x80,%r4 #r4 = y/2 - cmpd %r0,%r4 #x:y/2 - blss E2 #if x < y/2 goto E2 - bgtr C4 #if x > y/2 goto C4 - cvtdl %r8,%r8 #ifix(float(n)) - blbc %r8,E2 #if the last bit is zero, goto E2 -C4: - subd2 %r2,%r0 #x-y -E2: - xorw2 -12(%fp),%r0 #x^sign (exclusive or) - movw -8(%fp),%r6 #r6=nf - bicw3 $0x807f,%r0,%r8 #r8=exponent of x - bicw2 $0x7f80,%r0 #clear the exponent of x - subw2 %r6,%r8 #r8=xexp-nf - bgtr C5 #if xexp-nf is positive goto C5 - movw $0,%r8 #clear r8 - movq $0,%r0 #x underflow to zero -C5: - bisw2 %r8,%r0 #put r8 into exponent field of x - ret -Rop: #Reserved operand - pushl $EDOM - calls $1,_C_LABEL(infnan) #generate reserved op fault - ret -Ret: - movq $0x8000,%r0 #propagate reserved op - ret diff --git a/lib/libm/arch/vax/n_tan.S b/lib/libm/arch/vax/n_tan.S deleted file mode 100644 index c71690843d8..00000000000 --- a/lib/libm/arch/vax/n_tan.S +++ /dev/null @@ -1,98 +0,0 @@ -/* $OpenBSD: n_tan.S,v 1.10 2013/07/15 04:03:41 espie Exp $ */ -/* $NetBSD: n_tan.S,v 1.1 1995/10/10 23:40:31 ragge Exp $ */ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. 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. - * - * @(#)tan.s 8.1 (Berkeley) 6/4/93 - */ - -#include <machine/asm.h> - -/* This is the implementation of Peter Tang's double precision - * tangent for the VAX using Bob Corbett's argument reduction. - * - * Notes: - * under 1,024,000 random arguments testing on [0,2*pi] - * tan() observed maximum error = 2.15 ulps - * - * double - * tan(double arg) - * method: true range reduction to [-pi/4,pi/4], P. Tang & B. Corbett - * S. McDonald, April 4, 1985 - */ - -ENTRY(tanf, 0) - cvtfd 4(%ap),-(%sp) - calls $2,_C_LABEL(tan) - cvtdf %r0,%r0 - ret - -STRONG_ALIAS(tanl,tan) -ENTRY(tan, R2|R3|R4|R5|R6|R7|R8|R9|R10|R11) - movq 4(%ap),%r0 - bicw3 $0x807f,%r0,%r2 - beql 1f # if x is zero or reserved operand then return x -/* - * Save the PSL's IV & FU bits on the stack. - */ - movpsl %r2 - bicw3 $0xff9f,%r2,-(%sp) -/* - * Clear the IV & FU bits. - */ - bicpsw $0x0060 - jsb __libm_argred -/* - * At this point, - * r0 contains the quadrant number, 0, 1, 2, or 3; - * r2/r1 contains the reduced argument as a D-format number; - * r3 contains a F-format extension to the reduced argument; - * - * Save r3/r0 so that we can call cosine after calling sine. - */ - movq %r2,-(%sp) - movq %r0,-(%sp) -/* - * Call sine. r4 = 0 implies sine. - */ - movl $0,%r4 - jsb __libm_sincos -/* - * Save sin(x) in r11/r10 . - */ - movd %r0,%r10 -/* - * Call cosine. r4 = 1 implies cosine. - */ - movq (%sp)+,%r0 - movq (%sp)+,%r2 - movl $1,%r4 - jsb __libm_sincos - divd3 %r0,%r10,%r0 - bispsw (%sp)+ -1: ret |