Remove building with NOCRYPTO option
[minix3.git] / lib / libm / arch / vax / n_support.S
blobf0b7100ad6a279ee52401e212c2356ecaf004f1f
1 /*      $NetBSD: n_support.S,v 1.10 2014/11/14 14:53:17 joerg 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  *      @(#)support.s   8.1 (Berkeley) 6/4/93
31  */
32 #include <machine/asm.h>
34 WEAK_ALIAS(logbl,logb)
35 WEAK_ALIAS(copysignl, _copysignl)
36 WEAK_ALIAS(_copysignl, copysign)
38         .text
39 _sccsid:
40         .asciz "@(#)support.s\t1.3 (Berkeley) 8/21/85; 8.1 (ucb.elefunt) 6/4/93"
43  * copysign(x,y),
44  * logb(x),
45  * scalb(x,N),
46  * finite(x),
47  * drem(x,y),
48  * Coded in vax assembly language by K.C. Ng,  3/14/85.
49  * Revised by K.C. Ng on 4/9/85.
50  */
53  * double copysign(double x,double y)
54  */
56 ENTRY(copysign, 0)
57         movq    4(%ap),%r0              # load x into %r0
58         bicw3   $0x807f,%r0,%r2         # mask off the exponent of x
59         beql    Lz                      # if zero or reserved op then return x
60         bicw3   $0x7fff,12(%ap),%r2     # copy the sign bit of y into %r2
61         bicw2   $0x8000,%r0             # replace x by |x|
62         bisw2   %r2,%r0                 # copy the sign bit of y to x
63 Lz:     ret
65 ENTRY(copysignf, 0)
66         movl    4(%ap),%r0              # load x into %r0
67         bicw3   $0x807f,%r0,%r2         # mask off the exponent of x
68         beql    1f                      # if zero or reserved op then return x
69         bicw3   $0x7fff,8(%ap),%r2      # copy the sign bit of y into %r2
70         bicw2   $0x8000,%r0             # replace x by |x|
71         bisw2   %r2,%r0                 # copy the sign bit of y to x
72 1:      ret
75  * float logbf(float x);
76  */
77 ENTRY(logbf, 0)
78         cvtfd   4(%ap),-(%sp)
79         calls   $2,_C_LABEL(logb)
80         cvtdf   %r0,%r0
81         ret
84  * double logb(double x);
85  */
86 ENTRY(logb, 0)
87         bicl3   $0xffff807f,4(%ap),%r0  # mask off the exponent of x
88         beql    Ln
89         ashl    $-7,%r0,%r0             # get the bias exponent
90         subl2   $129,%r0                        # get the unbias exponent
91         cvtld   %r0,%r0                 # return the answer in double
92         ret
93 Ln:     movq    4(%ap),%r0              # %r0:1 = x (zero or reserved op)
94         bneq    1f                      # simply return if reserved op
95         movq    $0x0000fe00ffffcfff,%r0  # -2147483647.0
96 1:      ret
99  * long finite(double x);
100  */
101 #ifndef __GFLOAT__
102         .globl finitef
103 finitef = finite
104 #endif
105 ENTRY(finite, 0)
106         bicw3   $0x7f,4(%ap),%r0        # mask off the mantissa
107         cmpw    %r0,$0x8000             # to see if x is the reserved op
108         beql    1f                      # if so, return FALSE (0)
109         movl    $1,%r0                  # else return TRUE (1)
110         ret
111 1:      clrl    %r0
112         ret
114 /* int isnan(double x);
115  */
116 #if 0
117 ENTRY(isnan, 0)
118         clrl    %r0
119         ret
120 #endif
122 /* int isnanf(float x);
123  */
124 ENTRY(isnanf, 0)
125         clrl    %r0
126         ret
129  * double scalb(x,N)
130  * double x; double N;
131  */
132         .set    ERANGE,34
134 ENTRY(scalb, 0)
135         movq    4(%ap),%r0
136         bicl3   $0xffff807f,%r0,%r3
137         beql    ret1                    # 0 or reserved operand
138         movq    12(%ap),%r4
139         cvtdl   %r4, %r2
140         cmpl    %r2,$0x12c
141         bgeq    ovfl
142         cmpl    %r2,$-0x12c
143         bleq    unfl
144         ashl    $7,%r2,%r2
145         addl2   %r2,%r3
146         bleq    unfl
147         cmpl    %r3,$0x8000
148         bgeq    ovfl
149         addl2   %r2,%r0
150         ret
151 ovfl:   pushl   $ERANGE
152         calls   $1,_C_LABEL(infnan)     # if it returns
153         bicw3   $0x7fff,4(%ap),%r2      # get the sign of input arg
154         bisw2   %r2,%r0                 # re-attach the sign to %r0/1
155         ret
156 unfl:   movq    $0,%r0
157 ret1:   ret
160  * DREM(X,Y)
161  * RETURN X REM Y =X-N*Y, N=[X/Y] ROUNDED (ROUNDED TO EVEN IN THE HALF WAY CASE)
162  * DOUBLE PRECISION (VAX D format 56 bits)
163  * CODED IN VAX ASSEMBLY LANGUAGE BY K.C. NG, 4/8/85.
164  */
165         .set    EDOM,33
167 ENTRY(drem, 0x0fc0)
168         subl2   $12,%sp
169         movq    4(%ap),%r0              #%r0=x
170         movq    12(%ap),%r2             #%r2=y
171         jeql    Rop                     #if y=0 then generate reserved op fault
172         bicw3   $0x007f,%r0,%r4         #check if x is Rop
173         cmpw    %r4,$0x8000
174         jeql    Ret                     #if x is Rop then return Rop
175         bicl3   $0x007f,%r2,%r4         #check if y is Rop
176         cmpw    %r4,$0x8000
177         jeql    Ret                     #if y is Rop then return Rop
178         bicw2   $0x8000,%r2             #y  := |y|
179         movw    $0,-4(%fp)              #-4(%fp) = nx := 0
180         cmpw    %r2,$0x1c80             #yexp ? 57
181         bgtr    C1                      #if yexp > 57 goto C1
182         addw2   $0x1c80,%r2             #scale up y by 2**57
183         movw    $0x1c80,-4(%fp)         #nx := 57 (exponent field)
185         movw    -4(%fp),-8(%fp)         #-8(%fp) = nf := nx
186         bicw3   $0x7fff,%r0,-12(%fp)    #-12(%fp) = sign of x
187         bicw2   $0x8000,%r0             #x  := |x|
188         movq    %r2,%r10                        #y1 := y
189         bicl2   $0xffff07ff,%r11                #clear the last 27 bits of y1
190 loop:
191         cmpd    %r0,%r2                 #x ? y
192         bleq    E1                      #if x <= y goto E1
193  /* begin argument reduction */
194         movq    %r2,%r4                 #t =y
195         movq    %r10,%r6                        #t1=y1
196         bicw3   $0x807f,%r0,%r8         #xexp= exponent of x
197         bicw3   $0x807f,%r2,%r9         #yexp= exponent fo y
198         subw2   %r9,%r8                 #xexp-yexp
199         subw2   $0x0c80,%r8             #k=xexp-yexp-25(exponent bit field)
200         blss    C2                      #if k<0 goto C2
201         addw2   %r8,%r4                 #t +=k
202         addw2   %r8,%r6                 #t1+=k, scale up t and t1
204         divd3   %r4,%r0,%r8             #x/t
205         cvtdl   %r8,%r8                 #n=[x/t] truncated
206         cvtld   %r8,%r8                 #float(n)
207         subd2   %r6,%r4                 #t:=t-t1
208         muld2   %r8,%r4                 #n*(t-t1)
209         muld2   %r8,%r6                 #n*t1
210         subd2   %r6,%r0                 #x-n*t1
211         subd2   %r4,%r0                 #(x-n*t1)-n*(t-t1)
212         jbr     loop
214         movw    -4(%fp),%r6             #%r6=nx
215         beql    C3                      #if nx=0 goto C3
216         addw2   %r6,%r0                 #x:=x*2**57 scale up x by nx
217         movw    $0,-4(%fp)              #clear nx
218         jbr     loop
220         movq    %r2,%r4                 #%r4 = y
221         subw2   $0x80,%r4               #%r4 = y/2
222         cmpd    %r0,%r4                 #x:y/2
223         blss    E2                      #if x < y/2 goto E2
224         bgtr    C4                      #if x > y/2 goto C4
225         cvtdl   %r8,%r8                 #ifix(float(n))
226         blbc    %r8,E2                  #if the last bit is zero, goto E2
228         subd2   %r2,%r0                 #x-y
230         xorw2   -12(%fp),%r0            #x^sign (exclusive or)
231         movw    -8(%fp),%r6             #%r6=nf
232         bicw3   $0x807f,%r0,%r8         #%r8=exponent of x
233         bicw2   $0x7f80,%r0             #clear the exponent of x
234         subw2   %r6,%r8                 #%r8=xexp-nf
235         bgtr    C5                      #if xexp-nf is positive goto C5
236         movw    $0,%r8                  #clear %r8
237         movq    $0,%r0                  #x underflow to zero
239         bisw2   %r8,%r0                 /* put %r8 into x's exponent field */
240         ret
241 Rop:                                    #Reserved operand
242         pushl   $EDOM
243         calls   $1,_C_LABEL(infnan)     #generate reserved op fault
244         ret
245 Ret:
246         movq    $0x8000,%r0             #propagate reserved op
247         ret