 913602e3ff
			
		
	
	
		913602e3ff
		
	
	
	
	
		
			
			Pass float_status structure pointer to the pickNaN so that machine-specific settings are available to NaN selection code. Add use_first_nan property to float_status and use it in Xtensa-specific pickNaN. Cc: Peter Maydell <peter.maydell@linaro.org> Cc: "Alex Bennée" <alex.bennee@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
		
			
				
	
	
		
			179 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			179 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
 | |
| 
 | |
| /*
 | |
|  * 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.
 | |
|  */
 | |
| 
 | |
| #define float_tininess_after_rounding  false
 | |
| #define float_tininess_before_rounding true
 | |
| 
 | |
| /*
 | |
|  *Software IEC/IEEE floating-point rounding mode.
 | |
|  */
 | |
| 
 | |
| typedef enum __attribute__((__packed__)) {
 | |
|     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,
 | |
| } FloatRoundMode;
 | |
| 
 | |
| /*
 | |
|  * 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 {
 | |
|     FloatRoundMode float_rounding_mode;
 | |
|     uint8_t     float_exception_flags;
 | |
|     signed char floatx80_rounding_precision;
 | |
|     bool tininess_before_rounding;
 | |
|     /* should denormalised results go to zero and set the inexact flag? */
 | |
|     bool flush_to_zero;
 | |
|     /* should denormalised inputs go to zero and set the input_denormal flag? */
 | |
|     bool flush_inputs_to_zero;
 | |
|     bool default_nan_mode;
 | |
|     /*
 | |
|      * The flags below are not used on all specializations and may
 | |
|      * constant fold away (see snan_bit_is_one()/no_signalling_nans() in
 | |
|      * softfloat-specialize.inc.c)
 | |
|      */
 | |
|     bool snan_bit_is_one;
 | |
|     bool use_first_nan;
 | |
|     bool no_signaling_nans;
 | |
| } float_status;
 | |
| 
 | |
| #endif /* SOFTFLOAT_TYPES_H */
 |