etc/services - sync with NetBSD-8
[minix.git] / lib / libm / arch / vax / n_scalbn.S
blob5a071c0ca23cef304299677db2a6dbf11a966ea1
1 /*-
2  * Copyright (c) 2011 The NetBSD Foundation, Inc.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to The NetBSD Foundation
6  * by Matt Thomas of 3am Software Foundry.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
30 #include <machine/asm.h>
31 #include <sys/errno.h>
33 RCSID("$NetBSD: n_scalbn.S,v 1.5 2014/02/03 21:22:21 martin Exp $")
35 WEAK_ALIAS(scalbn,_scalbn)
36 WEAK_ALIAS(scalbnl,_scalbnl)
37 WEAK_ALIAS(scalbnf,_scalbnf)
38 WEAK_ALIAS(ldexp,_scalbn)
39 WEAK_ALIAS(ldexpf,_scalbnf)
40 WEAK_ALIAS(ldexpl,_scalbnl)
42 ENTRY(_scalbnf, 0)
43         cvtfd   4(%ap), %r0
44         movl    8(%ap), %r2
45         jr      1f
47 ALTENTRY(_scalbnl)
48 ENTRY(_scalbn, 0)
49         movd    4(%ap), %r0
50         movl    12(%ap), %r2
52         /*
53          * First see if the result will be within bounds
54          */
55 1:      cmpl    %r2,$(256+55)
56         jgeq    overflow
57         cmpl    %r2,$-(256+55)
58         jleq    underflow
60         extzv   $7, $9, %r0, %r3        /* extract exponent */
61         jneq    5f                      /* 0 * N is still 0 */
62         cmpw    %r3, $-256              /* is this a NAN? */
63         jgtr    2f                      /*    nope */
64         ret
66 2:      movzbl  %r3, %r3                /* clear sign bit */
67         addl2   %r2, %r3                /* add to exponent */
68         jleq    underflow               /*   <= 0? */
70 3:      jbs     $8, %r3, overflow       /* did exponent overflow? */
71         insv    $7, $8, %r3, %r0        /* replace exponent */
72         ret
74 underflow:
75         clrq    %r0                     /* return 0.0 */
76         jr      copysign                /* or mabye -0.0 */
77 overflow:
78         pushl   $ERANGE                 /* overflow */
79         calls   $1, _C_LABEL(infnan)    /* possibly signal */
80 copysign:
81         jbc     $15, 4(%ap), 5f         /* if clear, don't set sign-bit */
82         bisw2   $0x8000, %r0            /* preserve sign-bit */
84         ret