180 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * QEMU float support
 | 
						|
 *
 | 
						|
 * The code in this source file is derived from release 2a of the SoftFloat
 | 
						|
 * IEC/IEEE Floating-point Arithmetic Package. Those parts of the code (and
 | 
						|
 * some later contributions) are provided under that license, as detailed below.
 | 
						|
 * It has subsequently been modified by contributors to the QEMU Project,
 | 
						|
 * so some portions are provided under:
 | 
						|
 *  the SoftFloat-2a license
 | 
						|
 *  the BSD license
 | 
						|
 *  GPL-v2-or-later
 | 
						|
 *
 | 
						|
 * This header holds definitions for code that might be dealing with
 | 
						|
 * softfloat types but not need access to the actual library functions.
 | 
						|
 */
 | 
						|
/*
 | 
						|
===============================================================================
 | 
						|
This C header file is part of the SoftFloat IEC/IEEE Floating-point
 | 
						|
Arithmetic Package, Release 2a.
 | 
						|
 | 
						|
Written by John R. Hauser.  This work was made possible in part by the
 | 
						|
International Computer Science Institute, located at Suite 600, 1947 Center
 | 
						|
Street, Berkeley, California 94704.  Funding was partially provided by the
 | 
						|
National Science Foundation under grant MIP-9311980.  The original version
 | 
						|
of this code was written as part of a project to build a fixed-point vector
 | 
						|
processor in collaboration with the University of California at Berkeley,
 | 
						|
overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
 | 
						|
is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
 | 
						|
arithmetic/SoftFloat.html'.
 | 
						|
 | 
						|
THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
 | 
						|
has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
 | 
						|
TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
 | 
						|
PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
 | 
						|
AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
 | 
						|
 | 
						|
Derivative works are acceptable, even for commercial purposes, so long as
 | 
						|
(1) they include prominent notice that the work is derivative, and (2) they
 | 
						|
include prominent notice akin to these four paragraphs for those parts of
 | 
						|
this code that are retained.
 | 
						|
 | 
						|
===============================================================================
 | 
						|
*/
 | 
						|
 | 
						|
/* BSD licensing:
 | 
						|
 * Copyright (c) 2006, Fabrice Bellard
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * 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.
 | 
						|
 *
 | 
						|
 * 3. Neither the name of the copyright holder 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
 | 
						|
 */
 | 
						|
 | 
						|
/* Portions of this work are licensed under the terms of the GNU GPL,
 | 
						|
 * version 2 or later. See the COPYING file in the top-level directory.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef SOFTFLOAT_TYPES_H
 | 
						|
#define SOFTFLOAT_TYPES_H
 | 
						|
 | 
						|
/* This 'flag' type must be able to hold at least 0 and 1. It should
 | 
						|
 * probably be replaced with 'bool' but the uses would need to be audited
 | 
						|
 * to check that they weren't accidentally relying on it being a larger type.
 | 
						|
 */
 | 
						|
typedef uint8_t flag;
 | 
						|
 | 
						|
/*
 | 
						|
 * Software IEC/IEEE floating-point types.
 | 
						|
 */
 | 
						|
 | 
						|
typedef uint16_t float16;
 | 
						|
typedef uint32_t float32;
 | 
						|
typedef uint64_t float64;
 | 
						|
#define float16_val(x) (x)
 | 
						|
#define float32_val(x) (x)
 | 
						|
#define float64_val(x) (x)
 | 
						|
#define make_float16(x) (x)
 | 
						|
#define make_float32(x) (x)
 | 
						|
#define make_float64(x) (x)
 | 
						|
#define const_float16(x) (x)
 | 
						|
#define const_float32(x) (x)
 | 
						|
#define const_float64(x) (x)
 | 
						|
typedef struct {
 | 
						|
    uint64_t low;
 | 
						|
    uint16_t high;
 | 
						|
} floatx80;
 | 
						|
#define make_floatx80(exp, mant) ((floatx80) { mant, exp })
 | 
						|
#define make_floatx80_init(exp, mant) { .low = mant, .high = exp }
 | 
						|
typedef struct {
 | 
						|
#ifdef HOST_WORDS_BIGENDIAN
 | 
						|
    uint64_t high, low;
 | 
						|
#else
 | 
						|
    uint64_t low, high;
 | 
						|
#endif
 | 
						|
} float128;
 | 
						|
#define make_float128(high_, low_) ((float128) { .high = high_, .low = low_ })
 | 
						|
#define make_float128_init(high_, low_) { .high = high_, .low = low_ }
 | 
						|
 | 
						|
/*
 | 
						|
 * Software IEC/IEEE floating-point underflow tininess-detection mode.
 | 
						|
 */
 | 
						|
 | 
						|
enum {
 | 
						|
    float_tininess_after_rounding  = 0,
 | 
						|
    float_tininess_before_rounding = 1
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 *Software IEC/IEEE floating-point rounding mode.
 | 
						|
 */
 | 
						|
 | 
						|
enum {
 | 
						|
    float_round_nearest_even = 0,
 | 
						|
    float_round_down         = 1,
 | 
						|
    float_round_up           = 2,
 | 
						|
    float_round_to_zero      = 3,
 | 
						|
    float_round_ties_away    = 4,
 | 
						|
    /* Not an IEEE rounding mode: round to the closest odd mantissa value */
 | 
						|
    float_round_to_odd       = 5,
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Software IEC/IEEE floating-point exception flags.
 | 
						|
 */
 | 
						|
 | 
						|
enum {
 | 
						|
    float_flag_invalid   =  1,
 | 
						|
    float_flag_divbyzero =  4,
 | 
						|
    float_flag_overflow  =  8,
 | 
						|
    float_flag_underflow = 16,
 | 
						|
    float_flag_inexact   = 32,
 | 
						|
    float_flag_input_denormal = 64,
 | 
						|
    float_flag_output_denormal = 128
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * Floating Point Status. Individual architectures may maintain
 | 
						|
 * several versions of float_status for different functions. The
 | 
						|
 * correct status for the operation is then passed by reference to
 | 
						|
 * most of the softfloat functions.
 | 
						|
 */
 | 
						|
 | 
						|
typedef struct float_status {
 | 
						|
    signed char float_detect_tininess;
 | 
						|
    signed char float_rounding_mode;
 | 
						|
    uint8_t     float_exception_flags;
 | 
						|
    signed char floatx80_rounding_precision;
 | 
						|
    /* should denormalised results go to zero and set the inexact flag? */
 | 
						|
    flag flush_to_zero;
 | 
						|
    /* should denormalised inputs go to zero and set the input_denormal flag? */
 | 
						|
    flag flush_inputs_to_zero;
 | 
						|
    flag default_nan_mode;
 | 
						|
    flag snan_bit_is_one;
 | 
						|
} float_status;
 | 
						|
 | 
						|
#endif /* SOFTFLOAT_TYPES_H */
 |