Path: blob/master/src/hotspot/os_cpu/linux_x86/fpu_control.h
40951 views
/* FPU control word bits. x86 version.1Copyright (C) 1993-2012 Free Software Foundation, Inc.2This file is part of the GNU C Library.3Contributed by Olaf Flebbe.45The GNU C Library is free software; you can redistribute it and/or6modify it under the terms of the GNU Lesser General Public7License as published by the Free Software Foundation; either8version 2.1 of the License, or (at your option) any later version.910The GNU C Library is distributed in the hope that it will be useful,11but WITHOUT ANY WARRANTY; without even the implied warranty of12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU13Lesser General Public License for more details.1415You should have received a copy of the GNU Lesser General Public16License along with the GNU C Library; if not, see17<http://www.gnu.org/licenses/>. */1819#ifndef _FPU_CONTROL_H20#define _FPU_CONTROL_H 12122/* Note that this file sets on x86-64 only the x87 FPU, it does not23touch the SSE unit. */2425/* Here is the dirty part. Set up your 387 through the control word26* (cw) register.27*28* 15-13 12 11-10 9-8 7-6 5 4 3 2 1 029* | reserved | IC | RC | PC | reserved | PM | UM | OM | ZM | DM | IM30*31* IM: Invalid operation mask32* DM: Denormalized operand mask33* ZM: Zero-divide mask34* OM: Overflow mask35* UM: Underflow mask36* PM: Precision (inexact result) mask37*38* Mask bit is 1 means no interrupt.39*40* PC: Precision control41* 11 - round to extended precision42* 10 - round to double precision43* 00 - round to single precision44*45* RC: Rounding control46* 00 - rounding to nearest47* 01 - rounding down (toward - infinity)48* 10 - rounding up (toward + infinity)49* 11 - rounding toward zero50*51* IC: Infinity control52* That is for 8087 and 80287 only.53*54* The hardware default is 0x037f which we use.55*/5657#include <features.h>5859/* masking of interrupts */60#define _FPU_MASK_IM 0x0161#define _FPU_MASK_DM 0x0262#define _FPU_MASK_ZM 0x0463#define _FPU_MASK_OM 0x0864#define _FPU_MASK_UM 0x1065#define _FPU_MASK_PM 0x206667/* precision control */68#define _FPU_EXTENDED 0x300 /* libm requires double extended precision. */69#define _FPU_DOUBLE 0x20070#define _FPU_SINGLE 0x07172/* rounding control */73#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */74#define _FPU_RC_DOWN 0x40075#define _FPU_RC_UP 0x80076#define _FPU_RC_ZERO 0xC007778#define _FPU_RESERVED 0xF0C0 /* Reserved bits in cw */798081/* The fdlibm code requires strict IEEE double precision arithmetic,82and no interrupts for exceptions, rounding to nearest. */8384#define _FPU_DEFAULT 0x037f8586/* IEEE: same as above. */87#define _FPU_IEEE 0x037f8889/* Type of the control word. */90typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));9192/* Macros for accessing the hardware control word. "*&" is used to93work around a bug in older versions of GCC. __volatile__ is used94to support combination of writing the control register and reading95it back. Without __volatile__, the old value may be used for reading96back under compiler optimization.9798Note that the use of these macros is not sufficient anymore with99recent hardware nor on x86-64. Some floating point operations are100executed in the SSE/SSE2 engines which have their own control and101status register. */102#define _FPU_GETCW(cw) __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw))103#define _FPU_SETCW(cw) __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw))104105/* Default control word set at startup. */106extern fpu_control_t __fpu_control;107108#endif /* fpu_control.h */109110111