1 /* FPU control word bits. x86-64 version. 2 Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 Contributed by Olaf Flebbe. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, write to the Free 18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19 02111-1307 USA. */ 20 21 #ifndef _FPU_CONTROL_H 22 #define _FPU_CONTROL_H 1 23 24 /* Note that this file sets on x86-64 only the x87 FPU, it does not 25 touch the SSE unit. */ 26 27 /* Here is the dirty part. Set up your 387 through the control word 28 * (cw) register. 29 * 30 * 15-13 12 11-10 9-8 7-6 5 4 3 2 1 0 31 * | reserved | IC | RC | PC | reserved | PM | UM | OM | ZM | DM | IM 32 * 33 * IM: Invalid operation mask 34 * DM: Denormalized operand mask 35 * ZM: Zero-divide mask 36 * OM: Overflow mask 37 * UM: Underflow mask 38 * PM: Precision (inexact result) mask 39 * 40 * Mask bit is 1 means no interrupt. 41 * 42 * PC: Precision control 43 * 11 - round to extended precision 44 * 10 - round to double precision 45 * 00 - round to single precision 46 * 47 * RC: Rounding control 48 * 00 - rounding to nearest 49 * 01 - rounding down (toward - infinity) 50 * 10 - rounding up (toward + infinity) 51 * 11 - rounding toward zero 52 * 53 * IC: Infinity control 54 * That is for 8087 and 80287 only. 55 * 56 * The hardware default is 0x037f which we use. 57 */ 58 59 #include <features.h> 60 61 /* masking of interrupts */ 62 #define _FPU_MASK_IM 0x01 63 #define _FPU_MASK_DM 0x02 64 #define _FPU_MASK_ZM 0x04 65 #define _FPU_MASK_OM 0x08 66 #define _FPU_MASK_UM 0x10 67 #define _FPU_MASK_PM 0x20 68 69 /* precision control */ 70 #define _FPU_EXTENDED 0x300 /* libm requires double extended precision. */ 71 #define _FPU_DOUBLE 0x200 72 #define _FPU_SINGLE 0x0 73 74 /* rounding control */ 75 #define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ 76 #define _FPU_RC_DOWN 0x400 77 #define _FPU_RC_UP 0x800 78 #define _FPU_RC_ZERO 0xC00 79 80 #define _FPU_RESERVED 0xF0C0 /* Reserved bits in cw */ 81 82 83 /* The fdlibm code requires strict IEEE double precision arithmetic, 84 and no interrupts for exceptions, rounding to nearest. */ 85 86 #define _FPU_DEFAULT 0x037f 87 88 /* IEEE: same as above. */ 89 #define _FPU_IEEE 0x037f 90 91 /* Type of the control word. */ 92 typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__))); 93 94 /* Macros for accessing the hardware control word. */ 95 #define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) 96 #define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) 97 98 /* Default control word set at startup. */ 99 extern fpu_control_t __fpu_control; 100 101 #endif /* fpu_control.h */ 102