diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:03:48 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:03:48 -0800 |
commit | 4e468ed2eb86a2406e14f1eca82072ee501d05fd (patch) | |
tree | 4e05b3c66eef86531e464521a3bf96a1864d4bf5 /libm | |
parent | a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349 (diff) | |
download | bionic-4e468ed2eb86a2406e14f1eca82072ee501d05fd.zip bionic-4e468ed2eb86a2406e14f1eca82072ee501d05fd.tar.gz bionic-4e468ed2eb86a2406e14f1eca82072ee501d05fd.tar.bz2 |
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'libm')
-rw-r--r-- | libm/Android.mk | 36 | ||||
-rw-r--r-- | libm/i387/fenv.c | 2 | ||||
-rw-r--r-- | libm/i387/npx.h | 160 | ||||
-rw-r--r-- | libm/src/e_ldexpf.c | 22 | ||||
-rw-r--r-- | libm/src/math_private.h | 1 |
5 files changed, 213 insertions, 8 deletions
diff --git a/libm/Android.mk b/libm/Android.mk index 5f0922d..8f0c3b1 100644 --- a/libm/Android.mk +++ b/libm/Android.mk @@ -2,7 +2,7 @@ LOCAL_PATH:= $(call my-dir) libm_common_src_files:= \ isinf.c \ - fpclassify.c \ + fpclassify.c \ bsdsrc/b_exp.c \ bsdsrc/b_log.c \ bsdsrc/b_tgamma.c \ @@ -54,7 +54,6 @@ libm_common_src_files:= \ src/e_sinhf.c \ src/e_sqrt.c \ src/e_sqrtf.c \ - arm/fenv.c \ src/k_cos.c \ src/k_cosf.c \ src/k_rem_pio2.c \ @@ -128,9 +127,6 @@ libm_common_src_files:= \ src/s_round.c \ src/s_roundf.c \ src/s_roundl.c \ - src/s_scalbln.c \ - src/s_scalbn.c \ - src/s_scalbnf.c \ src/s_signbit.c \ src/s_signgam.c \ src/s_significand.c \ @@ -153,6 +149,32 @@ libm_common_src_files:= \ src/s_isnan.c \ src/s_modf.c + +ifeq ($(TARGET_ARCH),arm) + libm_common_src_files += \ + arm/fenv.c \ + src/e_ldexpf.c \ + src/s_scalbln.c \ + src/s_scalbn.c \ + src/s_scalbnf.c + + libm_common_includes = $(LOCAL_PATH)/arm + +else + ifeq ($(TARGET_OS)-$(TARGET_ARCH),linux-x86) + libm_common_src_files += \ + i387/fenv.c \ + i387/s_scalbnl.S \ + i387/s_scalbn.S \ + i387/s_scalbnf.S + + libm_common_includes = $(LOCAL_PATH)/i386 $(LOCAL_PATH)/i387 + else + $(error "Unknown architecture") + endif +endif + + # libm.a # ======================================================== @@ -162,7 +184,7 @@ LOCAL_SRC_FILES := \ $(libm_common_src_files) LOCAL_ARM_MODE := arm -LOCAL_C_INCLUDES += $(LOCAL_PATH)/arm +LOCAL_C_INCLUDES += $(libm_common_includes) LOCAL_MODULE:= libm @@ -180,7 +202,7 @@ LOCAL_SRC_FILES := \ LOCAL_ARM_MODE := arm -LOCAL_C_INCLUDES += $(LOCAL_PATH)/arm +LOCAL_C_INCLUDES += $(libm_common_includes) LOCAL_MODULE:= libm diff --git a/libm/i387/fenv.c b/libm/i387/fenv.c index 830e38f..2794faf 100644 --- a/libm/i387/fenv.c +++ b/libm/i387/fenv.c @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #include <sys/types.h> -#include <machine/npx.h> +#include "npx.h" #include "fenv.h" const fenv_t __fe_dfl_env = { diff --git a/libm/i387/npx.h b/libm/i387/npx.h new file mode 100644 index 0000000..38c2add --- /dev/null +++ b/libm/i387/npx.h @@ -0,0 +1,160 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * 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. + * 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. + * + * from: @(#)npx.h 5.3 (Berkeley) 1/18/91 + * $FreeBSD: src/sys/i386/include/npx.h,v 1.29.2.1 2006/07/01 00:57:55 davidxu Exp $ + */ + +/* + * 287/387 NPX Coprocessor Data Structures and Constants + * W. Jolitz 1/90 + */ + +#ifndef _MACHINE_NPX_H_ +#define _MACHINE_NPX_H_ + +/* Environment information of floating point unit */ +struct env87 { + long en_cw; /* control word (16bits) */ + long en_sw; /* status word (16bits) */ + long en_tw; /* tag word (16bits) */ + long en_fip; /* floating point instruction pointer */ + u_short en_fcs; /* floating code segment selector */ + u_short en_opcode; /* opcode last executed (11 bits ) */ + long en_foo; /* floating operand offset */ + long en_fos; /* floating operand segment selector */ +}; + +/* Contents of each floating point accumulator */ +struct fpacc87 { +#ifdef dontdef /* too unportable */ + u_long fp_mantlo; /* mantissa low (31:0) */ + u_long fp_manthi; /* mantissa high (63:32) */ + int fp_exp:15; /* exponent */ + int fp_sgn:1; /* mantissa sign */ +#else + u_char fp_bytes[10]; +#endif +}; + +/* Floating point context */ +struct save87 { + struct env87 sv_env; /* floating point control/status */ + struct fpacc87 sv_ac[8]; /* accumulator contents, 0-7 */ + u_char sv_pad0[4]; /* padding for (now unused) saved status word */ + /* + * Bogus padding for emulators. Emulators should use their own + * struct and arrange to store into this struct (ending here) + * before it is inspected for ptracing or for core dumps. Some + * emulators overwrite the whole struct. We have no good way of + * knowing how much padding to leave. Leave just enough for the + * GPL emulator's i387_union (176 bytes total). + */ + u_char sv_pad[64]; /* padding; used by emulators */ +}; + +struct envxmm { + u_int16_t en_cw; /* control word (16bits) */ + u_int16_t en_sw; /* status word (16bits) */ + u_int16_t en_tw; /* tag word (16bits) */ + u_int16_t en_opcode; /* opcode last executed (11 bits ) */ + u_int32_t en_fip; /* floating point instruction pointer */ + u_int16_t en_fcs; /* floating code segment selector */ + u_int16_t en_pad0; /* padding */ + u_int32_t en_foo; /* floating operand offset */ + u_int16_t en_fos; /* floating operand segment selector */ + u_int16_t en_pad1; /* padding */ + u_int32_t en_mxcsr; /* SSE sontorol/status register */ + u_int32_t en_mxcsr_mask; /* valid bits in mxcsr */ +}; + +/* Contents of each SSE extended accumulator */ +struct xmmacc { + u_char xmm_bytes[16]; +}; + +struct savexmm { + struct envxmm sv_env; + struct { + struct fpacc87 fp_acc; + u_char fp_pad[6]; /* padding */ + } sv_fp[8]; + struct xmmacc sv_xmm[8]; + u_char sv_pad[224]; +} __aligned(16); + +union savefpu { + struct save87 sv_87; + struct savexmm sv_xmm; +}; + +/* + * The hardware default control word for i387's and later coprocessors is + * 0x37F, giving: + * + * round to nearest + * 64-bit precision + * all exceptions masked. + * + * We modify the affine mode bit and precision bits in this to give: + * + * affine mode for 287's (if they work at all) (1 in bitfield 1<<12) + * 53-bit precision (2 in bitfield 3<<8) + * + * 64-bit precision often gives bad results with high level languages + * because it makes the results of calculations depend on whether + * intermediate values are stored in memory or in FPU registers. + */ +#define __INITIAL_NPXCW__ 0x127F +#define __INITIAL_MXCSR__ 0x1F80 + +#ifdef _KERNEL + +#define IO_NPX 0x0F0 /* Numeric Coprocessor */ +#define IO_NPXSIZE 16 /* 80387/80487 NPX registers */ + +#define IRQ_NPX 13 + +/* full reset on some systems, NOP on others */ +#define npx_full_reset() outb(IO_NPX + 1, 0) + +int npxdna(void); +void npxdrop(void); +void npxexit(struct thread *td); +int npxformat(void); +int npxgetregs(struct thread *td, union savefpu *addr); +void npxinit(u_short control); +void npxsave(union savefpu *addr); +void npxsetregs(struct thread *td, union savefpu *addr); +int npxtrap(void); +#endif + +#endif /* !_MACHINE_NPX_H_ */ diff --git a/libm/src/e_ldexpf.c b/libm/src/e_ldexpf.c new file mode 100644 index 0000000..86297fc --- /dev/null +++ b/libm/src/e_ldexpf.c @@ -0,0 +1,22 @@ +/* e_scalbf.c -- float version of e_scalb.c. + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + */ + +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include "math.h" +#include "math_private.h" + +float +__ieee754_ldexpf(float x, int fn) +{ + return __ieee754_scalbf(x,fn); +} diff --git a/libm/src/math_private.h b/libm/src/math_private.h index 13bcd3a..5f6e088 100644 --- a/libm/src/math_private.h +++ b/libm/src/math_private.h @@ -254,6 +254,7 @@ cpackl(long double x, long double y) #define __ieee754_ynf ynf #define __ieee754_remainderf remainderf #define __ieee754_scalbf scalbf +#define __ieee754_ldexpf ldexpf /* fdlibm kernel function */ int __ieee754_rem_pio2(double,double*); |