⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpu_i386.h

📁 A Library of Efficient Data Types and Algorithms,封装了常用的ADT及其相关算法的软件包
💻 H
字号:
/*******************************************************************************++  LEDA 4.5  +++  fpu_i386.h+++  Copyright (c) 1995-2004+  by Algorithmic Solutions Software GmbH+  All rights reserved.+ *******************************************************************************/// $Revision: 1.3 $  $Date: 2004/02/06 11:19:38 $/*  *---------------------------------------------------- * I386 architecture layout  * --------------------------------------------------- *//* * Source: Intel Architecture Software Developer's Manual * Volume I: Basic Architecture. * I don't know other books on I386 that are of any value for our  * purposes. * The i386 platforms are mostly IEEE conform, with the extension * that rounding can be set to extended precision (i.e., 64 bit * mantissa). Trap handlers cannot see the sticky exception bits * and cannot return. Underflow cannot be trapped.  * There are separate registers for status and control word * (of 16 bit length each!) and the traps bits are disable * bits (traps is _enabled_ when the corresponding bit is zero!) * The status word can only be read by F(N)STSW but cannot be  * directly set; the command F(N)LDSW is not available. *//* The layout for the control word:  * *     15-13    12  11-10  9-8     7-6     5    4    3    2    1    0 * | reserved | IC | RC  | PC | reserved | PM | UM | OM | ZM | DM | IM *  * Caution: Interrupts are _disabled_ when mask bit is 1! * * IC: Infinity control * That is for compatibility with 8087 and 80287.  * Ignore for 80386 and higher. * * PC: Precision control * 11 - round to extended precision * 10 - round to double precision * 00 - round to single precision * * RC: Rounding control * 00 - rounding to nearest * 01 - rounding down (toward - infinity) * 10 - rounding up   (toward + infinity) * 11 - rounding toward zero * * IM: Invalid operation mask * DM: Denormalized operand mask * ZM: Zero-divide mask * OM: Overflow mask * UM: Underflow mask * PM: Precision (inexact result) mask * * The hardware default is 0x037f.  *//* The layout for the status word:  * *    15    14   13-11   10-8     7      6    5    4    3    2    1    0 * | Busy | C3 |  TOP  | C2-C0 |Summary| SF | PF | UF | OF | ZF | DF | IF * * Busy   : FPU busy flag * C3-C0  : Condition codes;            see Intel Architecture Software Developer's Manual * TOP    : pointer to top of FPU register stack  * Summary: Exception summary, set if on of the bits 5-0 is set * SF     : Stack fault (overflow or underflow) * PF-IF  : Sticky exception flags for the exception masks EM-IM * * Note that the status word can only be directly stored into memory, * not loaded. * */#ifndef I386_FPU_H#define I386_FPU_H#ifndef i386#error this file should only be included on machines of the i386 family#endifLEDA_BEGIN_NAMESPACEtypedef unsigned short fcr_type;/* 16 bit */#if defined(__GNUC__) || defined(_MSC_VER) || defined(__BORLANDC__)#define IEEE_INLINE_ASSEMBLER#endif#ifdef __GNUC__#define IEEE_GET_FCR(CW) asm volatile ("fnstcw %0" : "=m" (CW) :)/* fnstcw seems to be the better choice than fstcw */#define IEEE_SET_FCR(CW) asm volatile ("fldcw %0" : : "m" (CW))#define IEEE_GET_FSR(CW) asm volatile ("fnstsw %0" : "=m" (CW) :)/* fnstsw seems to be the better choice than fstsw */#define I386_CLEAR_EXCEPTIONS() asm volatile ("fclex")#elif defined(_MSC_VER) || defined(__BORLANDC__)#define IEEE_GET_FCR(CW) _asm { FSTCW CW }#define IEEE_SET_FCR(CW) _asm { FLDCW CW }#define IEEE_GET_FSR(CW) _asm { FSTSW CW }#define I386_CLEAR_EXCEPTIONS() _asm { FCLEX }#endif /* __GNUC__ */#define IEEE_SEPARATE_SW#define IEEE_INVERSE_TRAPPINGstruct ieee_exception_set {    fcr_type invalid;    fcr_type overflow;    fcr_type underflow;    fcr_type divbyzero;    fcr_type inexact; };static const fcr_type ieee_round_mask = (3UL <<10);static const fcr_type ieee_nearest  = (0UL<<10);static const fcr_type ieee_tozero   = (3UL<<10);static const fcr_type ieee_positive = (2UL<<10);static const fcr_type ieee_negative = (1UL<<10);static const fcr_type ieee_all_exceptions        = (63UL-2UL );static const fcr_type ieee_exception_mask        = (63UL     );static const fcr_type ieee_nontrivial_exceptions = 1UL+(7UL<<2);static const struct ieee_exception_set ieee_exception_bit ={  (1UL<<0), /* invalid operation*/  (1UL<<3), /* overflow */  (1UL<<4), /* underflow */  (1UL<<2), /* divbyzero */  (1UL<<5)  /* inexact */};#define IEEE_TRAP_MASK (63UL<<0)static const fcr_type ieee_all_traps = IEEE_TRAP_MASK - 2UL;static const fcr_type ieee_trap_mask = IEEE_TRAP_MASK;static const struct ieee_exception_set ieee_trap_bit ={  (1UL<<0), /* invalid operation*/  (1UL<<3), /* overflow */  (1UL<<4), /* underflow */  (1UL<<2), /* divbyzero */  (1UL<<5)  /* inexact */};#define IEEE_PRECISION_MASK     (3U<<8)#define IEEE_DOUBLE_PRECISION   (2U<<8)static const fcr_type ieee_default_mask   = IEEE_DOUBLE_PRECISION + IEEE_TRAP_MASK;/* trap bits are set to avoid trapping */#define LOW_WORD_FIRSTLEDA_END_NAMESPACE#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -