hotspot/src/share/vm/runtime/sharedRuntimeMath.hpp
author lfoltan
Thu, 22 May 2014 11:36:23 -0400
changeset 24660 a9b2a80f5afa
child 25919 d4e4f72b49fc
permissions -rw-r--r--
8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013 Summary: Factor out definitions of copysignA and scalbnA into new file sharedRuntimeMath.hpp Reviewed-by: dholmes, coleenp, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24660
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     1
/*
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     2
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     4
 *
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     7
 * published by the Free Software Foundation.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     8
 *
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    13
 * accompanied this code).
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    14
 *
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    18
 *
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    21
 * questions.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    22
 *
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    23
 */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    24
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    25
#ifndef SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    26
#define SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    27
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    28
#include <math.h>
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    29
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    30
// VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    31
// [jk] this is not 100% correct because the float word order may different
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    32
// from the byte order (e.g. on ARM FPA)
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    33
#ifdef VM_LITTLE_ENDIAN
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    34
# define __HI(x) *(1+(int*)&x)
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    35
# define __LO(x) *(int*)&x
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    36
#else
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    37
# define __HI(x) *(int*)&x
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    38
# define __LO(x) *(1+(int*)&x)
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    39
#endif
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    40
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    41
static double copysignA(double x, double y) {
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    42
  __HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000);
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    43
  return x;
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    44
}
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    45
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    46
/*
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    47
 * ====================================================
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    48
 * Copyright (c) 1998 Oracle and/or its affiliates. All rights reserved.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    49
 *
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    50
 * Developed at SunSoft, a Sun Microsystems, Inc. business.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    51
 * Permission to use, copy, modify, and distribute this
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    52
 * software is freely granted, provided that this notice
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    53
 * is preserved.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    54
 * ====================================================
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    55
 */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    56
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    57
/*
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    58
 * scalbn (double x, int n)
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    59
 * scalbn(x,n) returns x* 2**n  computed by  exponent
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    60
 * manipulation rather than by actually performing an
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    61
 * exponentiation or a multiplication.
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    62
 */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    63
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    64
static const double
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    65
two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    66
twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    67
hugeX  = 1.0e+300,
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    68
tiny   = 1.0e-300;
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    69
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    70
static double scalbnA (double x, int n) {
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    71
  int  k,hx,lx;
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    72
  hx = __HI(x);
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    73
  lx = __LO(x);
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    74
  k = (hx&0x7ff00000)>>20;              /* extract exponent */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    75
  if (k==0) {                           /* 0 or subnormal x */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    76
    if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    77
    x *= two54;
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    78
    hx = __HI(x);
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    79
    k = ((hx&0x7ff00000)>>20) - 54;
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    80
    if (n< -50000) return tiny*x;       /*underflow*/
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    81
  }
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    82
  if (k==0x7ff) return x+x;             /* NaN or Inf */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    83
  k = k+n;
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    84
  if (k >  0x7fe) return hugeX*copysignA(hugeX,x); /* overflow  */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    85
  if (k > 0)                            /* normal result */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    86
    {__HI(x) = (hx&0x800fffff)|(k<<20); return x;}
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    87
  if (k <= -54) {
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    88
    if (n > 50000)      /* in case integer overflow in n+k */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    89
      return hugeX*copysignA(hugeX,x);  /*overflow*/
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    90
    else return tiny*copysignA(tiny,x); /*underflow*/
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    91
  }
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    92
  k += 54;                              /* subnormal result */
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    93
  __HI(x) = (hx&0x800fffff)|(k<<20);
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    94
  return x*twom54;
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    95
}
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    96
a9b2a80f5afa 8043301: Duplicate definitions in vm/runtime/sharedRuntimeTrans.cpp versus math.h in VS2013
lfoltan
parents:
diff changeset
    97
#endif // SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP