First draft of RC for Release 3, to start review process.
This commit is contained in:
commit
8f59d92535
|
@ -0,0 +1,34 @@
|
|||
|
||||
License for Berkeley SoftFloat Release 3
|
||||
|
||||
John R. Hauser
|
||||
2014 ________
|
||||
|
||||
The following applies to the whole of SoftFloat Release 3 as well as to each
|
||||
source file individually.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and
|
||||
binary forms, with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in
|
||||
the documentation and/or other materials provided with the distribution.
|
||||
Neither the name of the Regents nor the names of its contributors may be
|
||||
used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
|
||||
REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
|
||||
<HTML>
|
||||
|
||||
<HEAD>
|
||||
<TITLE>Berkeley SoftFloat Package Overview</TITLE>
|
||||
</HEAD>
|
||||
|
||||
<BODY>
|
||||
|
||||
<H1>Package Overview for Berkeley SoftFloat Release 3</H1>
|
||||
|
||||
<P>
|
||||
John R. Hauser<BR>
|
||||
2014 ________<BR>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
Berkeley SoftFloat is a software implementation of binary floating-point that
|
||||
conforms to the IEEE Standard for Floating-Point Arithmetic.
|
||||
SoftFloat is distributed in the form of C source code.
|
||||
Building the SoftFloat sources generates a library file (typically
|
||||
<CODE>"softfloat.a"</CODE>) containing the floating-point subroutines.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The SoftFloat package is documented in the following files in the
|
||||
<CODE>doc</CODE> subdirectory:
|
||||
<BLOCKQUOTE>
|
||||
<TABLE>
|
||||
<TR>
|
||||
<TD><A HREF="doc/SoftFloat.html"><CODE>SoftFloat.html</CODE></A></TD>
|
||||
<TD>Documentation for using the SoftFloat functions.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD><A HREF="doc/SoftFloat-source.html"><CODE>SoftFloat-source.html</CODE></A></TD>
|
||||
<TD>Documentation for building SoftFloat.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD><A HREF="doc/SoftFloat-history.html"><CODE>SoftFloat-history.html</CODE></A><CODE> </CODE></TD>
|
||||
<TD>History of the major changes to SoftFloat.</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</BLOCKQUOTE>
|
||||
Other files in the package comprise the source code for SoftFloat.
|
||||
</P>
|
||||
|
||||
</BODY>
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
|
||||
Package Overview for Berkeley SoftFloat Release 3
|
||||
|
||||
John R. Hauser
|
||||
2014 ________
|
||||
|
||||
Berkeley SoftFloat is a software implementation of binary floating-point
|
||||
that conforms to the IEEE Standard for Floating-Point Arithmetic. SoftFloat
|
||||
is distributed in the form of C source code. Building the SoftFloat sources
|
||||
generates a library file (typically "softfloat.a") containing the floating-
|
||||
point subroutines.
|
||||
|
||||
The SoftFloat package is documented in the following files in the "doc"
|
||||
subdirectory:
|
||||
|
||||
SoftFloat.html Documentation for using the SoftFloat functions.
|
||||
SoftFloat-source.html Documentation for building SoftFloat.
|
||||
SoftFloat-history.html History of the major changes to SoftFloat.
|
||||
|
||||
Other files in the package comprise the source code for SoftFloat.
|
||||
|
|
@ -0,0 +1,300 @@
|
|||
|
||||
SOURCE_DIR = ../../source
|
||||
SPECIALIZE_TYPE = 8086
|
||||
|
||||
SOFTFLOAT_OPTS = -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV64TO32
|
||||
|
||||
DELETE = rm -f
|
||||
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
|
||||
COMPILE_C = \
|
||||
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
|
||||
$(C_INCLUDES) -O2 -o $@
|
||||
MAKELIB = ar crs $@
|
||||
|
||||
OBJ = .o
|
||||
LIB = .a
|
||||
|
||||
.PHONY: all
|
||||
all: softfloat$(LIB)
|
||||
|
||||
OBJS_PRIMITIVES = \
|
||||
s_eq128$(OBJ) \
|
||||
s_le128$(OBJ) \
|
||||
s_lt128$(OBJ) \
|
||||
s_shortShiftLeft128$(OBJ) \
|
||||
s_shortShiftRight128$(OBJ) \
|
||||
s_shortShiftRightJam64$(OBJ) \
|
||||
s_shortShiftRightJam64Extra$(OBJ) \
|
||||
s_shortShiftRightJam128$(OBJ) \
|
||||
s_shortShiftRightJam128Extra$(OBJ) \
|
||||
s_shiftRightJam32$(OBJ) \
|
||||
s_shiftRightJam64$(OBJ) \
|
||||
s_shiftRightJam64Extra$(OBJ) \
|
||||
s_shiftRightJam128$(OBJ) \
|
||||
s_shiftRightJam128Extra$(OBJ) \
|
||||
s_shiftRightJam256M$(OBJ) \
|
||||
s_countLeadingZeros8$(OBJ) \
|
||||
s_countLeadingZeros32$(OBJ) \
|
||||
s_countLeadingZeros64$(OBJ) \
|
||||
s_add128$(OBJ) \
|
||||
s_add256M$(OBJ) \
|
||||
s_sub128$(OBJ) \
|
||||
s_sub256M$(OBJ) \
|
||||
s_mul64ByShifted32To128$(OBJ) \
|
||||
s_mul64To128$(OBJ) \
|
||||
s_mul128By32$(OBJ) \
|
||||
s_mul128To256M$(OBJ) \
|
||||
s_approxRecip32_1$(OBJ) \
|
||||
s_approxRecipSqrt32_1$(OBJ) \
|
||||
|
||||
OBJS_SPECIALIZE = \
|
||||
softfloat_raiseFlags$(OBJ) \
|
||||
s_f32UIToCommonNaN$(OBJ) \
|
||||
s_commonNaNToF32UI$(OBJ) \
|
||||
s_propagateNaNF32UI$(OBJ) \
|
||||
s_f64UIToCommonNaN$(OBJ) \
|
||||
s_commonNaNToF64UI$(OBJ) \
|
||||
s_propagateNaNF64UI$(OBJ) \
|
||||
extF80M_isSignalingNaN$(OBJ) \
|
||||
s_extF80UIToCommonNaN$(OBJ) \
|
||||
s_commonNaNToExtF80UI$(OBJ) \
|
||||
s_propagateNaNExtF80UI$(OBJ) \
|
||||
f128M_isSignalingNaN$(OBJ) \
|
||||
s_f128UIToCommonNaN$(OBJ) \
|
||||
s_commonNaNToF128UI$(OBJ) \
|
||||
s_propagateNaNF128UI$(OBJ) \
|
||||
|
||||
OBJS_OTHERS = \
|
||||
s_roundPackToUI32$(OBJ) \
|
||||
s_roundPackToUI64$(OBJ) \
|
||||
s_roundPackToI32$(OBJ) \
|
||||
s_roundPackToI64$(OBJ) \
|
||||
s_normSubnormalF32Sig$(OBJ) \
|
||||
s_roundPackToF32$(OBJ) \
|
||||
s_normRoundPackToF32$(OBJ) \
|
||||
s_addMagsF32$(OBJ) \
|
||||
s_subMagsF32$(OBJ) \
|
||||
s_mulAddF32$(OBJ) \
|
||||
s_normSubnormalF64Sig$(OBJ) \
|
||||
s_roundPackToF64$(OBJ) \
|
||||
s_normRoundPackToF64$(OBJ) \
|
||||
s_addMagsF64$(OBJ) \
|
||||
s_subMagsF64$(OBJ) \
|
||||
s_mulAddF64$(OBJ) \
|
||||
s_normSubnormalExtF80Sig$(OBJ) \
|
||||
s_roundPackToExtF80$(OBJ) \
|
||||
s_normRoundPackToExtF80$(OBJ) \
|
||||
s_addMagsExtF80$(OBJ) \
|
||||
s_subMagsExtF80$(OBJ) \
|
||||
s_normSubnormalF128Sig$(OBJ) \
|
||||
s_roundPackToF128$(OBJ) \
|
||||
s_normRoundPackToF128$(OBJ) \
|
||||
s_addMagsF128$(OBJ) \
|
||||
s_subMagsF128$(OBJ) \
|
||||
s_mulAddF128$(OBJ) \
|
||||
softfloat_state$(OBJ) \
|
||||
ui32_to_f32$(OBJ) \
|
||||
ui32_to_f64$(OBJ) \
|
||||
ui32_to_extF80$(OBJ) \
|
||||
ui32_to_extF80M$(OBJ) \
|
||||
ui32_to_f128$(OBJ) \
|
||||
ui32_to_f128M$(OBJ) \
|
||||
ui64_to_f32$(OBJ) \
|
||||
ui64_to_f64$(OBJ) \
|
||||
ui64_to_extF80$(OBJ) \
|
||||
ui64_to_extF80M$(OBJ) \
|
||||
ui64_to_f128$(OBJ) \
|
||||
ui64_to_f128M$(OBJ) \
|
||||
i32_to_f32$(OBJ) \
|
||||
i32_to_f64$(OBJ) \
|
||||
i32_to_extF80$(OBJ) \
|
||||
i32_to_extF80M$(OBJ) \
|
||||
i32_to_f128$(OBJ) \
|
||||
i32_to_f128M$(OBJ) \
|
||||
i64_to_f32$(OBJ) \
|
||||
i64_to_f64$(OBJ) \
|
||||
i64_to_extF80$(OBJ) \
|
||||
i64_to_extF80M$(OBJ) \
|
||||
i64_to_f128$(OBJ) \
|
||||
i64_to_f128M$(OBJ) \
|
||||
f32_to_ui32$(OBJ) \
|
||||
f32_to_ui64$(OBJ) \
|
||||
f32_to_i32$(OBJ) \
|
||||
f32_to_i64$(OBJ) \
|
||||
f32_to_ui32_r_minMag$(OBJ) \
|
||||
f32_to_ui64_r_minMag$(OBJ) \
|
||||
f32_to_i32_r_minMag$(OBJ) \
|
||||
f32_to_i64_r_minMag$(OBJ) \
|
||||
f32_to_f64$(OBJ) \
|
||||
f32_to_extF80$(OBJ) \
|
||||
f32_to_extF80M$(OBJ) \
|
||||
f32_to_f128$(OBJ) \
|
||||
f32_to_f128M$(OBJ) \
|
||||
f32_roundToInt$(OBJ) \
|
||||
f32_add$(OBJ) \
|
||||
f32_sub$(OBJ) \
|
||||
f32_mul$(OBJ) \
|
||||
f32_mulAdd$(OBJ) \
|
||||
f32_div$(OBJ) \
|
||||
f32_rem$(OBJ) \
|
||||
f32_sqrt$(OBJ) \
|
||||
f32_eq$(OBJ) \
|
||||
f32_le$(OBJ) \
|
||||
f32_lt$(OBJ) \
|
||||
f32_eq_signaling$(OBJ) \
|
||||
f32_le_quiet$(OBJ) \
|
||||
f32_lt_quiet$(OBJ) \
|
||||
f32_isSignalingNaN$(OBJ) \
|
||||
f64_to_ui32$(OBJ) \
|
||||
f64_to_ui64$(OBJ) \
|
||||
f64_to_i32$(OBJ) \
|
||||
f64_to_i64$(OBJ) \
|
||||
f64_to_ui32_r_minMag$(OBJ) \
|
||||
f64_to_ui64_r_minMag$(OBJ) \
|
||||
f64_to_i32_r_minMag$(OBJ) \
|
||||
f64_to_i64_r_minMag$(OBJ) \
|
||||
f64_to_f32$(OBJ) \
|
||||
f64_to_extF80$(OBJ) \
|
||||
f64_to_extF80M$(OBJ) \
|
||||
f64_to_f128$(OBJ) \
|
||||
f64_to_f128M$(OBJ) \
|
||||
f64_roundToInt$(OBJ) \
|
||||
f64_add$(OBJ) \
|
||||
f64_sub$(OBJ) \
|
||||
f64_mul$(OBJ) \
|
||||
f64_mulAdd$(OBJ) \
|
||||
f64_div$(OBJ) \
|
||||
f64_rem$(OBJ) \
|
||||
f64_sqrt$(OBJ) \
|
||||
f64_eq$(OBJ) \
|
||||
f64_le$(OBJ) \
|
||||
f64_lt$(OBJ) \
|
||||
f64_eq_signaling$(OBJ) \
|
||||
f64_le_quiet$(OBJ) \
|
||||
f64_lt_quiet$(OBJ) \
|
||||
f64_isSignalingNaN$(OBJ) \
|
||||
extF80_to_ui32$(OBJ) \
|
||||
extF80_to_ui64$(OBJ) \
|
||||
extF80_to_i32$(OBJ) \
|
||||
extF80_to_i64$(OBJ) \
|
||||
extF80_to_ui32_r_minMag$(OBJ) \
|
||||
extF80_to_ui64_r_minMag$(OBJ) \
|
||||
extF80_to_i32_r_minMag$(OBJ) \
|
||||
extF80_to_i64_r_minMag$(OBJ) \
|
||||
extF80_to_f32$(OBJ) \
|
||||
extF80_to_f64$(OBJ) \
|
||||
extF80_to_f128$(OBJ) \
|
||||
extF80_roundToInt$(OBJ) \
|
||||
extF80_add$(OBJ) \
|
||||
extF80_sub$(OBJ) \
|
||||
extF80_mul$(OBJ) \
|
||||
extF80_div$(OBJ) \
|
||||
extF80_rem$(OBJ) \
|
||||
extF80_sqrt$(OBJ) \
|
||||
extF80_eq$(OBJ) \
|
||||
extF80_le$(OBJ) \
|
||||
extF80_lt$(OBJ) \
|
||||
extF80_eq_signaling$(OBJ) \
|
||||
extF80_le_quiet$(OBJ) \
|
||||
extF80_lt_quiet$(OBJ) \
|
||||
extF80_isSignalingNaN$(OBJ) \
|
||||
extF80M_to_ui32$(OBJ) \
|
||||
extF80M_to_ui64$(OBJ) \
|
||||
extF80M_to_i32$(OBJ) \
|
||||
extF80M_to_i64$(OBJ) \
|
||||
extF80M_to_ui32_r_minMag$(OBJ) \
|
||||
extF80M_to_ui64_r_minMag$(OBJ) \
|
||||
extF80M_to_i32_r_minMag$(OBJ) \
|
||||
extF80M_to_i64_r_minMag$(OBJ) \
|
||||
extF80M_to_f32$(OBJ) \
|
||||
extF80M_to_f64$(OBJ) \
|
||||
extF80M_to_f128M$(OBJ) \
|
||||
extF80M_roundToInt$(OBJ) \
|
||||
extF80M_add$(OBJ) \
|
||||
extF80M_sub$(OBJ) \
|
||||
extF80M_mul$(OBJ) \
|
||||
extF80M_div$(OBJ) \
|
||||
extF80M_rem$(OBJ) \
|
||||
extF80M_sqrt$(OBJ) \
|
||||
extF80M_eq$(OBJ) \
|
||||
extF80M_le$(OBJ) \
|
||||
extF80M_lt$(OBJ) \
|
||||
extF80M_eq_signaling$(OBJ) \
|
||||
extF80M_le_quiet$(OBJ) \
|
||||
extF80M_lt_quiet$(OBJ) \
|
||||
f128_to_ui32$(OBJ) \
|
||||
f128_to_ui64$(OBJ) \
|
||||
f128_to_i32$(OBJ) \
|
||||
f128_to_i64$(OBJ) \
|
||||
f128_to_ui32_r_minMag$(OBJ) \
|
||||
f128_to_ui64_r_minMag$(OBJ) \
|
||||
f128_to_i32_r_minMag$(OBJ) \
|
||||
f128_to_i64_r_minMag$(OBJ) \
|
||||
f128_to_f32$(OBJ) \
|
||||
f128_to_extF80$(OBJ) \
|
||||
f128_to_f64$(OBJ) \
|
||||
f128_roundToInt$(OBJ) \
|
||||
f128_add$(OBJ) \
|
||||
f128_sub$(OBJ) \
|
||||
f128_mul$(OBJ) \
|
||||
f128_mulAdd$(OBJ) \
|
||||
f128_div$(OBJ) \
|
||||
f128_rem$(OBJ) \
|
||||
f128_sqrt$(OBJ) \
|
||||
f128_eq$(OBJ) \
|
||||
f128_le$(OBJ) \
|
||||
f128_lt$(OBJ) \
|
||||
f128_eq_signaling$(OBJ) \
|
||||
f128_le_quiet$(OBJ) \
|
||||
f128_lt_quiet$(OBJ) \
|
||||
f128_isSignalingNaN$(OBJ) \
|
||||
f128M_to_ui32$(OBJ) \
|
||||
f128M_to_ui64$(OBJ) \
|
||||
f128M_to_i32$(OBJ) \
|
||||
f128M_to_i64$(OBJ) \
|
||||
f128M_to_ui32_r_minMag$(OBJ) \
|
||||
f128M_to_ui64_r_minMag$(OBJ) \
|
||||
f128M_to_i32_r_minMag$(OBJ) \
|
||||
f128M_to_i64_r_minMag$(OBJ) \
|
||||
f128M_to_f32$(OBJ) \
|
||||
f128M_to_extF80M$(OBJ) \
|
||||
f128M_to_f64$(OBJ) \
|
||||
f128M_roundToInt$(OBJ) \
|
||||
f128M_add$(OBJ) \
|
||||
f128M_sub$(OBJ) \
|
||||
f128M_mul$(OBJ) \
|
||||
f128M_mulAdd$(OBJ) \
|
||||
f128M_div$(OBJ) \
|
||||
f128M_rem$(OBJ) \
|
||||
f128M_sqrt$(OBJ) \
|
||||
f128M_eq$(OBJ) \
|
||||
f128M_le$(OBJ) \
|
||||
f128M_lt$(OBJ) \
|
||||
f128M_eq_signaling$(OBJ) \
|
||||
f128M_le_quiet$(OBJ) \
|
||||
f128M_lt_quiet$(OBJ) \
|
||||
|
||||
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
|
||||
|
||||
$(OBJS_ALL): \
|
||||
platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
|
||||
$(SOURCE_DIR)/include/primitives.h
|
||||
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
|
||||
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
|
||||
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
|
||||
$(SOURCE_DIR)/include/softfloat.h
|
||||
|
||||
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
|
||||
$(COMPILE_C) $(SOURCE_DIR)/$*.c
|
||||
|
||||
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
|
||||
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
|
||||
|
||||
softfloat$(LIB): $(OBJS_ALL)
|
||||
$(DELETE) $@
|
||||
$(MAKELIB) $^
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(DELETE) $(OBJS_ALL) softfloat$(LIB)
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
*** FIX.
|
||||
|
||||
This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
|
||||
Arithmetic Package, Release 2b.
|
||||
|
||||
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://www.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 ALL LOSSES,
|
||||
COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
|
||||
EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
|
||||
INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
|
||||
OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
|
||||
|
||||
Derivative works are acceptable, even for commercial purposes, so long as
|
||||
(1) the source code for the derivative work includes prominent notice that
|
||||
the work is derivative, and (2) the source code includes prominent notice with
|
||||
these four paragraphs for those parts of this code that are retained.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define LITTLEENDIAN 1
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define INLINE extern inline
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define SOFTFLOAT_FAST_INT64 1
|
||||
|
|
@ -0,0 +1,143 @@
|
|||
|
||||
<HTML>
|
||||
|
||||
<HEAD>
|
||||
<TITLE>Berkeley SoftFloat History</TITLE>
|
||||
</HEAD>
|
||||
|
||||
<BODY>
|
||||
|
||||
<H1>History of Berkeley SoftFloat, to Release 3</H1>
|
||||
|
||||
<P>
|
||||
John R. Hauser<BR>
|
||||
2014 _____<BR>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
*** CONTENT DONE.
|
||||
</P>
|
||||
|
||||
|
||||
<H3>Release 3 (2014 December)</H3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>
|
||||
Complete rewrite, funded by the University of California, Berkeley.
|
||||
Major changes included renaming most types and functions, upgrading some
|
||||
algorithms, restructuring the source files, and making SoftFloat into a true
|
||||
library.
|
||||
|
||||
<LI>
|
||||
Added functions to convert between floating-point and unsigned integers, both
|
||||
<NOBR>32-bit</NOBR> and <NOBR>64-bit</NOBR> (<CODE>uint32_t</CODE> and
|
||||
<CODE>uint64_t</CODE>).
|
||||
|
||||
<LI>
|
||||
Added functions for fused multiply-add, for all supported floating-point
|
||||
formats except <NOBR>80-bit</NOBR> double-extended-precision.
|
||||
|
||||
<LI>
|
||||
Added support for a fifth rounding mode, <CODE>near_maxMag</CODE> (round to
|
||||
nearest, with ties to maximum magnitude, away from zero).
|
||||
|
||||
<LI>
|
||||
Dropped the <CODE>timesoftfloat</CODE> program (now part of the Berkeley
|
||||
TestFloat package).
|
||||
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Release 2c (2014 December)</H3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>
|
||||
Further improved wording for the legal restrictions on using SoftFloat releases
|
||||
<NOBR>through 2c</NOBR>.
|
||||
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Release 2b (2002 May)</H3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>
|
||||
Made minor updates to the documentation, including improved wording for the
|
||||
legal restrictions on using SoftFloat.
|
||||
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Release 2a (1998 December)</H3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>
|
||||
Added functions to convert between <NOBR>64-bit</NOBR> integers
|
||||
(<CODE>int64</CODE>) and all supported floating-point formats.
|
||||
|
||||
<LI>
|
||||
Fixed a bug in all <NOBR>64-bit</NOBR>-version square root functions except
|
||||
<CODE>float32_sqrt</CODE> that caused the result sometimes to be off by
|
||||
<NOBR>1 unit</NOBR> in the last place (<NOBR>1 ulp</NOBR>) from what it should
|
||||
be.
|
||||
(Bug discovered by Paul Donahue.)
|
||||
|
||||
<LI>
|
||||
Improved the Makefiles.
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Release 2 (1997 June)</H3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>
|
||||
Created the <NOBR>64-bit</NOBR> (<CODE>bits64</CODE>) version, adding the
|
||||
<CODE>floatx80</CODE> and <CODE>float128</CODE> formats.
|
||||
|
||||
<LI>
|
||||
Changed the source directory structure, splitting the sources into a
|
||||
<CODE>bits32</CODE> and a <CODE>bits64</CODE> version.
|
||||
Renamed <CODE>environment.h</CODE> to <CODE>milieu.h</CODE> to avoid confusion
|
||||
with environment variables.
|
||||
|
||||
<LI>
|
||||
Fixed a small error that caused <CODE>float64_round_to_int</CODE> often to
|
||||
round the wrong way in nearest/even mode when the operand was between
|
||||
2<SUP>20</SUP> and 2<SUP>21</SUP> and halfway between two integers.
|
||||
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Release 1a (1996 July)</H3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>
|
||||
Corrected a mistake that caused borderline underflow cases not to raise the
|
||||
underflow flag when they should have.
|
||||
(Problem reported by Doug Priest.)
|
||||
|
||||
<LI>
|
||||
Added the <CODE>float_detect_tininess</CODE> variable to control whether
|
||||
tininess is detected before or after rounding.
|
||||
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Release 1 (1996 July)</H3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI>
|
||||
Original release.
|
||||
|
||||
</UL>
|
||||
|
||||
|
||||
</BODY>
|
||||
|
|
@ -0,0 +1,551 @@
|
|||
|
||||
<HTML>
|
||||
|
||||
<HEAD>
|
||||
<TITLE>Berkeley SoftFloat Source Documentation</TITLE>
|
||||
</HEAD>
|
||||
|
||||
<BODY>
|
||||
|
||||
<H1>Berkeley SoftFloat Release 3: Source Documentation</H1>
|
||||
|
||||
<P>
|
||||
John R. Hauser<BR>
|
||||
2014 _____<BR>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
*** REPLACE QUOTATION MARKS.
|
||||
</P>
|
||||
|
||||
|
||||
<H2>Contents</H2>
|
||||
|
||||
<P>
|
||||
*** CHECK.<BR>
|
||||
*** FIX FORMATTING.
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
Introduction
|
||||
Limitations
|
||||
Acknowledgments and License
|
||||
SoftFloat Package Directory Structure
|
||||
Issues for Porting SoftFloat to a New Target
|
||||
Standard Headers <stdbool.h> and <stdint.h>
|
||||
Specializing Floating-Point Behavior
|
||||
Macros for Build Options
|
||||
Adapting a Template Target Directory
|
||||
Target-Specific Optimization of Primitive Functions
|
||||
Testing SoftFloat
|
||||
Providing SoftFloat as a Common Library for Applications
|
||||
Contact Information
|
||||
</PRE>
|
||||
|
||||
|
||||
<H2>1. Introduction</H2>
|
||||
|
||||
<P>
|
||||
This document gives information needed for compiling and/or porting Berkeley
|
||||
SoftFloat, a library of C functions implementing binary floating-point
|
||||
conforming to the IEEE Standard for Floating-Point Arithmetic.
|
||||
For basic documentation about SoftFloat refer to
|
||||
<A HREF="SoftFloat.html"><CODE>SoftFloat.html</CODE></A>.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The source code for SoftFloat is intended to be relatively machine-independent
|
||||
and should be compilable with any ISO-standard C compiler that also supports
|
||||
<NOBR>64-bit</NOBR> integers.
|
||||
SoftFloat has been successfully compiled with the GNU C Compiler
|
||||
(<CODE>gcc</CODE>) for several platforms.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
<NOBR>Release 3</NOBR> of SoftFloat is a complete rewrite relative to
|
||||
<NOBR>Release 2</NOBR> or earlier.
|
||||
Changes to the interface of SoftFloat functions are documented in
|
||||
<A HREF="SoftFloat.html"><CODE>SoftFloat.html</CODE></A>.
|
||||
</P>
|
||||
|
||||
|
||||
<H2>2. Limitations</H2>
|
||||
|
||||
<P>
|
||||
SoftFloat assumes the computer has an addressable byte size of either 8 or
|
||||
<NOBR>16 bits</NOBR>.
|
||||
(Nearly all computers in use today have <NOBR>8-bit</NOBR> bytes.)
|
||||
</P>
|
||||
|
||||
<P>
|
||||
SoftFloat is written in C and is designed to work with other C code.
|
||||
The C compiler used must conform at a minimum to the 1989 ANSI standard for the
|
||||
C language (same as the 1990 ISO standard) and must in addition support basic
|
||||
arithmetic on <NOBR>64-bit</NOBR> integers.
|
||||
Earlier releases of SoftFloat included implementations of <NOBR>32-bit</NOBR>
|
||||
single-precision and <NOBR>64-bit</NOBR> double-precision floating-point that
|
||||
did not require <NOBR>64-bit</NOBR> integers, but this option is not supported
|
||||
with <NOBR>Release 3</NOBR>.
|
||||
Since 1999, ISO standards for C have mandated compiler support for
|
||||
<NOBR>64-bit</NOBR> integers.
|
||||
A compiler conforming to the 1999 C Standard or later is recommended but not
|
||||
strictly required.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
<NOBR>C Standard</NOBR> header files <CODE><stdbool.h></CODE> and
|
||||
<CODE><stdint.h></CODE> are required for defining standard Boolean and
|
||||
integer types.
|
||||
If these headers are not supplied with the C compiler, minimal substitutes must
|
||||
be provided.
|
||||
SoftFloat's dependence on these headers is detailed later in
|
||||
<NOBR>section 5.1</NOBR>, <I>Standard Headers <stdbool.h> and
|
||||
<stdint.h></I>.
|
||||
</P>
|
||||
|
||||
|
||||
<H2>3. Acknowledgments and License</H2>
|
||||
|
||||
<P>
|
||||
The SoftFloat package was written by me, <NOBR>John R.</NOBR> Hauser.
|
||||
<NOBR>Release 3</NOBR> of SoftFloat is a completely new implementation
|
||||
supplanting earlier releases.
|
||||
This project was done in the employ of the University of California, Berkeley,
|
||||
within the Department of Electrical Engineering and Computer Sciences, first
|
||||
for the Parallel Computing Laboratory (Par Lab) and then for the ASPIRE Lab.
|
||||
The work was officially overseen by Prof. Krste Asanovic, with funding provided
|
||||
by these sources:
|
||||
<BLOCKQUOTE>
|
||||
<TABLE>
|
||||
<TR>
|
||||
<TD><NOBR>Par Lab:</NOBR></TD>
|
||||
<TD>
|
||||
Microsoft (Award #024263), Intel (Award #024894), and U.C. Discovery
|
||||
(Award #DIG07-10227), with additional support from Par Lab affiliates Nokia,
|
||||
NVIDIA, Oracle, and Samsung.
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD><NOBR>ASPIRE Lab:</NOBR></TD>
|
||||
<TD>
|
||||
DARPA PERFECT program (Award #HR0011-12-2-0016), with additional support from
|
||||
ASPIRE industrial sponsor Intel and ASPIRE affiliates Google, Nokia, NVIDIA,
|
||||
Oracle, and Samsung.
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</BLOCKQUOTE>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The following applies to the whole of SoftFloat <NOBR>Release 3</NOBR> as well
|
||||
as to each source file individually.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents).
|
||||
All Rights Reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
</P>
|
||||
|
||||
<P>
|
||||
Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice, this
|
||||
list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
Neither the name of the Regents nor the names of its contributors may be used
|
||||
to endorse or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
|
||||
INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF
|
||||
THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS
|
||||
PROVIDED "<NOBR>AS IS</NOBR>".
|
||||
REGENTS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
|
||||
ENHANCEMENTS, OR MODIFICATIONS.
|
||||
</P>
|
||||
|
||||
|
||||
<H2>4. SoftFloat Package Directory Structure</H2>
|
||||
|
||||
<P>
|
||||
Because SoftFloat is targeted to multiple platforms, its source code is
|
||||
slightly scattered between target-specific and target-independent directories
|
||||
and files.
|
||||
The supplied directory structure is as follows:
|
||||
<PRE>
|
||||
doc
|
||||
source
|
||||
include
|
||||
8086
|
||||
build
|
||||
template-FAST_INT64
|
||||
template-not-FAST_INT64
|
||||
Win32-MinGW
|
||||
Linux-386-GCC
|
||||
</PRE>
|
||||
The majority of the SoftFloat sources are provided in the <CODE>source</CODE>
|
||||
directory.
|
||||
The <CODE>include</CODE> subdirectory of <CODE>source</CODE> contains several
|
||||
header files (unsurprisingly), while the <CODE>8086</CODE> subdirectory
|
||||
contains source files that specialize the floating-point behavior to match the
|
||||
Intel x86 line of processors.
|
||||
If other specializations are attempted, these would be expected to be other
|
||||
subdirectories of <CODE>source</CODE> alongside <CODE>8086</CODE>.
|
||||
Specialization is covered later, in <NOBR>section 5.2</NOBR>, <I>Specializing
|
||||
Floating-Point Behavior</I>.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The <CODE>build</CODE> directory is intended to contain a subdirectory for each
|
||||
target platform for which a build of the SoftFloat library may be created.
|
||||
For each build target, the target's subdirectory is where all derived object
|
||||
files and the completed SoftFloat library (typically <CODE>softfloat.a</CODE>)
|
||||
are created.
|
||||
The two <CODE>template</CODE> subdirectories are not actual build targets but
|
||||
contain sample files for creating new target directories.
|
||||
(The meaning of <CODE>FAST_INT64</CODE> will be explained later.)
|
||||
</P>
|
||||
|
||||
<P>
|
||||
Ignoring the <CODE>template</CODE> directories, the supplied target directories
|
||||
are intended to follow a naming system of
|
||||
<NOBR><CODE><execution-environment>-<compiler></CODE></NOBR>.
|
||||
For the example targets,
|
||||
<NOBR><CODE><execution-environment></CODE></NOBR> is <CODE>Win32</CODE>
|
||||
and <CODE>Linux-386</CODE>, and
|
||||
<NOBR><CODE><compiler></CODE></NOBR> is <CODE>MinGW</CODE> and
|
||||
<CODE>GCC</CODE>, respectively.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
As supplied, each target directory contains two files:
|
||||
<PRE>
|
||||
Makefile
|
||||
platform.h
|
||||
</PRE>
|
||||
The provided <CODE>Makefile</CODE> is written for GNU <CODE>make</CODE>.
|
||||
A build of SoftFloat for the specific target is begun by executing the
|
||||
<CODE>make</CODE> command with the target directory as the current directory.
|
||||
A completely different build tool can be used if an appropriate
|
||||
<CODE>Makefile</CODE> equivalent is created.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The <CODE>platform.h</CODE> header file exists to provide a location for
|
||||
additional C declarations specific to the build target.
|
||||
Every C source file of SoftFloat contains a <CODE>#include</CODE> for
|
||||
<CODE>platform.h</CODE>.
|
||||
In many cases, the contents of <CODE>platform.h</CODE> can be as simple as one
|
||||
or two lines of code.
|
||||
At the other extreme, to get maximal performance from SoftFloat, it may be
|
||||
desirable to include in header <CODE>platform.h</CODE> (directly or via
|
||||
<CODE>#include</CODE>) declarations for numerous target-specific optimizations.
|
||||
Such possibilities are discussed in the next section, <I>Issues for Porting
|
||||
SoftFloat to a New Target</I>.
|
||||
If the target's compiler or library has bugs or other shortcomings, workarounds
|
||||
for these issues may also be possible with target-specific declarations in
|
||||
<CODE>platform.h</CODE>, avoiding the need to modify the main SoftFloat
|
||||
sources.
|
||||
</P>
|
||||
|
||||
|
||||
<H2>5. Issues for Porting SoftFloat to a New Target</H2>
|
||||
|
||||
<H3>5.1. Standard Headers <CODE><stdbool.h></CODE> and <CODE><stdint.h></CODE></H3>
|
||||
|
||||
<P>
|
||||
The SoftFloat sources make use of standard headers
|
||||
<CODE><stdbool.h></CODE> and <CODE><stdint.h></CODE>, which have
|
||||
been part of the ISO C Standard Library since 1999.
|
||||
With any recent compiler, these standard headers are likely to be supported,
|
||||
even if the compiler does not claim complete conformance to the latest ISO C
|
||||
Standard.
|
||||
For older or nonstandard compilers, substitutes for
|
||||
<CODE><stdbool.h></CODE> and <CODE><stdint.h></CODE> may need to be
|
||||
created.
|
||||
SoftFloat depends on these names from <CODE><stdbool.h></CODE>:
|
||||
<PRE>
|
||||
bool
|
||||
true
|
||||
false
|
||||
</PRE>
|
||||
and on these names from <CODE><stdint.h></CODE>:
|
||||
<PRE>
|
||||
uint16_t
|
||||
uint32_t
|
||||
uint64_t
|
||||
int32_t
|
||||
int64_t
|
||||
UINT64_C
|
||||
INT64_C
|
||||
uint_least8_t
|
||||
uint_fast8_t
|
||||
uint_fast16_t
|
||||
uint_fast32_t
|
||||
uint_fast64_t
|
||||
int_fast8_t
|
||||
int_fast16_t
|
||||
int_fast32_t
|
||||
int_fast64_t
|
||||
</PRE>
|
||||
</P>
|
||||
|
||||
|
||||
<H3>5.2. Specializing Floating-Point Behavior</H3>
|
||||
|
||||
<P>
|
||||
The IEEE Floating-Point Standard allows for some flexibility in a conforming
|
||||
implementation, particularly concerning NaNs.
|
||||
The SoftFloat <CODE>source</CODE> directory is supplied with one or more
|
||||
<I>specialization</I> subdirectories containing possible definitions for this
|
||||
implementation-specific behavior.
|
||||
For example, the <CODE>8086</CODE> subdirectory has source files that
|
||||
specialize SoftFloat's behavior to match that of Intel's x86 line of
|
||||
processors.
|
||||
The files in a specialization subdirectory must determine:
|
||||
<UL>
|
||||
<LI>
|
||||
whether tininess for underflow is detected before or after rounding by default;
|
||||
<LI>
|
||||
what (if anything) special happens when exceptions are raised;
|
||||
<LI>
|
||||
how signaling NaNs are distinguished from quiet NaNs;
|
||||
<LI>
|
||||
the default generated quiet NaNs; and
|
||||
<LI>
|
||||
how NaNs are propagated from function inputs to output.
|
||||
</UL>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
As provided, the build process for a target expects to involve exactly
|
||||
<EM>one</EM> specialization directory that defines <EM>all</EM> of these
|
||||
implementation-specific details for the target.
|
||||
A specialization directory such as <CODE>8086</CODE> is expected to contain a
|
||||
header file called <CODE>specialize.h</CODE>, together with whatever other
|
||||
source files are needed to complete the specialization.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
A new build target may use an existing specialization, such as the one provided
|
||||
by the <CODE>8086</CODE> subdirectory.
|
||||
If a build target needs a new specialization, different from any existing ones,
|
||||
it is recommended that a new specialization subdirectory be created in the
|
||||
<CODE>source</CODE> directory for this purpose.
|
||||
The <CODE>specialize.h</CODE> header file from any of the provided
|
||||
specialization subdirectories can be used as a model for what definitions are
|
||||
needed.
|
||||
</P>
|
||||
|
||||
|
||||
<H3>5.3. Macros for Build Options</H3>
|
||||
|
||||
<P>
|
||||
The SoftFloat source files adapt the floating-point implementation according to
|
||||
a few C preprocessor macros:
|
||||
<BLOCKQUOTE>
|
||||
<DL>
|
||||
<DT><CODE>LITTLEENDIAN</CODE>
|
||||
<DD>
|
||||
Must be defined for little-endian machines; must not be defined for big-endian
|
||||
machines.
|
||||
<DT><CODE>SOFTFLOAT_FAST_INT64</CODE>
|
||||
<DD>
|
||||
Can be defined to indicate that the build target's implementation of
|
||||
<CODE>64-bit</CODE> arithmetic is efficient.
|
||||
For newer <CODE>64-bit</CODE> processors, this macro should usually be defined.
|
||||
For very small microprocessors whose buses and registers are <CODE>8-bit</CODE>
|
||||
or <CODE>16-bit</CODE> in size, this macro should usually not be defined.
|
||||
Whether this macro should be defined for a <CODE>32-bit</CODE> processor may
|
||||
depend on the target machine and the applications that will use SoftFloat.
|
||||
<DT><CODE>SOFTFLOAT_FAST_DIV64TO32</CODE>
|
||||
<DD>
|
||||
Can be defined to indicate that the target's division operator
|
||||
<NOBR>in C</NOBR> (written as <CODE>/</CODE>) is reasonably efficient for
|
||||
dividing a <CODE>64-bit</CODE> unsigned integer by a <CODE>32-bit</CODE>
|
||||
unsigned integer.
|
||||
Setting this macro may affect the performance of division, remainder, and
|
||||
square root operations.
|
||||
<DT><CODE>INLINE_LEVEL</CODE>
|
||||
<DD>
|
||||
Can be defined to an integer to determine the degree of inlining requested of
|
||||
the compiler.
|
||||
Larger numbers request that more inlining be done.
|
||||
If this macro is not defined or is defined to a value less <NOBR>than 1</NOBR>
|
||||
(zero or negative), no inlining is requested.
|
||||
The maximum effective value is no higher <NOBR>than 5</NOBR>.
|
||||
Defining this macro to a value greater than 5 is the same as defining it
|
||||
<NOBR>to 5</NOBR>.
|
||||
<DT><CODE>INLINE</CODE>
|
||||
<DD>
|
||||
Specifies the sequence of tokens used to indicate that a C function should be
|
||||
inlined.
|
||||
If macro <CODE>INLINE_LEVEL</CODE> is defined with a value of 1 or higher, this
|
||||
macro must be defined; otherwise, this macro is ignored and need not be
|
||||
defined.
|
||||
For some compilers, this macro can be defined as the single keyword
|
||||
<CODE>inline</CODE>.
|
||||
Historically, the <CODE>gcc</CODE> compiler has required that this macro be
|
||||
defined to <CODE>extern</CODE> <CODE>inline</CODE>.
|
||||
</DL>
|
||||
</BLOCKQUOTE>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
Following the usual custom <NOBR>for C</NOBR>, for the first three macros (all
|
||||
except <CODE>INLINE_LEVEL</CODE> and <CODE>INLINE</CODE>), the content of any
|
||||
definition is irrelevant;
|
||||
what matters is a macro's effect on <CODE>#ifdef</CODE> directives.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
It is recommended that any definitions of macros <CODE>LITTLEENDIAN</CODE> and
|
||||
<CODE>INLINE</CODE> be made in a build target's <CODE>platform.h</CODE> header
|
||||
file, because these macros are expected to be determined inflexibly by the
|
||||
target machine and compiler.
|
||||
The other three macros control optimization and might be better located in the
|
||||
target's Makefile (or its equivalent).
|
||||
</P>
|
||||
|
||||
|
||||
<H3>5.4. Adapting a Template Target Directory</H3>
|
||||
|
||||
<P>
|
||||
In the <CODE>build</CODE> directory, two <CODE>template</CODE> subdirectories
|
||||
provide models for new target directories.
|
||||
Two different templates exist because different functions are needed in the
|
||||
SoftFloat library depending on whether macro <CODE>SOFTFLOAT_FAST_INT64</CODE>
|
||||
is defined.
|
||||
If macro <CODE>SOFTFLOAT_FAST_INT64</CODE> will be defined,
|
||||
<CODE>template-FAST_INT64</CODE> is the template to use;
|
||||
otherwise, <CODE>template-not-FAST_INT64</CODE> is the appropriate template.
|
||||
A new target directory can be created by copying the correct template directory
|
||||
and editing the files inside.
|
||||
To avoid confusion, it would be wise to refrain from editing the files within a
|
||||
template directory directly.
|
||||
</P>
|
||||
|
||||
|
||||
<H3>5.5. Target-Specific Optimization of Primitive Functions</H3>
|
||||
|
||||
<P>
|
||||
Header file <CODE>primitives.h</CODE> (in directory
|
||||
<CODE>source/include</CODE>) declares macros and functions for numerous
|
||||
underlying arithmetic operations upon which many of SoftFloat's floating-point
|
||||
functions are ultimately built.
|
||||
The SoftFloat sources include implementations of all of these functions/macros,
|
||||
written as standard C code, so a complete and correct SoftFloat library can be
|
||||
built using only the supplied code for all functions.
|
||||
However, for many targets, SoftFloat's performance can be improved by
|
||||
substituting target-specific implementations of some of the functions/macros
|
||||
declared in <CODE>primitives.h</CODE>.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
For example, <CODE>primitives.h</CODE> declares a function called
|
||||
<CODE>softfloat_countLeadingZeros32</CODE> that takes an unsigned
|
||||
<NOBR>32-bit</NOBR> integer as an argument and returns the maximal number of
|
||||
the integer's most-significant bits that are all zeros.
|
||||
While the SoftFloat sources include an implementation of this function written
|
||||
in <NOBR>standard C</NOBR>, many processors can perform this same function
|
||||
directly in only one or two machine instructions.
|
||||
An alternative, target-specific implementation that maps to those instructions
|
||||
is likely to be more efficient than the generic C code from the SoftFloat
|
||||
package.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
A build target can replace the supplied version of any function or macro of
|
||||
<CODE>primitives.h</CODE> by defining a macro with the same name in the
|
||||
target's <CODE>platform.h</CODE> header file.
|
||||
For this purpose, it may be helpful for <CODE>platform.h</CODE> to
|
||||
<CODE>#include</CODE> header file <CODE>primitiveTypes.h</CODE>, which defines
|
||||
types used for arguments and results of functions declared in
|
||||
<CODE>primitives.h</CODE>.
|
||||
When a desired replacement implementation is a function, not a macro, it is
|
||||
sufficient for <CODE>platform.h</CODE> to include the line
|
||||
<PRE>
|
||||
#define <function-name> <function-name>
|
||||
</PRE>
|
||||
where <CODE><function-name></CODE> is the name of the function.
|
||||
This technically defines <CODE><function-name></CODE> as a macro, but one
|
||||
that resolves to the same name, which may then be a function.
|
||||
(A preprocessor conforming to the C Standard must limit recursive macro
|
||||
expansion from being applied more than once.)
|
||||
</P>
|
||||
|
||||
|
||||
<H2>6. Testing SoftFloat</H2>
|
||||
|
||||
<P>
|
||||
SoftFloat can be tested using the <CODE>testsoftfloat</CODE> program by the
|
||||
same author.
|
||||
This program is part of the Berkeley TestFloat package available at the Web
|
||||
page
|
||||
<A HREF="http://www.jhauser.us/arithmetic/TestFloat.html"><CODE>http://www.jhauser.us/arithmetic/TestFloat.html</CODE></A>.
|
||||
The TestFloat package also has a program called <CODE>timesoftfloat</CODE> that
|
||||
measures the speed of SoftFloat's floating-point functions.
|
||||
</P>
|
||||
|
||||
|
||||
<H2>7. Providing SoftFloat as a Common Library for Applications</H2>
|
||||
|
||||
<P>
|
||||
Supplied <CODE>softfloat.h</CODE> depends on <CODE>softfloat_types.h</CODE>.
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
The target-specific `softfloat.h' header file defines the SoftFloat
|
||||
interface as seen by clients.
|
||||
|
||||
Unlike the actual function definitions in `softfloat.c', the declarations
|
||||
in `softfloat.h' do not use any of the types defined by the `processors'
|
||||
header file. This is done so that clients will not have to include the
|
||||
`processors' header file in order to use SoftFloat. Nevertheless, the
|
||||
target-specific declarations in `softfloat.h' must match what `softfloat.c'
|
||||
expects. For example, if `int32' is defined as `int' in the `processors'
|
||||
header file, then in `softfloat.h' the output of `float32_to_int32' should
|
||||
be stated as `int', although in `softfloat.c' it is given in target-
|
||||
independent form as `int32'.
|
||||
</PRE>
|
||||
|
||||
<PRE>
|
||||
*** HERE
|
||||
|
||||
Porting and/or compiling SoftFloat involves the following steps:
|
||||
|
||||
4. In the target-specific subdirectory, edit the files `softfloat-specialize'
|
||||
and `softfloat.h' to define the desired exception handling functions
|
||||
and mode control values. In the `softfloat.h' header file, ensure also
|
||||
that all declarations give the proper target-specific type (such as
|
||||
`int' or `long') corresponding to the target-independent type used in
|
||||
`softfloat.c' (such as `int32'). None of the type names declared in the
|
||||
`processors' header file should appear in `softfloat.h'.
|
||||
|
||||
</PRE>
|
||||
|
||||
|
||||
<H2>8. Contact Information</H2>
|
||||
|
||||
<P>
|
||||
At the time of this writing, the most up-to-date information about SoftFloat
|
||||
and the latest release can be found at the Web page
|
||||
<A HREF="http://www.jhauser.us/arithmetic/SoftFloat.html"><CODE>http://www.jhauser.us/arithmetic/SoftFloat.html</CODE></A>.
|
||||
</P>
|
||||
|
||||
|
||||
</BODY>
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,54 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
*----------------------------------------------------------------------------*/
|
||||
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint64_t uiA0;
|
||||
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
|
||||
uiA0 = aSPtr->signif;
|
||||
return
|
||||
! (uiA0 & UINT64_C( 0x4000000000000000 ))
|
||||
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "primitives.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
*----------------------------------------------------------------------------*/
|
||||
bool f128M_isSignalingNaN( const float128_t *aPtr )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t uiA96;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
|
||||
return
|
||||
((uiA96 & 0x00007FFF) != 0)
|
||||
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
||||
| aWPtr[indexWord( 4, 0 )])
|
||||
!= 0);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended
|
||||
| floating-point NaN, and stores this NaN at the location pointed to by
|
||||
| `zSPtr'.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_commonNaNToExtF80M(
|
||||
const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
|
||||
{
|
||||
|
||||
zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF );
|
||||
zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "primitives.h"
|
||||
#include "specialize.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended
|
||||
| floating-point NaN, and returns the bit pattern of this value as an unsigned
|
||||
| integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
|
||||
{
|
||||
struct uint128 uiZ;
|
||||
|
||||
uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
|
||||
uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
|
||||
return uiZ;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "primitives.h"
|
||||
#include "specialize.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
|
||||
| NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument
|
||||
| `zWPtr' points to an array of four 32-bit elements that concatenate in the
|
||||
| platform's normal endian order to form a 128-bit floating-point value.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr )
|
||||
{
|
||||
|
||||
softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr );
|
||||
zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "primitives.h"
|
||||
#include "specialize.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
|
||||
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
|
||||
{
|
||||
struct uint128 uiZ;
|
||||
|
||||
uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
|
||||
uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
|
||||
return uiZ;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "specialize.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
|
||||
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
|
||||
{
|
||||
|
||||
return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "specialize.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point
|
||||
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
|
||||
{
|
||||
|
||||
return
|
||||
(uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
|
||||
| aPtr->v64>>12;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is
|
||||
| a NaN, converts this NaN to the common NaN form, and stores the resulting
|
||||
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
|
||||
| NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_extF80MToCommonNaN(
|
||||
const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
|
||||
{
|
||||
|
||||
if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
zPtr->sign = signExtF80UI64( aSPtr->signExp );
|
||||
zPtr->v64 = aSPtr->signif<<1;
|
||||
zPtr->v0 = 0;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
||||
| has the bit pattern of an 80-bit extended floating-point NaN, converts
|
||||
| this NaN to the common NaN form, and stores the resulting common NaN at the
|
||||
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_extF80UIToCommonNaN(
|
||||
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
|
||||
{
|
||||
|
||||
if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
zPtr->sign = uiA64>>15;
|
||||
zPtr->v64 = uiA0<<1;
|
||||
zPtr->v0 = 0;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "primitives.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN,
|
||||
| converts this NaN to the common NaN form, and stores the resulting common
|
||||
| NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN,
|
||||
| the invalid exception is raised. Argument `aWPtr' points to an array of
|
||||
| four 32-bit elements that concatenate in the platform's normal endian order
|
||||
| to form a 128-bit floating-point value.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr )
|
||||
{
|
||||
|
||||
if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
zPtr->sign = aWPtr[indexWordHi( 4 )]>>31;
|
||||
softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "primitives.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
||||
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
|
||||
| the common NaN form, and stores the resulting common NaN at the location
|
||||
| pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception
|
||||
| is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_f128UIToCommonNaN(
|
||||
uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
|
||||
{
|
||||
struct uint128 NaNSig;
|
||||
|
||||
if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 );
|
||||
zPtr->sign = uiA64>>63;
|
||||
zPtr->v64 = NaNSig.v64;
|
||||
zPtr->v0 = NaNSig.v0;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts
|
||||
| this NaN to the common NaN form, and stores the resulting common NaN at the
|
||||
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr )
|
||||
{
|
||||
|
||||
if ( softfloat_isSigNaNF32UI( uiA ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
zPtr->sign = uiA>>31;
|
||||
zPtr->v64 = (uint_fast64_t) uiA<<41;
|
||||
zPtr->v0 = 0;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts
|
||||
| this NaN to the common NaN form, and stores the resulting common NaN at the
|
||||
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr )
|
||||
{
|
||||
|
||||
if ( softfloat_isSigNaNF64UI( uiA ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
zPtr->sign = uiA>>63;
|
||||
zPtr->v64 = uiA<<12;
|
||||
zPtr->v0 = 0;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming at least one of the two 80-bit extended floating-point values
|
||||
| pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result
|
||||
| at the location pointed to by `zSPtr'. If either original floating-point
|
||||
| value is a signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_propagateNaNExtF80M(
|
||||
const struct extFloat80M *aSPtr,
|
||||
const struct extFloat80M *bSPtr,
|
||||
struct extFloat80M *zSPtr
|
||||
)
|
||||
{
|
||||
bool isSigNaNA;
|
||||
const struct extFloat80M *sPtr;
|
||||
bool isSigNaNB;
|
||||
uint_fast16_t uiB64;
|
||||
uint64_t uiB0;
|
||||
uint_fast16_t uiA64;
|
||||
uint64_t uiA0;
|
||||
uint_fast16_t uiMagA64, uiMagB64;
|
||||
|
||||
isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr );
|
||||
sPtr = aSPtr;
|
||||
if ( ! bSPtr ) {
|
||||
if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
goto copy;
|
||||
}
|
||||
isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr );
|
||||
if ( isSigNaNA | isSigNaNB ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if ( isSigNaNA ) {
|
||||
uiB64 = bSPtr->signExp;
|
||||
if ( isSigNaNB ) goto returnLargerUIMag;
|
||||
uiB0 = bSPtr->signif;
|
||||
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB;
|
||||
goto copy;
|
||||
} else {
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy;
|
||||
goto copyB;
|
||||
}
|
||||
}
|
||||
uiB64 = bSPtr->signExp;
|
||||
returnLargerUIMag:
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiMagA64 = uiA64 & 0x7FFF;
|
||||
uiMagB64 = uiB64 & 0x7FFF;
|
||||
if ( uiMagA64 < uiMagB64 ) goto copyB;
|
||||
if ( uiMagB64 < uiMagA64 ) goto copy;
|
||||
uiA0 = aSPtr->signif;
|
||||
uiB0 = bSPtr->signif;
|
||||
if ( uiA0 < uiB0 ) goto copyB;
|
||||
if ( uiB0 < uiA0 ) goto copy;
|
||||
if ( uiA64 < uiB64 ) goto copy;
|
||||
copyB:
|
||||
sPtr = bSPtr;
|
||||
copy:
|
||||
zSPtr->signExp = sPtr->signExp;
|
||||
zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting the unsigned integer formed from concatenating `uiA64' and
|
||||
| `uiA0' as an 80-bit extended floating-point value, and likewise interpreting
|
||||
| the unsigned integer formed from concatenating `uiB64' and `uiB0' as another
|
||||
| 80-bit extended floating-point value, and assuming at least on of these
|
||||
| floating-point values is a NaN, returns the bit pattern of the combined NaN
|
||||
| result. If either original floating-point value is a signaling NaN, the
|
||||
| invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128
|
||||
softfloat_propagateNaNExtF80UI(
|
||||
uint_fast16_t uiA64,
|
||||
uint_fast64_t uiA0,
|
||||
uint_fast16_t uiB64,
|
||||
uint_fast64_t uiB0
|
||||
)
|
||||
{
|
||||
bool isSigNaNA, isSigNaNB;
|
||||
uint_fast16_t uiMagA64, uiMagB64;
|
||||
struct uint128 uiZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 );
|
||||
isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 );
|
||||
/*------------------------------------------------------------------------
|
||||
| Make NaNs non-signaling.
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA0 |= UINT64_C( 0xC000000000000000 );
|
||||
uiB0 |= UINT64_C( 0xC000000000000000 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isSigNaNA | isSigNaNB ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if ( isSigNaNA ) {
|
||||
if ( isSigNaNB ) goto returnLargerMag;
|
||||
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB;
|
||||
goto returnA;
|
||||
} else {
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA;
|
||||
goto returnB;
|
||||
}
|
||||
}
|
||||
returnLargerMag:
|
||||
uiMagA64 = uiA64 & 0x7FFF;
|
||||
uiMagB64 = uiB64 & 0x7FFF;
|
||||
if ( uiMagA64 < uiMagB64 ) goto returnB;
|
||||
if ( uiMagB64 < uiMagA64 ) goto returnA;
|
||||
if ( uiA0 < uiB0 ) goto returnB;
|
||||
if ( uiB0 < uiA0 ) goto returnA;
|
||||
if ( uiA64 < uiB64 ) goto returnA;
|
||||
returnB:
|
||||
uiZ.v64 = uiB64;
|
||||
uiZ.v0 = uiB0;
|
||||
return uiZ;
|
||||
returnA:
|
||||
uiZ.v64 = uiA64;
|
||||
uiZ.v0 = uiA0;
|
||||
return uiZ;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming at least one of the two 128-bit floating-point values pointed to by
|
||||
| `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location
|
||||
| pointed to by `zWPtr'. If either original floating-point value is a
|
||||
| signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr',
|
||||
| and `zWPtr' points to an array of four 32-bit elements that concatenate in
|
||||
| the platform's normal endian order to form a 128-bit floating-point value.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_propagateNaNF128M(
|
||||
const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
|
||||
{
|
||||
bool isSigNaNA;
|
||||
const uint32_t *ptr;
|
||||
bool isSigNaNB;
|
||||
uint32_t uiA96, uiB96, wordMagA, wordMagB;
|
||||
|
||||
isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr );
|
||||
ptr = aWPtr;
|
||||
if ( ! bWPtr ) {
|
||||
if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
goto copy;
|
||||
}
|
||||
isSigNaNB = f128M_isSignalingNaN( (const float128_t *) bWPtr );
|
||||
if ( isSigNaNA | isSigNaNB ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if ( isSigNaNA ) {
|
||||
if ( isSigNaNB ) goto returnLargerUIMag;
|
||||
if ( softfloat_isNaNF128M( bWPtr ) ) goto copyB;
|
||||
goto copy;
|
||||
} else {
|
||||
if ( softfloat_isNaNF128M( aWPtr ) ) goto copy;
|
||||
goto copyB;
|
||||
}
|
||||
}
|
||||
returnLargerUIMag:
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
wordMagA = uiA96 & 0x7FFFFFFF;
|
||||
wordMagB = uiB96 & 0x7FFFFFFF;
|
||||
if ( wordMagA < wordMagB ) goto copyB;
|
||||
if ( wordMagB < wordMagA ) goto copy;
|
||||
wordMagA = aWPtr[indexWord( 4, 2 )];
|
||||
wordMagB = bWPtr[indexWord( 4, 2 )];
|
||||
if ( wordMagA < wordMagB ) goto copyB;
|
||||
if ( wordMagB < wordMagA ) goto copy;
|
||||
wordMagA = aWPtr[indexWord( 4, 1 )];
|
||||
wordMagB = bWPtr[indexWord( 4, 1 )];
|
||||
if ( wordMagA < wordMagB ) goto copyB;
|
||||
if ( wordMagB < wordMagA ) goto copy;
|
||||
wordMagA = aWPtr[indexWord( 4, 0 )];
|
||||
wordMagB = bWPtr[indexWord( 4, 0 )];
|
||||
if ( wordMagA < wordMagB ) goto copyB;
|
||||
if ( wordMagB < wordMagA ) goto copy;
|
||||
if ( uiA96 < uiB96 ) goto copy;
|
||||
copyB:
|
||||
ptr = bWPtr;
|
||||
copy:
|
||||
zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000;
|
||||
zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )];
|
||||
zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )];
|
||||
zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )];
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting the unsigned integer formed from concatenating `uiA64' and
|
||||
| `uiA0' as a 128-bit floating-point value, and likewise interpreting the
|
||||
| unsigned integer formed from concatenating `uiB64' and `uiB0' as another
|
||||
| 128-bit floating-point value, and assuming at least on of these floating-
|
||||
| point values is a NaN, returns the bit pattern of the combined NaN result.
|
||||
| If either original floating-point value is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128
|
||||
softfloat_propagateNaNF128UI(
|
||||
uint_fast64_t uiA64,
|
||||
uint_fast64_t uiA0,
|
||||
uint_fast64_t uiB64,
|
||||
uint_fast64_t uiB0
|
||||
)
|
||||
{
|
||||
bool isSigNaNA, isSigNaNB;
|
||||
uint_fast64_t uiMagA64, uiMagB64;
|
||||
struct uint128 uiZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
|
||||
isSigNaNB = softfloat_isSigNaNF128UI( uiB64, uiB0 );
|
||||
/*------------------------------------------------------------------------
|
||||
| Make NaNs non-signaling.
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 |= UINT64_C( 0x0000800000000000 );
|
||||
uiB64 |= UINT64_C( 0x0000800000000000 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isSigNaNA | isSigNaNB ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if ( isSigNaNA ) {
|
||||
if ( isSigNaNB ) goto returnLargerMag;
|
||||
if ( isNaNF128UI( uiB64, uiB0 ) ) goto returnB;
|
||||
goto returnA;
|
||||
} else {
|
||||
if ( isNaNF128UI( uiA64, uiA0 ) ) goto returnA;
|
||||
goto returnB;
|
||||
}
|
||||
}
|
||||
returnLargerMag:
|
||||
uiMagA64 = uiA64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
|
||||
uiMagB64 = uiB64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
|
||||
if ( uiMagA64 < uiMagB64 ) goto returnB;
|
||||
if ( uiMagB64 < uiMagA64 ) goto returnA;
|
||||
if ( uiA0 < uiB0 ) goto returnB;
|
||||
if ( uiB0 < uiA0 ) goto returnA;
|
||||
if ( uiA64 < uiB64 ) goto returnA;
|
||||
returnB:
|
||||
uiZ.v64 = uiB64;
|
||||
uiZ.v0 = uiB0;
|
||||
return uiZ;
|
||||
returnA:
|
||||
uiZ.v64 = uiA64;
|
||||
uiZ.v0 = uiA0;
|
||||
return uiZ;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting `uiA' and `uiB' as the bit patterns of two 32-bit floating-
|
||||
| point values, at least one of which is a NaN, returns the bit pattern of
|
||||
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
||||
| signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast32_t
|
||||
softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB )
|
||||
{
|
||||
bool isSigNaNA, isSigNaNB;
|
||||
uint_fast32_t uiMagA, uiMagB;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
isSigNaNA = softfloat_isSigNaNF32UI( uiA );
|
||||
isSigNaNB = softfloat_isSigNaNF32UI( uiB );
|
||||
/*------------------------------------------------------------------------
|
||||
| Make NaNs non-signaling.
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA |= 0x00400000;
|
||||
uiB |= 0x00400000;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isSigNaNA | isSigNaNB ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if ( isSigNaNA ) {
|
||||
if ( isSigNaNB ) goto returnLargerMag;
|
||||
return isNaNF32UI( uiB ) ? uiB : uiA;
|
||||
} else {
|
||||
return isNaNF32UI( uiA ) ? uiA : uiB;
|
||||
}
|
||||
}
|
||||
returnLargerMag:
|
||||
uiMagA = uiA & 0x7FFFFFFF;
|
||||
uiMagB = uiB & 0x7FFFFFFF;
|
||||
if ( uiMagA < uiMagB ) return uiB;
|
||||
if ( uiMagB < uiMagA ) return uiA;
|
||||
return (uiA < uiB) ? uiA : uiB;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting `uiA' and `uiB' as the bit patterns of two 64-bit floating-
|
||||
| point values, at least one of which is a NaN, returns the bit pattern of
|
||||
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
||||
| signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast64_t
|
||||
softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB )
|
||||
{
|
||||
bool isSigNaNA, isSigNaNB;
|
||||
uint_fast64_t uiMagA, uiMagB;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
isSigNaNA = softfloat_isSigNaNF64UI( uiA );
|
||||
isSigNaNB = softfloat_isSigNaNF64UI( uiB );
|
||||
/*------------------------------------------------------------------------
|
||||
| Make NaNs non-signaling.
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA |= UINT64_C( 0x0008000000000000 );
|
||||
uiB |= UINT64_C( 0x0008000000000000 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isSigNaNA | isSigNaNB ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if ( isSigNaNA ) {
|
||||
if ( isSigNaNB ) goto returnLargerMag;
|
||||
return isNaNF64UI( uiB ) ? uiB : uiA;
|
||||
} else {
|
||||
return isNaNF64UI( uiA ) ? uiA : uiB;
|
||||
}
|
||||
}
|
||||
returnLargerMag:
|
||||
uiMagA = uiA & UINT64_C( 0x7FFFFFFFFFFFFFFF );
|
||||
uiMagB = uiB & UINT64_C( 0x7FFFFFFFFFFFFFFF );
|
||||
if ( uiMagA < uiMagB ) return uiB;
|
||||
if ( uiMagB < uiMagA ) return uiA;
|
||||
return (uiA < uiB) ? uiA : uiB;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include "platform.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Raises the exceptions specified by `flags'. Floating-point traps can be
|
||||
| defined here if desired. It is currently not possible for such a trap
|
||||
| to substitute a result value. If traps are not implemented, this routine
|
||||
| should be simply `softfloat_exceptionFlags |= flags;'.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void softfloat_raiseFlags( uint_fast8_t flags )
|
||||
{
|
||||
|
||||
softfloat_exceptionFlags |= flags;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,315 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#ifndef specialize_h
|
||||
#define specialize_h 1
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "softfloat_types.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Default value for `softfloat_detectTininess'.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define init_detectTininess softfloat_tininess_afterRounding;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| "Common NaN" structure, used to transfer NaN representations from one format
|
||||
| to another.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct commonNaN {
|
||||
bool sign;
|
||||
#ifdef LITTLEENDIAN
|
||||
uint64_t v0, v64;
|
||||
#else
|
||||
uint64_t v64, v0;
|
||||
#endif
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The bit pattern for a default generated 32-bit floating-point NaN.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define defaultNaNF32UI 0xFFC00000
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns true when 32-bit unsigned integer `uiA' has the bit pattern of a
|
||||
| 32-bit floating-point signaling NaN.
|
||||
| Note: This macro evaluates its argument more than once.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define softfloat_isSigNaNF32UI( uiA ) ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts
|
||||
| this NaN to the common NaN form, and stores the resulting common NaN at the
|
||||
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
|
||||
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting `uiA' and `uiB' as the bit patterns of two 32-bit floating-
|
||||
| point values, at least one of which is a NaN, returns the bit pattern of
|
||||
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
||||
| signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast32_t
|
||||
softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The bit pattern for a default generated 64-bit floating-point NaN.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define defaultNaNF64UI UINT64_C( 0xFFF8000000000000 )
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns true when 64-bit unsigned integer `uiA' has the bit pattern of a
|
||||
| 64-bit floating-point signaling NaN.
|
||||
| Note: This macro evaluates its argument more than once.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define softfloat_isSigNaNF64UI( uiA ) ((((uiA) & UINT64_C( 0x7FF8000000000000 )) == UINT64_C( 0x7FF0000000000000 )) && ((uiA) & UINT64_C( 0x0007FFFFFFFFFFFF )))
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts
|
||||
| this NaN to the common NaN form, and stores the resulting common NaN at the
|
||||
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point
|
||||
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting `uiA' and `uiB' as the bit patterns of two 64-bit floating-
|
||||
| point values, at least one of which is a NaN, returns the bit pattern of
|
||||
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
||||
| signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
uint_fast64_t
|
||||
softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The bit pattern for a default generated 80-bit extended floating-point NaN.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define defaultNaNExtF80UI64 0xFFFF
|
||||
#define defaultNaNExtF80UI0 UINT64_C( 0xC000000000000000 )
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns true when the 80-bit unsigned integer formed from concatenating
|
||||
| 16-bit `uiA64' and 64-bit `uiA0' has the bit pattern of an 80-bit extended
|
||||
| floating-point signaling NaN.
|
||||
| Note: This macro evaluates its arguments more than once.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ((((uiA64) & 0x7FFF) == 0x7FFF) && ! ((uiA0) & UINT64_C( 0x4000000000000000 )) && ((uiA0) & UINT64_C( 0x3FFFFFFFFFFFFFFF )))
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The following functions are needed only when `SOFTFLOAT_FAST_INT64' is
|
||||
| defined.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
||||
| has the bit pattern of an 80-bit extended floating-point NaN, converts
|
||||
| this NaN to the common NaN form, and stores the resulting common NaN at the
|
||||
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_extF80UIToCommonNaN(
|
||||
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended
|
||||
| floating-point NaN, and returns the bit pattern of this value as an unsigned
|
||||
| integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting the unsigned integer formed from concatenating `uiA64' and
|
||||
| `uiA0' as an 80-bit extended floating-point value, and likewise interpreting
|
||||
| the unsigned integer formed from concatenating `uiB64' and `uiB0' as another
|
||||
| 80-bit extended floating-point value, and assuming at least on of these
|
||||
| floating-point values is a NaN, returns the bit pattern of the combined NaN
|
||||
| result. If either original floating-point value is a signaling NaN, the
|
||||
| invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128
|
||||
softfloat_propagateNaNExtF80UI(
|
||||
uint_fast16_t uiA64,
|
||||
uint_fast64_t uiA0,
|
||||
uint_fast16_t uiB64,
|
||||
uint_fast64_t uiB0
|
||||
);
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The bit pattern for a default generated 128-bit floating-point NaN.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define defaultNaNF128UI64 UINT64_C( 0xFFFF800000000000 )
|
||||
#define defaultNaNF128UI0 UINT64_C( 0 )
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns true when the 128-bit unsigned integer formed from concatenating
|
||||
| 64-bit `uiA64' and 64-bit `uiA0' has the bit pattern of a 128-bit floating-
|
||||
| point signaling NaN.
|
||||
| Note: This macro evaluates its arguments more than once.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
||||
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
|
||||
| the common NaN form, and stores the resulting common NaN at the location
|
||||
| pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception
|
||||
| is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_f128UIToCommonNaN(
|
||||
uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
|
||||
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN * );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Interpreting the unsigned integer formed from concatenating `uiA64' and
|
||||
| `uiA0' as a 128-bit floating-point value, and likewise interpreting the
|
||||
| unsigned integer formed from concatenating `uiB64' and `uiB0' as another
|
||||
| 128-bit floating-point value, and assuming at least on of these floating-
|
||||
| point values is a NaN, returns the bit pattern of the combined NaN result.
|
||||
| If either original floating-point value is a signaling NaN, the invalid
|
||||
| exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
struct uint128
|
||||
softfloat_propagateNaNF128UI(
|
||||
uint_fast64_t uiA64,
|
||||
uint_fast64_t uiA0,
|
||||
uint_fast64_t uiB64,
|
||||
uint_fast64_t uiB0
|
||||
);
|
||||
|
||||
#else
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The following functions are needed only when `SOFTFLOAT_FAST_INT64' is not
|
||||
| defined.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is
|
||||
| a NaN, converts this NaN to the common NaN form, and stores the resulting
|
||||
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
|
||||
| NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_extF80MToCommonNaN(
|
||||
const struct extFloat80M *aSPtr, struct commonNaN *zPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended
|
||||
| floating-point NaN, and stores this NaN at the location pointed to by
|
||||
| `zSPtr'.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_commonNaNToExtF80M(
|
||||
const struct commonNaN *aPtr, struct extFloat80M *zSPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming at least one of the two 80-bit extended floating-point values
|
||||
| pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result
|
||||
| at the location pointed to by `zSPtr'. If either original floating-point
|
||||
| value is a signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_propagateNaNExtF80M(
|
||||
const struct extFloat80M *aSPtr,
|
||||
const struct extFloat80M *bSPtr,
|
||||
struct extFloat80M *zSPtr
|
||||
);
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The bit pattern for a default generated 128-bit floating-point NaN.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#define defaultNaNF128UI96 0xFFFF8000
|
||||
#define defaultNaNF128UI64 0
|
||||
#define defaultNaNF128UI32 0
|
||||
#define defaultNaNF128UI0 0
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN,
|
||||
| converts this NaN to the common NaN form, and stores the resulting common
|
||||
| NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN,
|
||||
| the invalid exception is raised. Argument `aWPtr' points to an array of
|
||||
| four 32-bit elements that concatenate in the platform's normal endian order
|
||||
| to form a 128-bit floating-point value.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
|
||||
| NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument
|
||||
| `zWPtr' points to an array of four 32-bit elements that concatenate in the
|
||||
| platform's normal endian order to form a 128-bit floating-point value.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Assuming at least one of the two 128-bit floating-point values pointed to by
|
||||
| `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location
|
||||
| pointed to by `zWPtr'. If either original floating-point value is a
|
||||
| signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr',
|
||||
| and `zWPtr' points to an array of four 32-bit elements that concatenate in
|
||||
| the platform's normal endian order to form a 128-bit floating-point value.
|
||||
*----------------------------------------------------------------------------*/
|
||||
void
|
||||
softfloat_propagateNaNF128M(
|
||||
const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr );
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
extF80M_add(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signB;
|
||||
extFloat80_t
|
||||
(*magsFuncPtr)(
|
||||
uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
||||
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
magsFuncPtr =
|
||||
(signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80;
|
||||
*zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
extF80M_add(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
|
||||
softfloat_addExtF80M(
|
||||
(const struct extFloat80M *) aPtr,
|
||||
(const struct extFloat80M *) bPtr,
|
||||
(struct extFloat80M *) zPtr,
|
||||
false
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,191 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
extF80M_div(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = extF80_div( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
extF80M_div(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
struct extFloat80M *zSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t expA;
|
||||
uint_fast16_t uiB64;
|
||||
int32_t expB;
|
||||
bool signZ;
|
||||
uint64_t sigA, x64;
|
||||
int32_t expZ;
|
||||
int shiftCount;
|
||||
uint32_t y[3], recip32, sigB[3];
|
||||
int ix;
|
||||
uint32_t q, qs[2];
|
||||
uint_fast16_t uiZ64;
|
||||
uint64_t uiZ0;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
zSPtr = (struct extFloat80M *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
uiB64 = bSPtr->signExp;
|
||||
expB = expExtF80UI64( uiB64 );
|
||||
signZ = signExtF80UI64( uiA64 ) ^ signExtF80UI64( uiB64 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
||||
if ( softfloat_tryPropagateNaNExtF80M( aSPtr, bSPtr, zSPtr ) ) return;
|
||||
if ( expA == 0x7FFF ) {
|
||||
if ( expB == 0x7FFF ) goto invalid;
|
||||
goto infinity;
|
||||
}
|
||||
goto zero;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
sigA = aSPtr->signif;
|
||||
x64 = bSPtr->signif;
|
||||
if ( ! expB ) expB = 1;
|
||||
if ( ! (x64 & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! x64 ) {
|
||||
if ( ! sigA ) goto invalid;
|
||||
softfloat_raiseFlags( softfloat_flag_infinite );
|
||||
goto infinity;
|
||||
}
|
||||
expB += softfloat_normExtF80SigM( &x64 );
|
||||
}
|
||||
if ( ! expA ) expA = 1;
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigA ) goto zero;
|
||||
expA += softfloat_normExtF80SigM( &sigA );
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = expA - expB + 0x3FFF;
|
||||
shiftCount = 29;
|
||||
if ( sigA < x64 ) {
|
||||
--expZ;
|
||||
shiftCount = 30;
|
||||
}
|
||||
softfloat_shortShiftLeft64To96M( sigA, shiftCount, y );
|
||||
recip32 = softfloat_approxRecip32_1( x64>>32 );
|
||||
sigB[indexWord( 3, 0 )] = (uint32_t) x64<<30;
|
||||
x64 >>= 2;
|
||||
sigB[indexWord( 3, 2 )] = x64>>32;
|
||||
sigB[indexWord( 3, 1 )] = x64;
|
||||
ix = 2;
|
||||
for (;;) {
|
||||
x64 = (uint64_t) y[indexWordHi( 3 )] * recip32;
|
||||
q = (x64 + 0x80000000)>>32;
|
||||
--ix;
|
||||
if ( ix < 0 ) break;
|
||||
softfloat_remStep96MBy32( y, 29, sigB, q, y );
|
||||
if ( y[indexWordHi( 3 )] & 0x80000000 ) {
|
||||
--q;
|
||||
softfloat_add96M( y, sigB, y );
|
||||
}
|
||||
qs[ix] = q;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ((q + 1) & 0x3FFFFF) < 2 ) {
|
||||
softfloat_remStep96MBy32( y, 29, sigB, q, y );
|
||||
if ( y[indexWordHi( 3 )] & 0x80000000 ) {
|
||||
--q;
|
||||
softfloat_add96M( y, sigB, y );
|
||||
} else if ( softfloat_compare96M( sigB, y ) <= 0 ) {
|
||||
++q;
|
||||
softfloat_sub96M( y, sigB, y );
|
||||
}
|
||||
if (
|
||||
y[indexWordLo( 3 )] || y[indexWord( 3, 1 )] || y[indexWord( 3, 2 )]
|
||||
) {
|
||||
q |= 1;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
x64 = (uint64_t) q<<9;
|
||||
y[indexWord( 3, 0 )] = x64;
|
||||
x64 = ((uint64_t) qs[0]<<6) + (x64>>32);
|
||||
y[indexWord( 3, 1 )] = x64;
|
||||
y[indexWord( 3, 2 )] = (qs[1]<<3) + (x64>>32);
|
||||
softfloat_roundPackMToExtF80M(
|
||||
signZ, expZ, y, extF80_roundingPrecision, zSPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_invalidExtF80M( zSPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
infinity:
|
||||
uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
||||
uiZ0 = UINT64_C( 0x8000000000000000 );
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zero:
|
||||
uiZ64 = packToExtF80UI64( signZ, 0 );
|
||||
uiZ0 = 0;
|
||||
uiZ:
|
||||
zSPtr->signExp = uiZ64;
|
||||
zSPtr->signif = uiZ0;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool extF80M_eq( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
|
||||
return extF80_eq( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool extF80M_eq( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint64_t uiA0;
|
||||
uint_fast16_t uiB64;
|
||||
uint64_t uiB0;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
if (
|
||||
softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
||||
|| softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( uiA0 == uiB0 ) {
|
||||
return (uiA64 == uiB64) || ! uiA0;
|
||||
} else {
|
||||
if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
||||
return ! softfloat_compareNonnormExtF80M( aSPtr, bSPtr );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool extF80M_eq_signaling( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
|
||||
return extF80_eq_signaling( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool extF80M_eq_signaling( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint64_t uiA0;
|
||||
uint_fast16_t uiB64;
|
||||
uint64_t uiB0;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( uiA0 == uiB0 ) {
|
||||
return (uiA64 == uiB64) || ! uiA0;
|
||||
} else {
|
||||
if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
||||
return ! softfloat_compareNonnormExtF80M( aSPtr, bSPtr );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,103 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool extF80M_le( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
|
||||
return extF80_le( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool extF80M_le( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint64_t uiA0;
|
||||
uint_fast16_t uiB64;
|
||||
uint64_t uiB0;
|
||||
bool signA, ltMags;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are different.
|
||||
*--------------------------------------------------------------------*/
|
||||
return signA || ! (uiA0 | uiB0);
|
||||
} else {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are the same.
|
||||
*--------------------------------------------------------------------*/
|
||||
if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
||||
return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) <= 0);
|
||||
}
|
||||
if ( uiA64 == uiB64 ) {
|
||||
if ( uiA0 == uiB0 ) return true;
|
||||
ltMags = (uiA0 < uiB0);
|
||||
} else {
|
||||
ltMags = (uiA64 < uiB64);
|
||||
}
|
||||
return signA ^ ltMags;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool extF80M_le_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
|
||||
return extF80_le_quiet( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool extF80M_le_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint64_t uiA0;
|
||||
uint_fast16_t uiB64;
|
||||
uint64_t uiB0;
|
||||
bool signA, ltMags;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
if (
|
||||
softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
||||
|| softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are different.
|
||||
*--------------------------------------------------------------------*/
|
||||
return signA || ! (uiA0 | uiB0);
|
||||
} else {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are the same.
|
||||
*--------------------------------------------------------------------*/
|
||||
if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
||||
return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) <= 0);
|
||||
}
|
||||
if ( uiA64 == uiB64 ) {
|
||||
if ( uiA0 == uiB0 ) return true;
|
||||
ltMags = (uiA0 < uiB0);
|
||||
} else {
|
||||
ltMags = (uiA64 < uiB64);
|
||||
}
|
||||
return signA ^ ltMags;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,103 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool extF80M_lt( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
|
||||
return extF80_lt( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool extF80M_lt( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint64_t uiA0;
|
||||
uint_fast16_t uiB64;
|
||||
uint64_t uiB0;
|
||||
bool signA, ltMags;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are different.
|
||||
*--------------------------------------------------------------------*/
|
||||
return signA && ((uiA0 | uiB0) != 0);
|
||||
} else {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are the same.
|
||||
*--------------------------------------------------------------------*/
|
||||
if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
||||
return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) < 0);
|
||||
}
|
||||
if ( uiA64 == uiB64 ) {
|
||||
if ( uiA0 == uiB0 ) return false;
|
||||
ltMags = (uiA0 < uiB0);
|
||||
} else {
|
||||
ltMags = (uiA64 < uiB64);
|
||||
}
|
||||
return signA ^ ltMags;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool extF80M_lt_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
|
||||
return extF80_lt_quiet( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool extF80M_lt_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint64_t uiA0;
|
||||
uint_fast16_t uiB64;
|
||||
uint64_t uiB0;
|
||||
bool signA, ltMags;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
if (
|
||||
softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
||||
|| softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are different.
|
||||
*--------------------------------------------------------------------*/
|
||||
return signA && ((uiA0 | uiB0) != 0);
|
||||
} else {
|
||||
/*--------------------------------------------------------------------
|
||||
| Signs are the same.
|
||||
*--------------------------------------------------------------------*/
|
||||
if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
||||
return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) < 0);
|
||||
}
|
||||
if ( uiA64 == uiB64 ) {
|
||||
if ( uiA0 == uiB0 ) return false;
|
||||
ltMags = (uiA0 < uiB0);
|
||||
} else {
|
||||
ltMags = (uiA64 < uiB64);
|
||||
}
|
||||
return signA ^ ltMags;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,136 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
extF80M_mul(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = extF80_mul( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
extF80M_mul(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
struct extFloat80M *zSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t expA;
|
||||
uint_fast16_t uiB64;
|
||||
int32_t expB;
|
||||
bool signZ;
|
||||
uint_fast16_t exp, uiZ64;
|
||||
uint64_t uiZ0, sigA, sigB;
|
||||
int32_t expZ;
|
||||
uint32_t sigProd[4], *extSigZPtr;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
zSPtr = (struct extFloat80M *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
uiB64 = bSPtr->signExp;
|
||||
expB = expExtF80UI64( uiB64 );
|
||||
signZ = signExtF80UI64( uiA64 ) ^ signExtF80UI64( uiB64 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
||||
if ( softfloat_tryPropagateNaNExtF80M( aSPtr, bSPtr, zSPtr ) ) return;
|
||||
if (
|
||||
(! aSPtr->signif && (expA != 0x7FFF))
|
||||
|| (! bSPtr->signif && (expB != 0x7FFF))
|
||||
) {
|
||||
softfloat_invalidExtF80M( zSPtr );
|
||||
return;
|
||||
}
|
||||
uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
||||
uiZ0 = UINT64_C( 0x8000000000000000 );
|
||||
goto uiZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! expA ) expA = 1;
|
||||
sigA = aSPtr->signif;
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigA ) goto zero;
|
||||
expA += softfloat_normExtF80SigM( &sigA );
|
||||
}
|
||||
if ( ! expB ) expB = 1;
|
||||
sigB = bSPtr->signif;
|
||||
if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigB ) goto zero;
|
||||
expB += softfloat_normExtF80SigM( &sigB );
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = expA + expB - 0x3FFE;
|
||||
softfloat_mul64To128M( sigA, sigB, sigProd );
|
||||
if ( sigProd[indexWordLo( 4 )] ) sigProd[indexWord( 4, 1 )] |= 1;
|
||||
extSigZPtr = &sigProd[indexMultiwordHi( 4, 3 )];
|
||||
if ( sigProd[indexWordHi( 4 )] < 0x80000000 ) {
|
||||
--expZ;
|
||||
softfloat_add96M( extSigZPtr, extSigZPtr, extSigZPtr );
|
||||
}
|
||||
softfloat_roundPackMToExtF80M(
|
||||
signZ, expZ, extSigZPtr, extF80_roundingPrecision, zSPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zero:
|
||||
uiZ64 = packToExtF80UI64( signZ, 0 );
|
||||
uiZ0 = 0;
|
||||
uiZ:
|
||||
zSPtr->signExp = uiZ64;
|
||||
zSPtr->signif = uiZ0;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,201 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
extF80M_rem(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = extF80_rem( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
extF80M_rem(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
struct extFloat80M *zSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t expA, expB;
|
||||
uint64_t x64;
|
||||
bool signRem;
|
||||
uint64_t sigA;
|
||||
int32_t expDiff;
|
||||
uint32_t rem[3], x[3], sig32B, q, recip32, rem2[3], *remPtr, *altRemPtr;
|
||||
uint32_t *newRemPtr, wordMeanRem;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
zSPtr = (struct extFloat80M *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
expB = expExtF80UI64( bSPtr->signExp );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
||||
if ( softfloat_tryPropagateNaNExtF80M( aSPtr, bSPtr, zSPtr ) ) return;
|
||||
if ( expA == 0x7FFF ) goto invalid;
|
||||
/*--------------------------------------------------------------------
|
||||
| If we get here, then argument b is an infinity and `expB' is 0x7FFF;
|
||||
| Doubling `expB' is an easy way to ensure that `expDiff' later is
|
||||
| less than -1, which will result in returning a canonicalized version
|
||||
| of argument a.
|
||||
*--------------------------------------------------------------------*/
|
||||
expB += expB;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! expB ) expB = 1;
|
||||
x64 = bSPtr->signif;
|
||||
if ( ! (x64 & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! x64 ) goto invalid;
|
||||
expB += softfloat_normExtF80SigM( &x64 );
|
||||
}
|
||||
signRem = signExtF80UI64( uiA64 );
|
||||
if ( ! expA ) expA = 1;
|
||||
sigA = aSPtr->signif;
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigA ) {
|
||||
expA = 0;
|
||||
goto copyA;
|
||||
}
|
||||
expA += softfloat_normExtF80SigM( &sigA );
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expDiff = expA - expB;
|
||||
if ( expDiff < -1 ) goto copyA;
|
||||
rem[indexWord( 3, 2 )] = sigA>>34;
|
||||
rem[indexWord( 3, 1 )] = sigA>>2;
|
||||
rem[indexWord( 3, 0 )] = (uint32_t) sigA<<30;
|
||||
x[indexWord( 3, 0 )] = (uint32_t) x64<<30;
|
||||
sig32B = x64>>32;
|
||||
x64 >>= 2;
|
||||
x[indexWord( 3, 2 )] = x64>>32;
|
||||
x[indexWord( 3, 1 )] = x64;
|
||||
if ( expDiff < 1 ) {
|
||||
if ( expDiff ) {
|
||||
--expB;
|
||||
softfloat_add96M( x, x, x );
|
||||
q = 0;
|
||||
} else {
|
||||
q = (softfloat_compare96M( x, rem ) <= 0);
|
||||
if ( q ) softfloat_sub96M( rem, x, rem );
|
||||
}
|
||||
} else {
|
||||
recip32 = softfloat_approxRecip32_1( sig32B );
|
||||
expDiff -= 30;
|
||||
for (;;) {
|
||||
x64 = (uint64_t) rem[indexWordHi( 3 )] * recip32;
|
||||
if ( expDiff < 0 ) break;
|
||||
q = (x64 + 0x80000000)>>32;
|
||||
softfloat_remStep96MBy32( rem, 29, x, q, rem );
|
||||
if ( rem[indexWordHi( 3 )] & 0x80000000 ) {
|
||||
softfloat_add96M( rem, x, rem );
|
||||
}
|
||||
expDiff -= 29;
|
||||
}
|
||||
/*--------------------------------------------------------------------
|
||||
| (`expDiff' cannot be less than -29 here.)
|
||||
*--------------------------------------------------------------------*/
|
||||
q = (uint32_t) (x64>>32)>>(~expDiff & 31);
|
||||
softfloat_remStep96MBy32( rem, expDiff + 30, x, q, rem );
|
||||
if ( rem[indexWordHi( 3 )] & 0x80000000 ) {
|
||||
remPtr = rem;
|
||||
altRemPtr = rem2;
|
||||
softfloat_add96M( remPtr, x, altRemPtr );
|
||||
goto selectRem;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
remPtr = rem;
|
||||
altRemPtr = rem2;
|
||||
do {
|
||||
++q;
|
||||
newRemPtr = altRemPtr;
|
||||
softfloat_sub96M( remPtr, x, newRemPtr );
|
||||
altRemPtr = remPtr;
|
||||
remPtr = newRemPtr;
|
||||
} while ( ! (remPtr[indexWordHi( 3 )] & 0x80000000) );
|
||||
selectRem:
|
||||
softfloat_add96M( remPtr, altRemPtr, x );
|
||||
wordMeanRem = x[indexWordHi( 3 )];
|
||||
if (
|
||||
(wordMeanRem & 0x80000000)
|
||||
|| (! wordMeanRem && (q & 1) && ! x[indexWord( 3, 0 )]
|
||||
&& ! x[indexWord( 3, 1 )])
|
||||
) {
|
||||
remPtr = altRemPtr;
|
||||
}
|
||||
if ( remPtr[indexWordHi( 3 )] & 0x80000000 ) {
|
||||
signRem = ! signRem;
|
||||
softfloat_negX96M( remPtr );
|
||||
}
|
||||
softfloat_normRoundPackMToExtF80M( signRem, expB + 2, remPtr, 80, zSPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_invalidExtF80M( zSPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
copyA:
|
||||
if ( expA < 1 ) {
|
||||
sigA >>= 1 - expA;
|
||||
expA = 0;
|
||||
}
|
||||
zSPtr->signExp = packToExtF80UI64( signRem, expA );
|
||||
zSPtr->signif = sigA;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,166 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
extF80M_roundToInt(
|
||||
const extFloat80_t *aPtr,
|
||||
uint_fast8_t roundingMode,
|
||||
bool exact,
|
||||
extFloat80_t *zPtr
|
||||
)
|
||||
{
|
||||
|
||||
*zPtr = extF80_roundToInt( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
extF80M_roundToInt(
|
||||
const extFloat80_t *aPtr,
|
||||
uint_fast8_t roundingMode,
|
||||
bool exact,
|
||||
extFloat80_t *zPtr
|
||||
)
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
struct extFloat80M *zSPtr;
|
||||
uint_fast16_t uiA64, signUI64;
|
||||
int32_t exp;
|
||||
uint64_t sigA;
|
||||
uint_fast16_t uiZ64;
|
||||
uint64_t sigZ, lastBitMask, roundBitsMask;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
zSPtr = (struct extFloat80M *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
signUI64 = uiA64 & packToExtF80UI64( 1, 0 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sigA = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) {
|
||||
if ( ! sigA ) {
|
||||
uiZ64 = signUI64;
|
||||
sigZ = 0;
|
||||
goto uiZ;
|
||||
}
|
||||
exp += softfloat_normExtF80SigM( &sigA );
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( exp <= 0x3FFE ) {
|
||||
if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
switch ( roundingMode ) {
|
||||
case softfloat_round_near_even:
|
||||
if ( ! (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break;
|
||||
case softfloat_round_near_maxMag:
|
||||
if ( exp == 0x3FFE ) goto mag1;
|
||||
break;
|
||||
case softfloat_round_min:
|
||||
if ( signUI64 ) goto mag1;
|
||||
break;
|
||||
case softfloat_round_max:
|
||||
if ( ! signUI64 ) goto mag1;
|
||||
break;
|
||||
}
|
||||
uiZ64 = signUI64;
|
||||
sigZ = 0;
|
||||
goto uiZ;
|
||||
mag1:
|
||||
uiZ64 = signUI64 | 0x3FFF;
|
||||
sigZ = UINT64_C( 0x8000000000000000 );
|
||||
goto uiZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( 0x403E <= exp ) {
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
softfloat_propagateNaNExtF80M( aSPtr, 0, zSPtr );
|
||||
return;
|
||||
}
|
||||
sigZ = UINT64_C( 0x8000000000000000 );
|
||||
} else {
|
||||
sigZ = sigA;
|
||||
}
|
||||
uiZ64 = signUI64 | exp;
|
||||
goto uiZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiZ64 = signUI64 | exp;
|
||||
lastBitMask = (uint64_t) 1<<(0x403E - exp);
|
||||
roundBitsMask = lastBitMask - 1;
|
||||
sigZ = sigA;
|
||||
if ( roundingMode == softfloat_round_near_maxMag ) {
|
||||
sigZ += lastBitMask>>1;
|
||||
} else if ( roundingMode == softfloat_round_near_even ) {
|
||||
sigZ += lastBitMask>>1;
|
||||
if ( ! (sigZ & roundBitsMask) ) sigZ &= ~lastBitMask;
|
||||
} else if ( roundingMode != softfloat_round_minMag ) {
|
||||
if ( (signUI64 != 0) ^ (roundingMode == softfloat_round_max) ) {
|
||||
sigZ += roundBitsMask;
|
||||
}
|
||||
}
|
||||
sigZ &= ~roundBitsMask;
|
||||
if ( ! sigZ ) {
|
||||
++uiZ64;
|
||||
sigZ = UINT64_C( 0x8000000000000000 );
|
||||
}
|
||||
if ( exact && (sigZ != sigA) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
uiZ:
|
||||
zSPtr->signExp = uiZ64;
|
||||
zSPtr->signif = sigZ;
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void extF80M_sqrt( const extFloat80_t *aPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = extF80_sqrt( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void extF80M_sqrt( const extFloat80_t *aPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
struct extFloat80M *zSPtr;
|
||||
uint_fast16_t uiA64, signUI64;
|
||||
int32_t expA;
|
||||
uint64_t rem64;
|
||||
int32_t expZ;
|
||||
uint32_t rem[4], sig32A, recipSqrt32, sig32Z, q;
|
||||
uint64_t sig64Z, x64;
|
||||
uint32_t term[4], extSigZ[3];
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
zSPtr = (struct extFloat80M *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
signUI64 = uiA64 & packToExtF80UI64( 1, 0 );
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
rem64 = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( expA == 0x7FFF ) {
|
||||
if ( rem64 & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
softfloat_propagateNaNExtF80M( aSPtr, 0, zSPtr );
|
||||
return;
|
||||
}
|
||||
if ( signUI64 ) goto invalid;
|
||||
rem64 = UINT64_C( 0x8000000000000000 );
|
||||
goto copyA;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! expA ) expA = 1;
|
||||
if ( ! (rem64 & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! rem64 ) {
|
||||
uiA64 = signUI64;
|
||||
goto copyA;
|
||||
}
|
||||
expA += softfloat_normExtF80SigM( &rem64 );
|
||||
}
|
||||
if ( signUI64 ) goto invalid;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = ((expA - 0x3FFF)>>1) + 0x3FFF;
|
||||
expA &= 1;
|
||||
softfloat_shortShiftLeft64To96M(
|
||||
rem64, 30 - expA, &rem[indexMultiwordHi( 4, 3 )] );
|
||||
sig32A = rem64>>32;
|
||||
recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
||||
sig32Z = ((uint64_t) sig32A * recipSqrt32)>>32;
|
||||
if ( expA ) sig32Z >>= 1;
|
||||
rem64 =
|
||||
((uint64_t) rem[indexWord( 4, 3 )]<<32 | rem[indexWord( 4, 2 )])
|
||||
- (uint64_t) sig32Z * sig32Z;
|
||||
rem[indexWord( 4, 3 )] = rem64>>32;
|
||||
rem[indexWord( 4, 2 )] = rem64;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q = ((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32;
|
||||
sig64Z = ((uint64_t) sig32Z<<32) + ((uint64_t) q<<3);
|
||||
x64 = ((uint64_t) sig32Z<<32) + sig64Z;
|
||||
term[indexWord( 3, 2 )] = 0;
|
||||
term[indexWord( 3, 1 )] = x64>>32;
|
||||
term[indexWord( 3, 0 )] = x64;
|
||||
softfloat_remStep96MBy32(
|
||||
&rem[indexMultiwordHi( 4, 3 )],
|
||||
29,
|
||||
term,
|
||||
q,
|
||||
&rem[indexMultiwordHi( 4, 3 )]
|
||||
);
|
||||
rem64 = (uint64_t) rem[indexWord( 4, 3 )]<<32 | rem[indexWord( 4, 2 )];
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q = (((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32) + 2;
|
||||
x64 = (uint64_t) q<<7;
|
||||
extSigZ[indexWord( 3, 0 )] = x64;
|
||||
x64 = (sig64Z<<1) + (x64>>32);
|
||||
extSigZ[indexWord( 3, 2 )] = x64>>32;
|
||||
extSigZ[indexWord( 3, 1 )] = x64;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (q & 0xFFFFFF) <= 2 ) {
|
||||
q &= ~0xFFFF;
|
||||
extSigZ[indexWordLo( 3 )] = q<<7;
|
||||
x64 = sig64Z + (q>>27);
|
||||
term[indexWord( 4, 3 )] = 0;
|
||||
term[indexWord( 4, 2 )] = x64>>32;
|
||||
term[indexWord( 4, 1 )] = x64;
|
||||
term[indexWord( 4, 0 )] = q<<5;
|
||||
rem[indexWord( 4, 0 )] = 0;
|
||||
softfloat_remStep128MBy32( rem, 28, term, q, rem );
|
||||
q = rem[indexWordHi( 4 )];
|
||||
if ( q & 0x80000000 ) {
|
||||
softfloat_sub1X96M( extSigZ );
|
||||
} else {
|
||||
if ( q || rem[indexWord( 4, 1 )] || rem[indexWord( 4, 2 )] ) {
|
||||
extSigZ[indexWordLo( 3 )] |= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
softfloat_roundPackMToExtF80M(
|
||||
0, expZ, extSigZ, extF80_roundingPrecision, zSPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_invalidExtF80M( zSPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
copyA:
|
||||
zSPtr->signExp = uiA64;
|
||||
zSPtr->signif = rem64;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
extF80M_sub(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr, *bSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signB;
|
||||
extFloat80_t
|
||||
(*magsFuncPtr)(
|
||||
uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
||||
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
bSPtr = (const struct extFloat80M *) bPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
uiA0 = aSPtr->signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
uiB64 = bSPtr->signExp;
|
||||
uiB0 = bSPtr->signif;
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
magsFuncPtr =
|
||||
(signA == signB) ? softfloat_subMagsExtF80 : softfloat_addMagsExtF80;
|
||||
*zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
extF80M_sub(
|
||||
const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
|
||||
softfloat_addExtF80M(
|
||||
(const struct extFloat80M *) aPtr,
|
||||
(const struct extFloat80M *) bPtr,
|
||||
(struct extFloat80M *) zPtr,
|
||||
true
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void extF80M_to_f128M( const extFloat80_t *aPtr, float128_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = extF80_to_f128( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void extF80M_to_f128M( const extFloat80_t *aPtr, float128_t *zPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint32_t *zWPtr;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
struct commonNaN commonNaN;
|
||||
uint32_t uiZ96;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
zWPtr = (uint32_t *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA64 = aSPtr->signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zWPtr[indexWord( 4, 0 )] = 0;
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
|
||||
softfloat_commonNaNToF128M( &commonNaN, zWPtr );
|
||||
return;
|
||||
}
|
||||
uiZ96 = packToF128UI96( sign, 0x7FFF, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( exp ) --exp;
|
||||
if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sig ) {
|
||||
uiZ96 = packToF128UI96( sign, 0, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
exp += softfloat_normExtF80SigM( &sig );
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zWPtr[indexWord( 4, 1 )] = (uint32_t) sig<<17;
|
||||
sig >>= 15;
|
||||
zWPtr[indexWord( 4, 2 )] = sig;
|
||||
if ( exp < 0 ) {
|
||||
zWPtr[indexWordHi( 4 )] = sig>>32;
|
||||
softfloat_shiftRight96M(
|
||||
&zWPtr[indexMultiwordHi( 4, 3 )],
|
||||
-exp,
|
||||
&zWPtr[indexMultiwordHi( 4, 3 )]
|
||||
);
|
||||
exp = 0;
|
||||
sig = (uint64_t) zWPtr[indexWordHi( 4 )]<<32;
|
||||
}
|
||||
zWPtr[indexWordHi( 4 )] = packToF128UI96( sign, exp, sig>>32 );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiZ:
|
||||
zWPtr[indexWord( 4, 3 )] = uiZ96;
|
||||
zWPtr[indexWord( 4, 2 )] = 0;
|
||||
zWPtr[indexWord( 4, 1 )] = 0;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
float32_t extF80M_to_f32( const extFloat80_t *aPtr )
|
||||
{
|
||||
|
||||
return extF80_to_f32( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
float32_t extF80M_to_f32( const extFloat80_t *aPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
struct commonNaN commonNaN;
|
||||
uint32_t uiZ, sig32;
|
||||
union ui32_f32 uZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
|
||||
uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
||||
} else {
|
||||
uiZ = packToF32UI( sign, 0xFF, 0 );
|
||||
}
|
||||
goto uiZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sig ) {
|
||||
uiZ = packToF32UI( sign, 0, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
exp += softfloat_normExtF80SigM( &sig );
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
sig32 = softfloat_shortShiftRightJam64( sig, 33 );
|
||||
exp -= 0x3F81;
|
||||
if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
||||
if ( exp < -0x1000 ) exp = -0x1000;
|
||||
}
|
||||
return softfloat_roundPackToF32( sign, exp, sig32 | 0x40000000 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiZ:
|
||||
uZ.ui = uiZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
float64_t extF80M_to_f64( const extFloat80_t *aPtr )
|
||||
{
|
||||
|
||||
return extF80_to_f64( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
float64_t extF80M_to_f64( const extFloat80_t *aPtr )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
struct commonNaN commonNaN;
|
||||
uint64_t uiZ;
|
||||
union ui64_f64 uZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
|
||||
uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
||||
} else {
|
||||
uiZ = packToF64UI( sign, 0x7FF, 0 );
|
||||
}
|
||||
goto uiZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sig ) {
|
||||
uiZ = packToF64UI( sign, 0, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
exp += softfloat_normExtF80SigM( &sig );
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
sig = softfloat_shortShiftRightJam64( sig, 1 );
|
||||
exp -= 0x3C01;
|
||||
if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
||||
if ( exp < -0x1000 ) exp = -0x1000;
|
||||
}
|
||||
return
|
||||
softfloat_roundPackToF64(
|
||||
sign, exp, sig | UINT64_C( 0x4000000000000000 ) );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiZ:
|
||||
uZ.ui = uiZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast32_t
|
||||
extF80M_to_i32(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_i32( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast32_t
|
||||
extF80M_to_i32(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
int32_t shiftCount;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) sign = 0;
|
||||
shiftCount = 0x4037 - exp;
|
||||
if ( shiftCount <= 0 ) {
|
||||
if ( sig>>32 ) goto invalid;
|
||||
if ( -32 < shiftCount ) {
|
||||
sig <<= -shiftCount;
|
||||
} else {
|
||||
if ( (uint32_t) sig ) goto invalid;
|
||||
}
|
||||
} else {
|
||||
sig = softfloat_shiftRightJam64( sig, shiftCount );
|
||||
}
|
||||
return softfloat_roundPackToI32( sign, sig, roundingMode, exact );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return sign ? -0x7FFFFFFF - 1 : 0x7FFFFFFF;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast32_t extF80M_to_i32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_i32_r_minMag( *aPtr, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast32_t extF80M_to_i32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
int32_t shiftCount;
|
||||
bool raiseInexact;
|
||||
int32_t z;
|
||||
uint64_t shiftedSig;
|
||||
uint32_t absZ;
|
||||
union { uint32_t ui; int32_t i; } u;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! sig && (exp != 0x7FFF) ) return 0;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
raiseInexact = exact;
|
||||
z = 0;
|
||||
} else {
|
||||
raiseInexact = false;
|
||||
if ( shiftCount < 0 ) {
|
||||
if ( sig>>32 || (shiftCount <= -31) ) goto invalid;
|
||||
shiftedSig = (uint64_t) (uint32_t) sig<<-shiftCount;
|
||||
if ( shiftedSig>>32 ) goto invalid;
|
||||
absZ = shiftedSig;
|
||||
} else {
|
||||
shiftedSig = sig;
|
||||
if ( shiftCount ) shiftedSig >>= shiftCount;
|
||||
if ( shiftedSig>>32 ) goto invalid;
|
||||
absZ = shiftedSig;
|
||||
if ( exact && shiftCount ) {
|
||||
raiseInexact = ((uint64_t) absZ<<shiftCount != sig);
|
||||
}
|
||||
}
|
||||
if ( signExtF80UI64( uiA64 ) ) {
|
||||
if ( 0x80000000 < absZ ) goto invalid;
|
||||
u.ui = -absZ;
|
||||
z = u.i;
|
||||
} else {
|
||||
if ( 0x80000000 <= absZ ) goto invalid;
|
||||
z = absZ;
|
||||
}
|
||||
}
|
||||
if ( raiseInexact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
return z;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return
|
||||
! signExtF80UI64( uiA64 )
|
||||
|| ((exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
? 0x7FFFFFFF
|
||||
: -0x7FFFFFFF - 1;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast64_t
|
||||
extF80M_to_i64(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_i64( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast64_t
|
||||
extF80M_to_i64(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
int32_t shiftCount;
|
||||
uint32_t extSig[3];
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( shiftCount < 0 ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return
|
||||
! sign
|
||||
|| ((exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
? INT64_C( 0x7FFFFFFFFFFFFFFF )
|
||||
: -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
||||
}
|
||||
extSig[indexWord( 3, 2 )] = sig>>32;
|
||||
extSig[indexWord( 3, 1 )] = sig;
|
||||
extSig[indexWord( 3, 0 )] = 0;
|
||||
if ( shiftCount ) softfloat_shiftRightJam96M( extSig, shiftCount, extSig );
|
||||
return softfloat_roundPackMToI64( sign, extSig, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast64_t extF80M_to_i64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_i64_r_minMag( *aPtr, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast64_t extF80M_to_i64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
int32_t shiftCount;
|
||||
bool raiseInexact;
|
||||
int64_t z;
|
||||
uint64_t absZ;
|
||||
union { uint64_t ui; int64_t i; } u;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! sig && (exp != 0x7FFF) ) return 0;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
raiseInexact = exact;
|
||||
z = 0;
|
||||
} else {
|
||||
raiseInexact = false;
|
||||
if ( shiftCount < 0 ) {
|
||||
if ( shiftCount <= -63 ) goto invalid;
|
||||
shiftCount = -shiftCount;
|
||||
absZ = sig<<shiftCount;
|
||||
if ( absZ>>shiftCount != sig ) goto invalid;
|
||||
} else {
|
||||
absZ = sig;
|
||||
if ( shiftCount ) absZ >>= shiftCount;
|
||||
if ( exact && shiftCount ) {
|
||||
raiseInexact = (absZ<<shiftCount != sig);
|
||||
}
|
||||
}
|
||||
if ( signExtF80UI64( uiA64 ) ) {
|
||||
if ( UINT64_C( 0x8000000000000000 ) < absZ ) goto invalid;
|
||||
u.ui = -absZ;
|
||||
z = u.i;
|
||||
} else {
|
||||
if ( UINT64_C( 0x8000000000000000 ) <= absZ ) goto invalid;
|
||||
z = absZ;
|
||||
}
|
||||
}
|
||||
if ( raiseInexact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
return z;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return
|
||||
! signExtF80UI64( uiA64 )
|
||||
|| ((exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
? UINT64_C( 0x7FFFFFFFFFFFFFFF )
|
||||
: -UINT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
uint_fast32_t
|
||||
extF80M_to_ui32(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_ui32( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
uint_fast32_t
|
||||
extF80M_to_ui32(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
int32_t shiftCount;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
shiftCount = 0x4037 - exp;
|
||||
if ( shiftCount <= 0 ) {
|
||||
if ( sig>>32 ) goto invalid;
|
||||
if ( -32 < shiftCount ) {
|
||||
sig <<= -shiftCount;
|
||||
} else {
|
||||
if ( (uint32_t) sig ) goto invalid;
|
||||
}
|
||||
} else {
|
||||
sig = softfloat_shiftRightJam64( sig, shiftCount );
|
||||
}
|
||||
return softfloat_roundPackToUI32( sign, sig, roundingMode, exact );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return 0xFFFFFFFF;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
uint_fast32_t extF80M_to_ui32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_ui32_r_minMag( *aPtr, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
uint_fast32_t extF80M_to_ui32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
int32_t shiftCount;
|
||||
bool sign;
|
||||
uint64_t shiftedSig;
|
||||
uint32_t z;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! sig && (exp != 0x7FFF) ) return 0;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
return 0;
|
||||
}
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
if ( shiftCount < 0 ) {
|
||||
if ( sign || sig>>32 || (shiftCount <= -31) ) goto invalid;
|
||||
shiftedSig = (uint64_t) (uint32_t) sig<<-shiftCount;
|
||||
if ( shiftedSig>>32 ) goto invalid;
|
||||
z = shiftedSig;
|
||||
} else {
|
||||
shiftedSig = sig;
|
||||
if ( shiftCount ) shiftedSig >>= shiftCount;
|
||||
if ( shiftedSig>>32 ) goto invalid;
|
||||
z = shiftedSig;
|
||||
if ( sign && z ) goto invalid;
|
||||
if ( exact && shiftCount && ((uint64_t) z<<shiftCount != sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
}
|
||||
return z;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return 0xFFFFFFFF;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
uint_fast64_t
|
||||
extF80M_to_ui64(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_ui64( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
uint_fast64_t
|
||||
extF80M_to_ui64(
|
||||
const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t exp, shiftCount;
|
||||
bool sign;
|
||||
uint64_t sig;
|
||||
uint32_t extSig[3];
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( shiftCount < 0 ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return UINT64_C( 0xFFFFFFFFFFFFFFFF );
|
||||
}
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
extSig[indexWord( 3, 2 )] = sig>>32;
|
||||
extSig[indexWord( 3, 1 )] = sig;
|
||||
extSig[indexWord( 3, 0 )] = 0;
|
||||
if ( shiftCount ) softfloat_shiftRightJam96M( extSig, shiftCount, extSig );
|
||||
return softfloat_roundPackMToUI64( sign, extSig, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
uint_fast64_t extF80M_to_ui64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
|
||||
return extF80_to_ui64_r_minMag( *aPtr, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
uint_fast64_t extF80M_to_ui64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
||||
{
|
||||
const struct extFloat80M *aSPtr;
|
||||
uint_fast16_t uiA64;
|
||||
int32_t exp;
|
||||
uint64_t sig;
|
||||
int32_t shiftCount;
|
||||
bool sign;
|
||||
uint64_t z;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aSPtr = (const struct extFloat80M *) aPtr;
|
||||
uiA64 = aSPtr->signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = aSPtr->signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! sig && (exp != 0x7FFF) ) return 0;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
return 0;
|
||||
}
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
if ( shiftCount < 0 ) {
|
||||
if ( sign || (shiftCount <= -63) ) goto invalid;
|
||||
shiftCount = -shiftCount;
|
||||
z = sig<<shiftCount;
|
||||
if ( z>>shiftCount != sig ) goto invalid;
|
||||
} else {
|
||||
z = sig;
|
||||
if ( shiftCount ) z >>= shiftCount;
|
||||
if ( sign && z ) goto invalid;
|
||||
if ( exact && shiftCount && (z<<shiftCount != sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
}
|
||||
return z;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return UINT64_C( 0xFFFFFFFFFFFFFFFF );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
extFloat80_t extF80_add( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signB;
|
||||
extFloat80_t
|
||||
(*magsFuncPtr)(
|
||||
uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
magsFuncPtr =
|
||||
(signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80;
|
||||
return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,200 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
extFloat80_t extF80_div( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
int_fast32_t expA;
|
||||
uint_fast64_t sigA;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signB;
|
||||
int_fast32_t expB;
|
||||
uint_fast64_t sigB;
|
||||
bool signZ;
|
||||
struct exp32_sig64 normExpSig;
|
||||
int_fast32_t expZ;
|
||||
struct uint128 rem;
|
||||
uint_fast32_t recip32;
|
||||
uint_fast64_t sigZ;
|
||||
int ix;
|
||||
uint_fast64_t q64;
|
||||
uint_fast32_t q;
|
||||
struct uint128 term;
|
||||
uint_fast64_t sigZExtra;
|
||||
struct uint128 uiZ;
|
||||
uint_fast16_t uiZ64;
|
||||
uint_fast64_t uiZ0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
sigA = uiA0;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
expB = expExtF80UI64( uiB64 );
|
||||
sigB = uiB0;
|
||||
signZ = signA ^ signB;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( expA == 0x7FFF ) {
|
||||
if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
||||
if ( expB == 0x7FFF ) {
|
||||
if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
||||
goto invalid;
|
||||
}
|
||||
goto infinity;
|
||||
}
|
||||
if ( expB == 0x7FFF ) {
|
||||
if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
||||
goto zero;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! expB ) expB = 1;
|
||||
if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigB ) {
|
||||
if ( ! sigA ) goto invalid;
|
||||
softfloat_raiseFlags( softfloat_flag_infinite );
|
||||
goto infinity;
|
||||
}
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigB );
|
||||
expB += normExpSig.exp;
|
||||
sigB = normExpSig.sig;
|
||||
}
|
||||
if ( ! expA ) expA = 1;
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigA ) goto zero;
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
||||
expA += normExpSig.exp;
|
||||
sigA = normExpSig.sig;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = expA - expB + 0x3FFF;
|
||||
if ( sigA < sigB ) {
|
||||
--expZ;
|
||||
rem = softfloat_shortShiftLeft128( 0, sigA, 32 );
|
||||
} else {
|
||||
rem = softfloat_shortShiftLeft128( 0, sigA, 31 );
|
||||
}
|
||||
recip32 = softfloat_approxRecip32_1( sigB>>32 );
|
||||
sigZ = 0;
|
||||
ix = 2;
|
||||
for (;;) {
|
||||
q64 = (uint_fast64_t) (uint32_t) (rem.v64>>2) * recip32;
|
||||
q = (q64 + 0x80000000)>>32;
|
||||
--ix;
|
||||
if ( ix < 0 ) break;
|
||||
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
||||
term = softfloat_mul64ByShifted32To128( sigB, q );
|
||||
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
||||
--q;
|
||||
rem = softfloat_add128( rem.v64, rem.v0, sigB>>32, sigB<<32 );
|
||||
}
|
||||
sigZ = (sigZ<<29) + q;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ((q + 1) & 0x3FFFFF) < 2 ) {
|
||||
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
||||
term = softfloat_mul64ByShifted32To128( sigB, q );
|
||||
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
term = softfloat_shortShiftLeft128( 0, sigB, 32 );
|
||||
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
||||
--q;
|
||||
rem = softfloat_add128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
} else if ( softfloat_le128( term.v64, term.v0, rem.v64, rem.v0 ) ) {
|
||||
++q;
|
||||
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
}
|
||||
if ( rem.v64 | rem.v0 ) q |= 1;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
sigZ = (sigZ<<6) + (q>>23);
|
||||
sigZExtra = (uint64_t) ((uint_fast64_t) q<<41);
|
||||
return
|
||||
softfloat_roundPackToExtF80(
|
||||
signZ, expZ, sigZ, sigZExtra, extF80_roundingPrecision );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
propagateNaN:
|
||||
uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
||||
uiZ64 = uiZ.v64;
|
||||
uiZ0 = uiZ.v0;
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
uiZ64 = defaultNaNExtF80UI64;
|
||||
uiZ0 = defaultNaNExtF80UI0;
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
infinity:
|
||||
uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
||||
uiZ0 = UINT64_C( 0x8000000000000000 );
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zero:
|
||||
uiZ64 = packToExtF80UI64( signZ, 0 );
|
||||
uiZ0 = 0;
|
||||
uiZ:
|
||||
uZ.s.signExp = uiZ64;
|
||||
uZ.s.signif = uiZ0;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
bool extF80_eq( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
if (
|
||||
softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
||||
|| softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return
|
||||
(uiA0 == uiB0)
|
||||
&& ((uiA64 == uiB64) || (! uiA0 && ! ((uiA64 | uiB64) & 0x7FFF)));
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
bool extF80_eq_signaling( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
return
|
||||
(uiA0 == uiB0)
|
||||
&& ((uiA64 == uiB64) || (! uiA0 && ! ((uiA64 | uiB64) & 0x7FFF)));
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
bool extF80_isSignalingNaN( extFloat80_t a )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
|
||||
uA.f = a;
|
||||
return softfloat_isSigNaNExtF80UI( uA.s.signExp, uA.s.signif );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
bool extF80_le( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signA, signB;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
return
|
||||
(signA != signB)
|
||||
? signA || ! (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
||||
: ((uiA64 == uiB64) && (uiA0 == uiB0))
|
||||
|| (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
bool extF80_le_quiet( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signA, signB;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
if (
|
||||
softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
||||
|| softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
return
|
||||
(signA != signB)
|
||||
? signA || ! (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
||||
: ((uiA64 == uiB64) && (uiA0 == uiB0))
|
||||
|| (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
bool extF80_lt( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signA, signB;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
return
|
||||
(signA != signB)
|
||||
? signA && (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
||||
: ((uiA64 != uiB64) || (uiA0 != uiB0))
|
||||
&& (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
bool extF80_lt_quiet( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signA, signB;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
||||
if (
|
||||
softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
||||
|| softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
return
|
||||
(signA != signB)
|
||||
? signA && (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
||||
: ((uiA64 != uiB64) || (uiA0 != uiB0))
|
||||
&& (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
extFloat80_t extF80_mul( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
int_fast32_t expA;
|
||||
uint_fast64_t sigA;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signB;
|
||||
int_fast32_t expB;
|
||||
uint_fast64_t sigB;
|
||||
bool signZ;
|
||||
uint_fast64_t magBits;
|
||||
struct exp32_sig64 normExpSig;
|
||||
int_fast32_t expZ;
|
||||
struct uint128 sig128Z, uiZ;
|
||||
uint_fast16_t uiZ64;
|
||||
uint_fast64_t uiZ0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
sigA = uiA0;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
expB = expExtF80UI64( uiB64 );
|
||||
sigB = uiB0;
|
||||
signZ = signA ^ signB;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( expA == 0x7FFF ) {
|
||||
if (
|
||||
(sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
||||
|| ((expB == 0x7FFF) && (sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
) {
|
||||
goto propagateNaN;
|
||||
}
|
||||
magBits = expB | sigB;
|
||||
goto infArg;
|
||||
}
|
||||
if ( expB == 0x7FFF ) {
|
||||
if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
||||
magBits = expA | sigA;
|
||||
goto infArg;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! expA ) expA = 1;
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigA ) goto zero;
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
||||
expA += normExpSig.exp;
|
||||
sigA = normExpSig.sig;
|
||||
}
|
||||
if ( ! expB ) expB = 1;
|
||||
if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigB ) goto zero;
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigB );
|
||||
expB += normExpSig.exp;
|
||||
sigB = normExpSig.sig;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = expA + expB - 0x3FFE;
|
||||
sig128Z = softfloat_mul64To128( sigA, sigB );
|
||||
if ( sig128Z.v64 < UINT64_C( 0x8000000000000000 ) ) {
|
||||
--expZ;
|
||||
sig128Z =
|
||||
softfloat_add128(
|
||||
sig128Z.v64, sig128Z.v0, sig128Z.v64, sig128Z.v0 );
|
||||
}
|
||||
return
|
||||
softfloat_roundPackToExtF80(
|
||||
signZ, expZ, sig128Z.v64, sig128Z.v0, extF80_roundingPrecision );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
propagateNaN:
|
||||
uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
||||
uiZ64 = uiZ.v64;
|
||||
uiZ0 = uiZ.v0;
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
infArg:
|
||||
if ( ! magBits ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
uiZ64 = defaultNaNExtF80UI64;
|
||||
uiZ0 = defaultNaNExtF80UI0;
|
||||
} else {
|
||||
uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
||||
uiZ0 = UINT64_C( 0x8000000000000000 );
|
||||
}
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zero:
|
||||
uiZ64 = packToExtF80UI64( signZ, 0 );
|
||||
uiZ0 = 0;
|
||||
uiZ:
|
||||
uZ.s.signExp = uiZ64;
|
||||
uZ.s.signif = uiZ0;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,224 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
extFloat80_t extF80_rem( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
int_fast32_t expA;
|
||||
uint_fast64_t sigA;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signB;
|
||||
int_fast32_t expB;
|
||||
uint_fast64_t sigB;
|
||||
struct exp32_sig64 normExpSig;
|
||||
int_fast32_t expDiff;
|
||||
struct uint128 rem, shiftedSigB;
|
||||
uint_fast32_t q, recip32;
|
||||
uint_fast64_t q64;
|
||||
struct uint128 term, altRem, meanRem;
|
||||
bool signRem;
|
||||
struct uint128 uiZ;
|
||||
uint_fast16_t uiZ64;
|
||||
uint_fast64_t uiZ0;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
sigA = uiA0;
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
expB = expExtF80UI64( uiB64 );
|
||||
sigB = uiB0;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( expA == 0x7FFF ) {
|
||||
if (
|
||||
(sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
||||
|| ((expB == 0x7FFF) && (sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
) {
|
||||
goto propagateNaN;
|
||||
}
|
||||
goto invalid;
|
||||
}
|
||||
if ( expB == 0x7FFF ) {
|
||||
if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
||||
/*--------------------------------------------------------------------
|
||||
| Argument b is an infinity. Doubling `expB' is an easy way to ensure
|
||||
| that `expDiff' later is less than -1, which will result in returning
|
||||
| a canonicalized version of argument a.
|
||||
*--------------------------------------------------------------------*/
|
||||
expB += expB;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! expB ) expB = 1;
|
||||
if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigB ) goto invalid;
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigB );
|
||||
expB += normExpSig.exp;
|
||||
sigB = normExpSig.sig;
|
||||
}
|
||||
if ( ! expA ) expA = 1;
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigA ) {
|
||||
expA = 0;
|
||||
goto copyA;
|
||||
}
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
||||
expA += normExpSig.exp;
|
||||
sigA = normExpSig.sig;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expDiff = expA - expB;
|
||||
if ( expDiff < -1 ) goto copyA;
|
||||
rem = softfloat_shortShiftLeft128( 0, sigA, 32 );
|
||||
shiftedSigB = softfloat_shortShiftLeft128( 0, sigB, 32 );
|
||||
if ( expDiff < 1 ) {
|
||||
if ( expDiff ) {
|
||||
--expB;
|
||||
shiftedSigB = softfloat_shortShiftLeft128( 0, sigB, 33 );
|
||||
q = 0;
|
||||
} else {
|
||||
q = (sigB <= sigA);
|
||||
if ( q ) {
|
||||
rem =
|
||||
softfloat_sub128(
|
||||
rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
recip32 = softfloat_approxRecip32_1( sigB>>32 );
|
||||
expDiff -= 30;
|
||||
for (;;) {
|
||||
q64 = (uint_fast64_t) (uint32_t) (rem.v64>>2) * recip32;
|
||||
if ( expDiff < 0 ) break;
|
||||
q = (q64 + 0x80000000)>>32;
|
||||
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
||||
term = softfloat_mul64ByShifted32To128( sigB, q );
|
||||
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
||||
rem =
|
||||
softfloat_add128(
|
||||
rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
||||
}
|
||||
expDiff -= 29;
|
||||
}
|
||||
/*--------------------------------------------------------------------
|
||||
| (`expDiff' cannot be less than -29 here.)
|
||||
*--------------------------------------------------------------------*/
|
||||
q = (uint32_t) (q64>>32)>>(~expDiff & 31);
|
||||
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, expDiff + 30 );
|
||||
term = softfloat_mul64ByShifted32To128( sigB, q );
|
||||
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
||||
altRem =
|
||||
softfloat_add128(
|
||||
rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
||||
goto selectRem;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
do {
|
||||
altRem = rem;
|
||||
++q;
|
||||
rem =
|
||||
softfloat_sub128(
|
||||
rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
||||
} while ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) );
|
||||
selectRem:
|
||||
meanRem = softfloat_add128( rem.v64, rem.v0, altRem.v64, altRem.v0 );
|
||||
if (
|
||||
(meanRem.v64 & UINT64_C( 0x8000000000000000 ))
|
||||
|| (! (meanRem.v64 | meanRem.v0) && (q & 1))
|
||||
) {
|
||||
rem = altRem;
|
||||
}
|
||||
signRem = signA;
|
||||
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
||||
signRem = ! signRem;
|
||||
rem = softfloat_sub128( 0, 0, rem.v64, rem.v0 );
|
||||
}
|
||||
return
|
||||
softfloat_normRoundPackToExtF80(
|
||||
signRem, expB + 32, rem.v64, rem.v0, 80 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
propagateNaN:
|
||||
uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
||||
uiZ64 = uiZ.v64;
|
||||
uiZ0 = uiZ.v0;
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
uiZ64 = defaultNaNExtF80UI64;
|
||||
uiZ0 = defaultNaNExtF80UI0;
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
copyA:
|
||||
if ( expA < 1 ) {
|
||||
sigA >>= 1 - expA;
|
||||
expA = 0;
|
||||
}
|
||||
uiZ64 = packToExtF80UI64( signA, expA );
|
||||
uiZ0 = sigA;
|
||||
uiZ:
|
||||
uZ.s.signExp = uiZ64;
|
||||
uZ.s.signif = uiZ0;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
extFloat80_t
|
||||
extF80_roundToInt( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64, signUI64;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sigA;
|
||||
uint_fast16_t uiZ64;
|
||||
uint_fast64_t sigZ;
|
||||
struct exp32_sig64 normExpSig;
|
||||
struct uint128 uiZ;
|
||||
uint_fast64_t lastBitMask, roundBitsMask;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
signUI64 = uiA64 & packToExtF80UI64( 1, 0 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sigA = uA.s.signif;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) {
|
||||
if ( ! sigA ) {
|
||||
uiZ64 = signUI64;
|
||||
sigZ = 0;
|
||||
goto uiZ;
|
||||
}
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
||||
exp += normExpSig.exp;
|
||||
sigA = normExpSig.sig;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( 0x403E <= exp ) {
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
uiZ = softfloat_propagateNaNExtF80UI( uiA64, sigA, 0, 0 );
|
||||
uiZ64 = uiZ.v64;
|
||||
sigZ = uiZ.v0;
|
||||
goto uiZ;
|
||||
}
|
||||
sigZ = UINT64_C( 0x8000000000000000 );
|
||||
} else {
|
||||
sigZ = sigA;
|
||||
}
|
||||
uiZ64 = signUI64 | exp;
|
||||
goto uiZ;
|
||||
}
|
||||
if ( exp <= 0x3FFE ) {
|
||||
if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
switch ( roundingMode ) {
|
||||
case softfloat_round_near_even:
|
||||
if ( ! (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break;
|
||||
case softfloat_round_near_maxMag:
|
||||
if ( exp == 0x3FFE ) goto mag1;
|
||||
break;
|
||||
case softfloat_round_min:
|
||||
if ( signUI64 ) goto mag1;
|
||||
break;
|
||||
case softfloat_round_max:
|
||||
if ( ! signUI64 ) goto mag1;
|
||||
break;
|
||||
}
|
||||
uiZ64 = signUI64;
|
||||
sigZ = 0;
|
||||
goto uiZ;
|
||||
mag1:
|
||||
uiZ64 = signUI64 | 0x3FFF;
|
||||
sigZ = UINT64_C( 0x8000000000000000 );
|
||||
goto uiZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiZ64 = signUI64 | exp;
|
||||
lastBitMask = (uint_fast64_t) 1<<(0x403E - exp);
|
||||
roundBitsMask = lastBitMask - 1;
|
||||
sigZ = sigA;
|
||||
if ( roundingMode == softfloat_round_near_maxMag ) {
|
||||
sigZ += lastBitMask>>1;
|
||||
} else if ( roundingMode == softfloat_round_near_even ) {
|
||||
sigZ += lastBitMask>>1;
|
||||
if ( ! (sigZ & roundBitsMask) ) sigZ &= ~lastBitMask;
|
||||
} else if ( roundingMode != softfloat_round_minMag ) {
|
||||
if ( (signUI64 != 0) ^ (roundingMode == softfloat_round_max) ) {
|
||||
sigZ += roundBitsMask;
|
||||
}
|
||||
}
|
||||
sigZ &= ~roundBitsMask;
|
||||
if ( ! sigZ ) {
|
||||
++uiZ64;
|
||||
sigZ = UINT64_C( 0x8000000000000000 );
|
||||
}
|
||||
if ( exact && (sigZ != sigA) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
uiZ:
|
||||
uZ.s.signExp = uiZ64;
|
||||
uZ.s.signif = sigZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
extFloat80_t extF80_sqrt( extFloat80_t a )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
int_fast32_t expA;
|
||||
uint_fast64_t sigA;
|
||||
struct uint128 uiZ;
|
||||
uint_fast16_t uiZ64;
|
||||
uint_fast64_t uiZ0;
|
||||
struct exp32_sig64 normExpSig;
|
||||
int_fast32_t expZ;
|
||||
uint_fast32_t sig32A, recipSqrt32, sig32Z;
|
||||
struct uint128 rem;
|
||||
uint_fast64_t q, sigZ, x64;
|
||||
struct uint128 term;
|
||||
uint_fast64_t sigZExtra;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uZ;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
expA = expExtF80UI64( uiA64 );
|
||||
sigA = uiA0;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( expA == 0x7FFF ) {
|
||||
if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, 0, 0 );
|
||||
uiZ64 = uiZ.v64;
|
||||
uiZ0 = uiZ.v0;
|
||||
goto uiZ;
|
||||
}
|
||||
if ( ! signA ) return a;
|
||||
goto invalid;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( signA ) {
|
||||
if ( ! sigA ) goto zero;
|
||||
goto invalid;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ! expA ) expA = 1;
|
||||
if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
||||
if ( ! sigA ) goto zero;
|
||||
normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
||||
expA += normExpSig.exp;
|
||||
sigA = normExpSig.sig;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
| (`sig32Z' is guaranteed to be a lower bound on the square root of
|
||||
| `sig32A', which makes `sig32Z' also a lower bound on the square root of
|
||||
| `sigA'.)
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = ((expA - 0x3FFF)>>1) + 0x3FFF;
|
||||
expA &= 1;
|
||||
sig32A = sigA>>32;
|
||||
recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
||||
sig32Z = ((uint_fast64_t) sig32A * recipSqrt32)>>32;
|
||||
if ( expA ) {
|
||||
sig32Z >>= 1;
|
||||
rem = softfloat_shortShiftLeft128( 0, sigA, 61 );
|
||||
} else {
|
||||
rem = softfloat_shortShiftLeft128( 0, sigA, 62 );
|
||||
}
|
||||
rem.v64 -= (uint_fast64_t) sig32Z * sig32Z;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q = ((uint_fast64_t) (uint32_t) (rem.v64>>2) * recipSqrt32)>>32;
|
||||
sigZ = ((uint_fast64_t) sig32Z<<32) + (q<<3);
|
||||
x64 = ((uint_fast64_t) sig32Z<<32) + sigZ;
|
||||
term = softfloat_mul64ByShifted32To128( x64, q );
|
||||
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
||||
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q = (((uint_fast64_t) (uint32_t) (rem.v64>>2) * recipSqrt32)>>32) + 2;
|
||||
x64 = sigZ;
|
||||
sigZ = (sigZ<<1) + (q>>25);
|
||||
sigZExtra = (uint64_t) (q<<39);
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (q & 0xFFFFFF) <= 2 ) {
|
||||
q &= ~0xFFFF;
|
||||
sigZExtra = (uint64_t) (q<<39);
|
||||
term = softfloat_mul64ByShifted32To128( x64 + (q>>27), q );
|
||||
x64 = (uint_fast64_t) (uint32_t) (q<<5) * (uint32_t) q;
|
||||
term = softfloat_add128( term.v64, term.v0, 0, x64 );
|
||||
rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 28 );
|
||||
rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
||||
if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
||||
if ( ! sigZExtra ) --sigZ;
|
||||
--sigZExtra;
|
||||
} else {
|
||||
if ( rem.v64 | rem.v0 ) sigZExtra |= 1;
|
||||
}
|
||||
}
|
||||
return
|
||||
softfloat_roundPackToExtF80(
|
||||
0, expZ, sigZ, sigZExtra, extF80_roundingPrecision );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
uiZ64 = defaultNaNExtF80UI64;
|
||||
uiZ0 = defaultNaNExtF80UI0;
|
||||
goto uiZ;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zero:
|
||||
uiZ64 = packToExtF80UI64( signA, 0 );
|
||||
uiZ0 = 0;
|
||||
uiZ:
|
||||
uZ.s.signExp = uiZ64;
|
||||
uZ.s.signif = uiZ0;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
extFloat80_t extF80_sub( extFloat80_t a, extFloat80_t b )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool signA;
|
||||
union { struct extFloat80M s; extFloat80_t f; } uB;
|
||||
uint_fast16_t uiB64;
|
||||
uint_fast64_t uiB0;
|
||||
bool signB;
|
||||
extFloat80_t
|
||||
(*magsFuncPtr)(
|
||||
uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
signA = signExtF80UI64( uiA64 );
|
||||
uB.f = b;
|
||||
uiB64 = uB.s.signExp;
|
||||
uiB0 = uB.s.signif;
|
||||
signB = signExtF80UI64( uiB64 );
|
||||
magsFuncPtr =
|
||||
(signA == signB) ? softfloat_subMagsExtF80 : softfloat_addMagsExtF80;
|
||||
return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
float128_t extF80_to_f128( extFloat80_t a )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
uint_fast16_t exp;
|
||||
uint_fast64_t sig;
|
||||
struct commonNaN commonNaN;
|
||||
struct uint128 uiZ;
|
||||
bool sign;
|
||||
struct uint128 sig128;
|
||||
union ui128_f128 uZ;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uiA0 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
|
||||
if ( (exp == 0x7FFF) && sig ) {
|
||||
softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
||||
uiZ = softfloat_commonNaNToF128UI( &commonNaN );
|
||||
} else {
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
sig128 = softfloat_shortShiftLeft128( 0, sig, 49 );
|
||||
uiZ.v64 = packToF128UI64( sign, exp, sig128.v64 );
|
||||
uiZ.v0 = sig128.v0;
|
||||
}
|
||||
uZ.ui = uiZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
float32_t extF80_to_f32( extFloat80_t a )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool sign;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
struct commonNaN commonNaN;
|
||||
uint_fast32_t uiZ, sig32;
|
||||
union ui32_f32 uZ;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uiA0;
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
||||
uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
||||
} else {
|
||||
uiZ = packToF32UI( sign, 0xFF, 0 );
|
||||
}
|
||||
goto uiZ;
|
||||
}
|
||||
sig32 = softfloat_shortShiftRightJam64( sig, 33 );
|
||||
if ( ! (exp | sig32) ) {
|
||||
uiZ = packToF32UI( sign, 0, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
exp -= 0x3F81;
|
||||
if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
||||
if ( exp < -0x1000 ) exp = -0x1000;
|
||||
}
|
||||
return softfloat_roundPackToF32( sign, exp, sig32 );
|
||||
uiZ:
|
||||
uZ.ui = uiZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
float64_t extF80_to_f64( extFloat80_t a )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
uint_fast64_t uiA0;
|
||||
bool sign;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
struct commonNaN commonNaN;
|
||||
uint_fast64_t uiZ;
|
||||
union ui64_f64 uZ;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
uiA0 = uA.s.signif;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uiA0;
|
||||
if ( ! (exp | sig) ) {
|
||||
uiZ = packToF64UI( sign, 0, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
||||
softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
||||
uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
||||
} else {
|
||||
uiZ = packToF64UI( sign, 0x7FF, 0 );
|
||||
}
|
||||
goto uiZ;
|
||||
}
|
||||
sig = softfloat_shortShiftRightJam64( sig, 1 );
|
||||
exp -= 0x3C01;
|
||||
if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
||||
if ( exp < -0x1000 ) exp = -0x1000;
|
||||
}
|
||||
return softfloat_roundPackToF64( sign, exp, sig );
|
||||
uiZ:
|
||||
uZ.ui = uiZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
int_fast32_t
|
||||
extF80_to_i32( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
int_fast32_t shiftCount;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
if ( (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) sign = 0;
|
||||
shiftCount = 0x4037 - exp;
|
||||
if ( shiftCount <= 0 ) shiftCount = 1;
|
||||
sig = softfloat_shiftRightJam64( sig, shiftCount );
|
||||
return softfloat_roundPackToI32( sign, sig, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
int_fast32_t extF80_to_i32_r_minMag( extFloat80_t a, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
int_fast32_t shiftCount;
|
||||
bool sign;
|
||||
int_fast32_t absZ;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
if ( exact && (exp | sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
if ( shiftCount < 33 ) {
|
||||
if (
|
||||
(uiA64 == packToExtF80UI64( 1, 0x401E ))
|
||||
&& (sig < UINT64_C( 0x8000000100000000 ))
|
||||
) {
|
||||
if ( exact && (sig & UINT64_C( 0x00000000FFFFFFFF )) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
} else {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if (
|
||||
! sign
|
||||
|| ((exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
) {
|
||||
return 0x7FFFFFFF;
|
||||
}
|
||||
}
|
||||
return -0x7FFFFFFF - 1;
|
||||
}
|
||||
absZ = sig>>shiftCount;
|
||||
if (
|
||||
exact && ((uint_fast64_t) (uint_fast32_t) absZ<<shiftCount != sig)
|
||||
) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return sign ? -absZ : absZ;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
int_fast64_t
|
||||
extF80_to_i64( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
int_fast32_t shiftCount;
|
||||
uint_fast64_t sigExtra;
|
||||
struct uint64_extra sig64Extra;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( shiftCount <= 0 ) {
|
||||
if ( shiftCount ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return
|
||||
! sign
|
||||
|| ((exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
? INT64_C( 0x7FFFFFFFFFFFFFFF )
|
||||
: -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
||||
}
|
||||
sigExtra = 0;
|
||||
} else {
|
||||
sig64Extra = softfloat_shiftRightJam64Extra( sig, 0, shiftCount );
|
||||
sig = sig64Extra.v;
|
||||
sigExtra = sig64Extra.extra;
|
||||
}
|
||||
return
|
||||
softfloat_roundPackToI64( sign, sig, sigExtra, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
int_fast64_t extF80_to_i64_r_minMag( extFloat80_t a, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
int_fast32_t shiftCount;
|
||||
bool sign;
|
||||
int_fast64_t absZ;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
if ( exact && (exp | sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
if ( shiftCount <= 0 ) {
|
||||
if (
|
||||
(uiA64 != packToExtF80UI64( 1, 0x403E ))
|
||||
|| (sig != UINT64_C( 0x8000000000000000 ))
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
if (
|
||||
! sign
|
||||
|| ((exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
||||
) {
|
||||
return INT64_C( 0x7FFFFFFFFFFFFFFF );
|
||||
}
|
||||
}
|
||||
return -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
||||
}
|
||||
absZ = sig>>shiftCount;
|
||||
if ( exact && (uint64_t) (sig<<(-shiftCount & 63)) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return sign ? -absZ : absZ;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
uint_fast32_t
|
||||
extF80_to_ui32( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
bool sign;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
int_fast32_t shiftCount;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
shiftCount = 0x4037 - exp;
|
||||
if ( shiftCount <= 0 ) shiftCount = 1;
|
||||
sig = softfloat_shiftRightJam64( sig, shiftCount );
|
||||
return softfloat_roundPackToUI32( sign, sig, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
uint_fast32_t extF80_to_ui32_r_minMag( extFloat80_t a, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
int_fast32_t shiftCount;
|
||||
uint_fast32_t z;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
if ( exact && (exp | sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if ( signExtF80UI64( uiA64 ) || (shiftCount < 32) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
z = sig>>shiftCount;
|
||||
if ( exact && ((uint_fast64_t) z<<shiftCount != sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return z;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
uint_fast64_t
|
||||
extF80_to_ui64( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
int_fast32_t exp, shiftCount;
|
||||
bool sign;
|
||||
uint_fast64_t sig, sigExtra;
|
||||
struct uint64_extra sig64Extra;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( shiftCount < 0 ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return UINT64_C( 0xFFFFFFFFFFFFFFFF );
|
||||
}
|
||||
sign = signExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
sigExtra = 0;
|
||||
if ( shiftCount ) {
|
||||
sig64Extra = softfloat_shiftRightJam64Extra( sig, 0, shiftCount );
|
||||
sig = sig64Extra.v;
|
||||
sigExtra = sig64Extra.extra;
|
||||
}
|
||||
return
|
||||
softfloat_roundPackToUI64( sign, sig, sigExtra, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
uint_fast64_t extF80_to_ui64_r_minMag( extFloat80_t a, bool exact )
|
||||
{
|
||||
union { struct extFloat80M s; extFloat80_t f; } uA;
|
||||
uint_fast16_t uiA64;
|
||||
int_fast32_t exp;
|
||||
uint_fast64_t sig;
|
||||
int_fast32_t shiftCount;
|
||||
uint_fast64_t z;
|
||||
|
||||
uA.f = a;
|
||||
uiA64 = uA.s.signExp;
|
||||
exp = expExtF80UI64( uiA64 );
|
||||
sig = uA.s.signif;
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( 64 <= shiftCount ) {
|
||||
if ( exact && (exp | sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if ( signExtF80UI64( uiA64 ) || (shiftCount < 0) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return UINT64_C( 0xFFFFFFFFFFFFFFFF );
|
||||
}
|
||||
z = sig>>shiftCount;
|
||||
if ( exact && (z<<shiftCount != sig) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return z;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
f128M_add( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
const uint64_t *aWPtr, *bWPtr;
|
||||
uint_fast64_t uiA64, uiA0;
|
||||
bool signA;
|
||||
uint_fast64_t uiB64, uiB0;
|
||||
bool signB;
|
||||
float128_t
|
||||
(*magsFuncPtr)(
|
||||
uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );
|
||||
|
||||
aWPtr = (const uint64_t *) aPtr;
|
||||
bWPtr = (const uint64_t *) bPtr;
|
||||
uiA64 = aWPtr[indexWord( 2, 1 )];
|
||||
uiA0 = aWPtr[indexWord( 2, 0 )];
|
||||
signA = signF128UI64( uiA64 );
|
||||
uiB64 = bWPtr[indexWord( 2, 1 )];
|
||||
uiB0 = bWPtr[indexWord( 2, 0 )];
|
||||
signB = signF128UI64( uiB64 );
|
||||
magsFuncPtr =
|
||||
(signA == signB) ? softfloat_addMagsF128 : softfloat_subMagsF128;
|
||||
*zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
f128M_add( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
|
||||
softfloat_addF128M(
|
||||
(const uint32_t *) aPtr,
|
||||
(const uint32_t *) bPtr,
|
||||
(uint32_t *) zPtr,
|
||||
false
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,184 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
f128M_div( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = f128_div( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
f128M_div( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t *zWPtr, uiA96;
|
||||
bool signA;
|
||||
int32_t expA;
|
||||
uint32_t uiB96;
|
||||
bool signB;
|
||||
int32_t expB;
|
||||
bool signZ;
|
||||
uint32_t y[5], sigB[4];
|
||||
int32_t expZ;
|
||||
uint32_t recip32;
|
||||
int ix;
|
||||
uint64_t q64;
|
||||
uint32_t q, qs[3], uiZ96;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
zWPtr = (uint32_t *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
signA = signF128UI96( uiA96 );
|
||||
expA = expF128UI96( uiA96 );
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
signB = signF128UI96( uiB96 );
|
||||
expB = expF128UI96( uiB96 );
|
||||
signZ = signA ^ signB;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
||||
if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
|
||||
if ( expA == 0x7FFF ) {
|
||||
if ( expB == 0x7FFF ) goto invalid;
|
||||
goto infinity;
|
||||
}
|
||||
goto zero;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expA = softfloat_shiftNormSigF128M( aWPtr, 13, y );
|
||||
expB = softfloat_shiftNormSigF128M( bWPtr, 13, sigB );
|
||||
if ( expA == -128 ) {
|
||||
if ( expB == -128 ) goto invalid;
|
||||
goto zero;
|
||||
}
|
||||
if ( expB == -128 ) {
|
||||
softfloat_raiseFlags( softfloat_flag_infinite );
|
||||
goto infinity;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = expA - expB + 0x3FFE;
|
||||
if ( softfloat_compare128M( y, sigB ) < 0 ) {
|
||||
--expZ;
|
||||
softfloat_add128M( y, y, y );
|
||||
}
|
||||
recip32 =
|
||||
softfloat_approxRecip32_1(
|
||||
((uint64_t) sigB[indexWord( 4, 3 )]<<32 | sigB[indexWord( 4, 2 )])
|
||||
>>30
|
||||
);
|
||||
ix = 3;
|
||||
for (;;) {
|
||||
q64 = (uint64_t) y[indexWordHi( 4 )] * recip32;
|
||||
q = (q64 + 0x80000000)>>32;
|
||||
--ix;
|
||||
if ( ix < 0 ) break;
|
||||
softfloat_remStep128MBy32( y, 29, sigB, q, y );
|
||||
if ( y[indexWordHi( 4 )] & 0x80000000 ) {
|
||||
--q;
|
||||
softfloat_add128M( y, sigB, y );
|
||||
}
|
||||
qs[ix] = q;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( ((q + 1) & 7) < 2 ) {
|
||||
softfloat_remStep128MBy32( y, 29, sigB, q, y );
|
||||
if ( y[indexWordHi( 4 )] & 0x80000000 ) {
|
||||
--q;
|
||||
softfloat_add128M( y, sigB, y );
|
||||
} else if ( softfloat_compare128M( sigB, y ) <= 0 ) {
|
||||
++q;
|
||||
softfloat_sub128M( y, sigB, y );
|
||||
}
|
||||
if (
|
||||
y[indexWordLo( 4 )] || y[indexWord( 4, 1 )]
|
||||
|| (y[indexWord( 4, 2 )] | y[indexWord( 4, 3 )])
|
||||
) {
|
||||
q |= 1;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q64 = (uint64_t) q<<28;
|
||||
y[indexWord( 5, 0 )] = q64;
|
||||
q64 = ((uint64_t) qs[0]<<25) + (q64>>32);
|
||||
y[indexWord( 5, 1 )] = q64;
|
||||
q64 = ((uint64_t) qs[1]<<22) + (q64>>32);
|
||||
y[indexWord( 5, 2 )] = q64;
|
||||
q64 = ((uint64_t) qs[2]<<19) + (q64>>32);
|
||||
y[indexWord( 5, 3 )] = q64;
|
||||
y[indexWord( 5, 4 )] = q64>>32;
|
||||
softfloat_roundPackMToF128M( signZ, expZ, y, zWPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_invalidF128M( zWPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
infinity:
|
||||
uiZ96 = packToF128UI96( signZ, 0x7FFF, 0 );
|
||||
goto uiZ96;
|
||||
zero:
|
||||
uiZ96 = packToF128UI96( signZ, 0, 0 );
|
||||
uiZ96:
|
||||
zWPtr[indexWordHi( 4 )] = uiZ96;
|
||||
zWPtr[indexWord( 4, 2 )] = 0;
|
||||
zWPtr[indexWord( 4, 1 )] = 0;
|
||||
zWPtr[indexWord( 4, 0 )] = 0;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool f128M_eq( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
|
||||
return f128_eq( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool f128M_eq( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t wordA, wordB, uiA96, uiB96;
|
||||
bool possibleOppositeZeros;
|
||||
uint32_t mashWord;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
wordA = aWPtr[indexWord( 4, 2 )];
|
||||
wordB = bWPtr[indexWord( 4, 2 )];
|
||||
if ( wordA != wordB ) goto false_checkSigNaNs;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
possibleOppositeZeros = false;
|
||||
if ( uiA96 != uiB96 ) {
|
||||
possibleOppositeZeros = (((uiA96 | uiB96) & 0x7FFFFFFF) == 0);
|
||||
if ( ! possibleOppositeZeros ) goto false_checkSigNaNs;
|
||||
}
|
||||
mashWord = wordA | wordB;
|
||||
wordA = aWPtr[indexWord( 4, 1 )];
|
||||
wordB = bWPtr[indexWord( 4, 1 )];
|
||||
if ( wordA != wordB ) goto false_checkSigNaNs;
|
||||
mashWord |= wordA | wordB;
|
||||
wordA = aWPtr[indexWord( 4, 0 )];
|
||||
wordB = bWPtr[indexWord( 4, 0 )];
|
||||
if ( wordA != wordB ) goto false_checkSigNaNs;
|
||||
if ( possibleOppositeZeros && ((mashWord | wordA | wordB) != 0) ) {
|
||||
goto false_checkSigNaNs;
|
||||
}
|
||||
if ( ! softfloat_isNaNF128M( aWPtr ) && ! softfloat_isNaNF128M( bWPtr ) ) {
|
||||
return true;
|
||||
}
|
||||
false_checkSigNaNs:
|
||||
if (
|
||||
f128M_isSignalingNaN( (const float128_t *) aWPtr )
|
||||
|| f128M_isSignalingNaN( (const float128_t *) bWPtr )
|
||||
) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool f128M_eq_signaling( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
|
||||
return f128_eq_signaling( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool f128M_eq_signaling( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t wordA, wordB, uiA96, uiB96;
|
||||
bool possibleOppositeZeros;
|
||||
uint32_t mashWord;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
wordA = aWPtr[indexWord( 4, 2 )];
|
||||
wordB = bWPtr[indexWord( 4, 2 )];
|
||||
if ( wordA != wordB ) return false;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
possibleOppositeZeros = false;
|
||||
if ( uiA96 != uiB96 ) {
|
||||
possibleOppositeZeros = (((uiA96 | uiB96) & 0x7FFFFFFF) == 0);
|
||||
if ( ! possibleOppositeZeros ) return false;
|
||||
}
|
||||
mashWord = wordA | wordB;
|
||||
wordA = aWPtr[indexWord( 4, 1 )];
|
||||
wordB = bWPtr[indexWord( 4, 1 )];
|
||||
if ( wordA != wordB ) return false;
|
||||
mashWord |= wordA | wordB;
|
||||
wordA = aWPtr[indexWord( 4, 0 )];
|
||||
wordB = bWPtr[indexWord( 4, 0 )];
|
||||
return
|
||||
(wordA == wordB)
|
||||
&& (! possibleOppositeZeros || ((mashWord | wordA | wordB) == 0));
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool f128M_le( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
|
||||
return f128_le( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool f128M_le( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t uiA96, uiB96;
|
||||
bool signA, signB;
|
||||
uint32_t wordA, wordB;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
signA = signF128UI96( uiA96 );
|
||||
signB = signF128UI96( uiB96 );
|
||||
if ( signA != signB ) {
|
||||
if ( signA ) return true;
|
||||
if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return false;
|
||||
wordA = aWPtr[indexWord( 4, 2 )];
|
||||
wordB = bWPtr[indexWord( 4, 2 )];
|
||||
if ( wordA | wordB ) return false;
|
||||
wordA = aWPtr[indexWord( 4, 1 )];
|
||||
wordB = bWPtr[indexWord( 4, 1 )];
|
||||
if ( wordA | wordB ) return false;
|
||||
wordA = aWPtr[indexWord( 4, 0 )];
|
||||
wordB = bWPtr[indexWord( 4, 0 )];
|
||||
return ((wordA | wordB) == 0);
|
||||
}
|
||||
if ( signA ) {
|
||||
aWPtr = (const uint32_t *) bPtr;
|
||||
bWPtr = (const uint32_t *) aPtr;
|
||||
}
|
||||
return (softfloat_compare128M( aWPtr, bWPtr ) <= 0);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool f128M_le_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
|
||||
return f128_le_quiet( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool f128M_le_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t uiA96, uiB96;
|
||||
bool signA, signB;
|
||||
uint32_t wordA, wordB;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
||||
if ( f128M_isSignalingNaN( aPtr ) || f128M_isSignalingNaN( bPtr ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
signA = signF128UI96( uiA96 );
|
||||
signB = signF128UI96( uiB96 );
|
||||
if ( signA != signB ) {
|
||||
if ( signA ) return true;
|
||||
if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return false;
|
||||
wordA = aWPtr[indexWord( 4, 2 )];
|
||||
wordB = bWPtr[indexWord( 4, 2 )];
|
||||
if ( wordA | wordB ) return false;
|
||||
wordA = aWPtr[indexWord( 4, 1 )];
|
||||
wordB = bWPtr[indexWord( 4, 1 )];
|
||||
if ( wordA | wordB ) return false;
|
||||
wordA = aWPtr[indexWord( 4, 0 )];
|
||||
wordB = bWPtr[indexWord( 4, 0 )];
|
||||
return ((wordA | wordB) == 0);
|
||||
}
|
||||
if ( signA ) {
|
||||
aWPtr = (const uint32_t *) bPtr;
|
||||
bWPtr = (const uint32_t *) aPtr;
|
||||
}
|
||||
return (softfloat_compare128M( aWPtr, bWPtr ) <= 0);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool f128M_lt( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
|
||||
return f128_lt( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool f128M_lt( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t uiA96, uiB96;
|
||||
bool signA, signB;
|
||||
uint32_t wordA, wordB;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return false;
|
||||
}
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
signA = signF128UI96( uiA96 );
|
||||
signB = signF128UI96( uiB96 );
|
||||
if ( signA != signB ) {
|
||||
if ( signB ) return false;
|
||||
if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return true;
|
||||
wordA = aWPtr[indexWord( 4, 2 )];
|
||||
wordB = bWPtr[indexWord( 4, 2 )];
|
||||
if ( wordA | wordB ) return true;
|
||||
wordA = aWPtr[indexWord( 4, 1 )];
|
||||
wordB = bWPtr[indexWord( 4, 1 )];
|
||||
if ( wordA | wordB ) return true;
|
||||
wordA = aWPtr[indexWord( 4, 0 )];
|
||||
wordB = bWPtr[indexWord( 4, 0 )];
|
||||
return ((wordA | wordB) != 0);
|
||||
}
|
||||
if ( signA ) {
|
||||
aWPtr = (const uint32_t *) bPtr;
|
||||
bWPtr = (const uint32_t *) aPtr;
|
||||
}
|
||||
return (softfloat_compare128M( aWPtr, bWPtr ) < 0);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
bool f128M_lt_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
|
||||
return f128_lt_quiet( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
bool f128M_lt_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t uiA96, uiB96;
|
||||
bool signA, signB;
|
||||
uint32_t wordA, wordB;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
||||
if ( f128M_isSignalingNaN( aPtr ) || f128M_isSignalingNaN( bPtr ) ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
signA = signF128UI96( uiA96 );
|
||||
signB = signF128UI96( uiB96 );
|
||||
if ( signA != signB ) {
|
||||
if ( signB ) return false;
|
||||
if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return true;
|
||||
wordA = aWPtr[indexWord( 4, 2 )];
|
||||
wordB = bWPtr[indexWord( 4, 2 )];
|
||||
if ( wordA | wordB ) return true;
|
||||
wordA = aWPtr[indexWord( 4, 1 )];
|
||||
wordB = bWPtr[indexWord( 4, 1 )];
|
||||
if ( wordA | wordB ) return true;
|
||||
wordA = aWPtr[indexWord( 4, 0 )];
|
||||
wordB = bWPtr[indexWord( 4, 0 )];
|
||||
return ((wordA | wordB) != 0);
|
||||
}
|
||||
if ( signA ) {
|
||||
aWPtr = (const uint32_t *) bPtr;
|
||||
bWPtr = (const uint32_t *) aPtr;
|
||||
}
|
||||
return (softfloat_compare128M( aWPtr, bWPtr ) < 0);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
f128M_mul( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = f128_mul( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
f128M_mul( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t *zWPtr;
|
||||
uint32_t uiA96;
|
||||
int32_t expA;
|
||||
uint32_t uiB96;
|
||||
int32_t expB;
|
||||
bool signZ;
|
||||
const uint32_t *ptr;
|
||||
uint32_t uiZ96, sigA[4];
|
||||
uint_fast8_t shiftCount;
|
||||
uint32_t sigB[4];
|
||||
int32_t expZ;
|
||||
uint32_t sigProd[8], *extSigZPtr;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
zWPtr = (uint32_t *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
expA = expF128UI96( uiA96 );
|
||||
uiB96 = bWPtr[indexWordHi( 4 )];
|
||||
expB = expF128UI96( uiB96 );
|
||||
signZ = signF128UI96( uiA96 ) ^ signF128UI96( uiB96 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
||||
if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
|
||||
ptr = aWPtr;
|
||||
if ( ! expA ) goto possiblyInvalid;
|
||||
if ( ! expB ) {
|
||||
ptr = bWPtr;
|
||||
possiblyInvalid:
|
||||
if (
|
||||
! fracF128UI96( ptr[indexWordHi( 4 )] )
|
||||
&& ! (ptr[indexWord( 4, 2 )] | ptr[indexWord( 4, 1 )]
|
||||
| ptr[indexWord( 4, 0 )])
|
||||
) {
|
||||
softfloat_invalidF128M( zWPtr );
|
||||
return;
|
||||
}
|
||||
}
|
||||
uiZ96 = packToF128UI96( signZ, 0x7FFF, 0 );
|
||||
goto uiZ96;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( expA ) {
|
||||
sigA[indexWordHi( 4 )] = fracF128UI96( uiA96 ) | 0x00010000;
|
||||
sigA[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
||||
sigA[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
||||
sigA[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
||||
} else {
|
||||
expA = softfloat_shiftNormSigF128M( aWPtr, 0, sigA );
|
||||
if ( expA == -128 ) goto zero;
|
||||
}
|
||||
if ( expB ) {
|
||||
sigB[indexWordHi( 4 )] = fracF128UI96( uiB96 ) | 0x00010000;
|
||||
sigB[indexWord( 4, 2 )] = bWPtr[indexWord( 4, 2 )];
|
||||
sigB[indexWord( 4, 1 )] = bWPtr[indexWord( 4, 1 )];
|
||||
sigB[indexWord( 4, 0 )] = bWPtr[indexWord( 4, 0 )];
|
||||
} else {
|
||||
expB = softfloat_shiftNormSigF128M( bWPtr, 0, sigB );
|
||||
if ( expB == -128 ) goto zero;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = expA + expB - 0x4000;
|
||||
softfloat_mul128MTo256M( sigA, sigB, sigProd );
|
||||
if (
|
||||
sigProd[indexWord( 8, 2 )]
|
||||
|| (sigProd[indexWord( 8, 1 )] | sigProd[indexWord( 8, 0 )])
|
||||
) {
|
||||
sigProd[indexWord( 8, 3 )] |= 1;
|
||||
}
|
||||
extSigZPtr = &sigProd[indexMultiwordHi( 8, 5 )];
|
||||
shiftCount = 16;
|
||||
if ( extSigZPtr[indexWordHi( 5 )] & 2 ) {
|
||||
++expZ;
|
||||
shiftCount = 15;
|
||||
}
|
||||
softfloat_shortShiftLeft160M( extSigZPtr, shiftCount, extSigZPtr );
|
||||
softfloat_roundPackMToF128M( signZ, expZ, extSigZPtr, zWPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
zero:
|
||||
uiZ96 = packToF128UI96( signZ, 0, 0 );
|
||||
uiZ96:
|
||||
zWPtr[indexWordHi( 4 )] = uiZ96;
|
||||
zWPtr[indexWord( 4, 2 )] = 0;
|
||||
zWPtr[indexWord( 4, 1 )] = 0;
|
||||
zWPtr[indexWord( 4, 0 )] = 0;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
f128M_mulAdd(
|
||||
const float128_t *aPtr,
|
||||
const float128_t *bPtr,
|
||||
const float128_t *cPtr,
|
||||
float128_t *zPtr
|
||||
)
|
||||
{
|
||||
const uint64_t *aWPtr, *bWPtr, *cWPtr;
|
||||
uint_fast64_t uiA64, uiA0;
|
||||
uint_fast64_t uiB64, uiB0;
|
||||
uint_fast64_t uiC64, uiC0;
|
||||
|
||||
aWPtr = (const uint64_t *) aPtr;
|
||||
bWPtr = (const uint64_t *) bPtr;
|
||||
cWPtr = (const uint64_t *) cPtr;
|
||||
uiA64 = aWPtr[indexWord( 2, 1 )];
|
||||
uiA0 = aWPtr[indexWord( 2, 0 )];
|
||||
uiB64 = bWPtr[indexWord( 2, 1 )];
|
||||
uiB0 = bWPtr[indexWord( 2, 0 )];
|
||||
uiC64 = cWPtr[indexWord( 2, 1 )];
|
||||
uiC0 = cWPtr[indexWord( 2, 0 )];
|
||||
*zPtr = softfloat_mulAddF128( uiA64, uiA0, uiB64, uiB0, uiC64, uiC0, 0 );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
f128M_mulAdd(
|
||||
const float128_t *aPtr,
|
||||
const float128_t *bPtr,
|
||||
const float128_t *cPtr,
|
||||
float128_t *zPtr
|
||||
)
|
||||
{
|
||||
|
||||
softfloat_mulAddF128M(
|
||||
(const uint32_t *) aPtr,
|
||||
(const uint32_t *) bPtr,
|
||||
(const uint32_t *) cPtr,
|
||||
(uint32_t *) zPtr,
|
||||
0
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,179 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
f128M_rem( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = f128_rem( *aPtr, *bPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
f128M_rem( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
const uint32_t *aWPtr, *bWPtr;
|
||||
uint32_t *zWPtr, uiA96;
|
||||
int32_t expA, expB;
|
||||
uint32_t x[4], rem1[5], *remPtr;
|
||||
bool signRem;
|
||||
int32_t expDiff;
|
||||
uint32_t q, recip32;
|
||||
uint64_t q64;
|
||||
uint32_t rem2[5], *altRemPtr, *newRemPtr, wordMeanRem;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
bWPtr = (const uint32_t *) bPtr;
|
||||
zWPtr = (uint32_t *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
expA = expF128UI96( uiA96 );
|
||||
expB = expF128UI96( bWPtr[indexWordHi( 4 )] );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
||||
if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
|
||||
if ( expA == 0x7FFF ) goto invalid;
|
||||
goto copyA;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( expA < expB - 1 ) goto copyA;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expB = softfloat_shiftNormSigF128M( bWPtr, 13, x );
|
||||
if ( expB == -128 ) goto invalid;
|
||||
remPtr = &rem1[indexMultiwordLo( 5, 4 )];
|
||||
expA = softfloat_shiftNormSigF128M( aWPtr, 13, remPtr );
|
||||
if ( expA == -128 ) goto copyA;
|
||||
signRem = signF128UI96( uiA96 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expDiff = expA - expB;
|
||||
if ( expDiff < 1 ) {
|
||||
if ( expDiff < -1 ) goto copyA;
|
||||
if ( expDiff ) {
|
||||
--expB;
|
||||
softfloat_add128M( x, x, x );
|
||||
q = 0;
|
||||
} else {
|
||||
q = (softfloat_compare128M( x, remPtr ) <= 0);
|
||||
if ( q ) softfloat_sub128M( remPtr, x, remPtr );
|
||||
}
|
||||
} else {
|
||||
recip32 =
|
||||
softfloat_approxRecip32_1(
|
||||
((uint64_t) x[indexWord( 4, 3 )]<<32 | x[indexWord( 4, 2 )])
|
||||
>>30
|
||||
);
|
||||
expDiff -= 30;
|
||||
for (;;) {
|
||||
q64 = (uint64_t) remPtr[indexWordHi( 4 )] * recip32;
|
||||
if ( expDiff < 0 ) break;
|
||||
q = (q64 + 0x80000000)>>32;
|
||||
softfloat_remStep128MBy32( remPtr, 29, x, q, remPtr );
|
||||
if ( remPtr[indexWordHi( 4 )] & 0x80000000 ) {
|
||||
softfloat_add128M( remPtr, x, remPtr );
|
||||
}
|
||||
expDiff -= 29;
|
||||
}
|
||||
/*--------------------------------------------------------------------
|
||||
| (`expDiff' cannot be less than -29 here.)
|
||||
*--------------------------------------------------------------------*/
|
||||
q = (uint32_t) (q64>>32)>>(~expDiff & 31);
|
||||
softfloat_remStep128MBy32( remPtr, expDiff + 30, x, q, remPtr );
|
||||
if ( remPtr[indexWordHi( 4 )] & 0x80000000 ) {
|
||||
altRemPtr = &rem2[indexMultiwordLo( 5, 4 )];
|
||||
softfloat_add128M( remPtr, x, altRemPtr );
|
||||
goto selectRem;
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
altRemPtr = &rem2[indexMultiwordLo( 5, 4 )];
|
||||
do {
|
||||
++q;
|
||||
newRemPtr = altRemPtr;
|
||||
softfloat_sub128M( remPtr, x, newRemPtr );
|
||||
altRemPtr = remPtr;
|
||||
remPtr = newRemPtr;
|
||||
} while ( ! (remPtr[indexWordHi( 4 )] & 0x80000000) );
|
||||
selectRem:
|
||||
softfloat_add128M( remPtr, altRemPtr, x );
|
||||
wordMeanRem = x[indexWordHi( 4 )];
|
||||
if (
|
||||
(wordMeanRem & 0x80000000)
|
||||
|| (! wordMeanRem && (q & 1) && ! x[indexWord( 4, 0 )]
|
||||
&& ! (x[indexWord( 4, 2 )] | x[indexWord( 4, 1 )]))
|
||||
) {
|
||||
remPtr = altRemPtr;
|
||||
}
|
||||
if ( remPtr[indexWordHi( 4 )] & 0x80000000 ) {
|
||||
signRem = ! signRem;
|
||||
softfloat_negX128M( remPtr );
|
||||
}
|
||||
remPtr -= indexMultiwordLo( 5, 4 );
|
||||
remPtr[indexWordHi( 5 )] = 0;
|
||||
softfloat_normRoundPackMToF128M( signRem, expB + 18, remPtr, zWPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_invalidF128M( zWPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
copyA:
|
||||
zWPtr[indexWordHi( 4 )] = uiA96;
|
||||
zWPtr[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
||||
zWPtr[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
||||
zWPtr[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,212 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
f128M_roundToInt(
|
||||
const float128_t *aPtr,
|
||||
uint_fast8_t roundingMode,
|
||||
bool exact,
|
||||
float128_t *zPtr
|
||||
)
|
||||
{
|
||||
|
||||
*zPtr = f128_roundToInt( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
f128M_roundToInt(
|
||||
const float128_t *aPtr,
|
||||
uint_fast8_t roundingMode,
|
||||
bool exact,
|
||||
float128_t *zPtr
|
||||
)
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t *zWPtr;
|
||||
uint32_t ui96;
|
||||
int32_t exp;
|
||||
uint32_t sigExtra;
|
||||
bool sign;
|
||||
uint_fast8_t bitPos;
|
||||
bool roundNear;
|
||||
unsigned int index, lastIndex;
|
||||
bool extra;
|
||||
uint32_t wordA, bit, wordZ;
|
||||
uint_fast8_t carry;
|
||||
uint32_t extrasMask;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
zWPtr = (uint32_t *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
ui96 = aWPtr[indexWordHi( 4 )];
|
||||
exp = expF128UI96( ui96 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( exp < 0x3FFF ) {
|
||||
zWPtr[indexWord( 4, 2 )] = 0;
|
||||
zWPtr[indexWord( 4, 1 )] = 0;
|
||||
zWPtr[indexWord( 4, 0 )] = 0;
|
||||
sigExtra = aWPtr[indexWord( 4, 2 )];
|
||||
if ( ! sigExtra ) {
|
||||
sigExtra = aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )];
|
||||
}
|
||||
if ( ! sigExtra && ! (ui96 & 0x7FFFFFFF) ) goto ui96;
|
||||
if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
sign = signF128UI96( ui96 );
|
||||
switch ( roundingMode ) {
|
||||
case softfloat_round_near_even:
|
||||
if ( ! fracF128UI96( ui96 ) && ! sigExtra ) break;
|
||||
case softfloat_round_near_maxMag:
|
||||
if ( exp == 0x3FFE ) goto mag1;
|
||||
break;
|
||||
case softfloat_round_min:
|
||||
if ( sign ) goto mag1;
|
||||
break;
|
||||
case softfloat_round_max:
|
||||
if ( ! sign ) goto mag1;
|
||||
break;
|
||||
}
|
||||
ui96 = packToF128UI96( sign, 0, 0 );
|
||||
goto ui96;
|
||||
mag1:
|
||||
ui96 = packToF128UI96( sign, 0x3FFF, 0 );
|
||||
goto ui96;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( 0x406F <= exp ) {
|
||||
if (
|
||||
(exp == 0x7FFF)
|
||||
&& (fracF128UI96( ui96 )
|
||||
|| (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
||||
| aWPtr[indexWord( 4, 0 )]))
|
||||
) {
|
||||
softfloat_propagateNaNF128M( aWPtr, 0, zWPtr );
|
||||
return;
|
||||
}
|
||||
zWPtr[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
||||
zWPtr[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
||||
zWPtr[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
||||
goto ui96;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
bitPos = 0x406F - exp;
|
||||
roundNear =
|
||||
(roundingMode == softfloat_round_near_maxMag)
|
||||
|| (roundingMode == softfloat_round_near_even);
|
||||
bitPos -= roundNear;
|
||||
index = indexWordLo( 4 );
|
||||
lastIndex = indexWordHi( 4 );
|
||||
extra = 0;
|
||||
for (;;) {
|
||||
wordA = aWPtr[index];
|
||||
if ( bitPos < 32 ) break;
|
||||
if ( wordA ) extra = 1;
|
||||
zWPtr[index] = 0;
|
||||
index += wordIncr;
|
||||
bitPos -= 32;
|
||||
}
|
||||
bit = (uint32_t) 1<<bitPos;
|
||||
if ( roundNear ) {
|
||||
wordZ = wordA + bit;
|
||||
carry = (wordZ < wordA);
|
||||
bit <<= 1;
|
||||
extrasMask = bit - 1;
|
||||
if (
|
||||
(roundingMode == softfloat_round_near_even)
|
||||
&& ! extra && ! (wordZ & extrasMask)
|
||||
) {
|
||||
if ( ! bit ) {
|
||||
zWPtr[index] = wordZ;
|
||||
index += wordIncr;
|
||||
wordZ = aWPtr[index] + carry;
|
||||
carry &= ! wordZ;
|
||||
zWPtr[index] = wordZ & ~1;
|
||||
goto propagateCarry;
|
||||
}
|
||||
wordZ &= ~bit;
|
||||
}
|
||||
} else {
|
||||
extrasMask = bit - 1;
|
||||
wordZ = wordA;
|
||||
carry = 0;
|
||||
if (
|
||||
(roundingMode != softfloat_round_minMag)
|
||||
&& (signF128UI96( ui96 ) ^ (roundingMode == softfloat_round_max))
|
||||
) {
|
||||
if ( extra || (wordA & extrasMask) ) {
|
||||
wordZ += bit;
|
||||
carry = (wordZ < wordA);
|
||||
}
|
||||
}
|
||||
}
|
||||
wordZ &= ~extrasMask;
|
||||
zWPtr[index] = wordZ;
|
||||
propagateCarry:
|
||||
while ( index != lastIndex ) {
|
||||
index += wordIncr;
|
||||
wordZ = aWPtr[index] + carry;
|
||||
zWPtr[index] = wordZ;
|
||||
carry &= ! wordZ;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( exact && (softfloat_compare128M( aWPtr, zWPtr ) != 0) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
ui96:
|
||||
zWPtr[indexWordHi( 4 )] = ui96;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,213 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void f128M_sqrt( const float128_t *aPtr, float128_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = f128_sqrt( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void f128M_sqrt( const float128_t *aPtr, float128_t *zPtr )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t *zWPtr;
|
||||
uint32_t uiA96;
|
||||
bool signA;
|
||||
int32_t rawExpA;
|
||||
uint32_t rem[6];
|
||||
int32_t expA, expZ;
|
||||
uint64_t rem64;
|
||||
uint32_t sig32A, recipSqrt32, sig32Z, qs[3], q;
|
||||
uint64_t sig64Z, x64;
|
||||
uint32_t term[5], y[5], rem32;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
zWPtr = (uint32_t *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
signA = signF128UI96( uiA96 );
|
||||
rawExpA = expF128UI96( uiA96 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( rawExpA == 0x7FFF ) {
|
||||
if (
|
||||
fracF128UI96( uiA96 )
|
||||
|| (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
||||
| aWPtr[indexWord( 4, 0 )])
|
||||
) {
|
||||
softfloat_propagateNaNF128M( aWPtr, 0, zWPtr );
|
||||
return;
|
||||
}
|
||||
if ( ! signA ) goto copyA;
|
||||
goto invalid;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
expA = softfloat_shiftNormSigF128M( aWPtr, 13 - (rawExpA & 1), rem );
|
||||
if ( expA == -128 ) goto copyA;
|
||||
if ( signA ) goto invalid;
|
||||
/*------------------------------------------------------------------------
|
||||
| (`sig32Z' is guaranteed to be a lower bound on the square root of
|
||||
| `sig32A', which makes `sig32Z' also a lower bound on the square root of
|
||||
| `sigA'.)
|
||||
*------------------------------------------------------------------------*/
|
||||
expZ = ((expA - 0x3FFF)>>1) + 0x3FFE;
|
||||
expA &= 1;
|
||||
rem64 = (uint64_t) rem[indexWord( 4, 3 )]<<32 | rem[indexWord( 4, 2 )];
|
||||
if ( expA ) {
|
||||
if ( ! rawExpA ) {
|
||||
softfloat_shortShiftRight128M( rem, 1, rem );
|
||||
rem64 >>= 1;
|
||||
}
|
||||
sig32A = rem64>>29;
|
||||
} else {
|
||||
sig32A = rem64>>30;
|
||||
}
|
||||
recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
||||
sig32Z = ((uint64_t) sig32A * recipSqrt32)>>32;
|
||||
if ( expA ) sig32Z >>= 1;
|
||||
qs[2] = sig32Z;
|
||||
rem64 -= (uint64_t) sig32Z * sig32Z;
|
||||
rem[indexWord( 4, 3 )] = rem64>>32;
|
||||
rem[indexWord( 4, 2 )] = rem64;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q = ((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32;
|
||||
qs[1] = q;
|
||||
sig64Z = ((uint64_t) sig32Z<<32) + ((uint64_t) q<<3);
|
||||
x64 = ((uint64_t) sig32Z<<32) + sig64Z;
|
||||
term[indexWord( 4, 3 )] = 0;
|
||||
term[indexWord( 4, 2 )] = x64>>32;
|
||||
term[indexWord( 4, 1 )] = x64;
|
||||
term[indexWord( 4, 0 )] = 0;
|
||||
softfloat_remStep128MBy32( rem, 29, term, q, y );
|
||||
rem64 = (uint64_t) y[indexWord( 4, 3 )]<<32 | y[indexWord( 4, 2 )];
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q = ((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32;
|
||||
sig64Z <<= 1;
|
||||
/*------------------------------------------------------------------------
|
||||
| (Repeating this loop is a rare occurrence.)
|
||||
*------------------------------------------------------------------------*/
|
||||
for (;;) {
|
||||
x64 = sig64Z + (q>>26);
|
||||
term[indexWord( 4, 2 )] = x64>>32;
|
||||
term[indexWord( 4, 1 )] = x64;
|
||||
term[indexWord( 4, 0 )] = q<<6;
|
||||
term[indexWord( 4, 3 )] = 0;
|
||||
softfloat_remStep128MBy32(
|
||||
y, 29, term, q, &rem[indexMultiwordHi( 6, 4 )] );
|
||||
rem32 = rem[indexWordHi( 6 )];
|
||||
if ( ! (rem32 & 0x80000000) ) break;
|
||||
--q;
|
||||
}
|
||||
qs[0] = q;
|
||||
rem64 = (uint64_t) rem32<<32 | rem[indexWord( 6, 4 )];
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
q = (((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32) + 2;
|
||||
x64 = (uint64_t) q<<27;
|
||||
y[indexWord( 5, 0 )] = x64;
|
||||
x64 = ((uint64_t) qs[0]<<24) + (x64>>32);
|
||||
y[indexWord( 5, 1 )] = x64;
|
||||
x64 = ((uint64_t) qs[1]<<21) + (x64>>32);
|
||||
y[indexWord( 5, 2 )] = x64;
|
||||
x64 = ((uint64_t) qs[2]<<18) + (x64>>32);
|
||||
y[indexWord( 5, 3 )] = x64;
|
||||
y[indexWord( 5, 4 )] = x64>>32;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( (q & 0xF) <= 2 ) {
|
||||
q &= ~3;
|
||||
y[indexWordLo( 5 )] = q<<27;
|
||||
term[indexWord( 5, 4 )] = 0;
|
||||
term[indexWord( 5, 3 )] = 0;
|
||||
term[indexWord( 5, 2 )] = 0;
|
||||
term[indexWord( 5, 1 )] = q>>6;
|
||||
term[indexWord( 5, 0 )] = q<<26;
|
||||
softfloat_sub160M( y, term, term );
|
||||
rem[indexWord( 6, 1 )] = 0;
|
||||
rem[indexWord( 6, 0 )] = 0;
|
||||
softfloat_remStep160MBy32(
|
||||
&rem[indexMultiwordLo( 6, 5 )],
|
||||
14,
|
||||
term,
|
||||
q,
|
||||
&rem[indexMultiwordLo( 6, 5 )]
|
||||
);
|
||||
rem32 = rem[indexWord( 6, 4 )];
|
||||
if ( rem32 & 0x80000000 ) {
|
||||
softfloat_sub1X160M( y );
|
||||
} else {
|
||||
if (
|
||||
rem32 || rem[indexWord( 6, 0 )] || rem[indexWord( 6, 1 )]
|
||||
|| (rem[indexWord( 6, 3 )] | rem[indexWord( 6, 2 )])
|
||||
) {
|
||||
y[indexWordLo( 5 )] |= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
softfloat_roundPackMToF128M( 0, expZ, y, zWPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
invalid:
|
||||
softfloat_invalidF128M( zWPtr );
|
||||
return;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
copyA:
|
||||
zWPtr[indexWordHi( 4 )] = uiA96;
|
||||
zWPtr[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
||||
zWPtr[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
||||
zWPtr[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void
|
||||
f128M_sub( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
const uint64_t *aWPtr, *bWPtr;
|
||||
uint_fast64_t uiA64, uiA0;
|
||||
bool signA;
|
||||
uint_fast64_t uiB64, uiB0;
|
||||
bool signB;
|
||||
float128_t
|
||||
(*magsFuncPtr)(
|
||||
uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );
|
||||
|
||||
aWPtr = (const uint64_t *) aPtr;
|
||||
bWPtr = (const uint64_t *) bPtr;
|
||||
uiA64 = aWPtr[indexWord( 2, 1 )];
|
||||
uiA0 = aWPtr[indexWord( 2, 0 )];
|
||||
signA = signF128UI64( uiA64 );
|
||||
uiB64 = bWPtr[indexWord( 2, 1 )];
|
||||
uiB0 = bWPtr[indexWord( 2, 0 )];
|
||||
signB = signF128UI64( uiB64 );
|
||||
magsFuncPtr =
|
||||
(signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128;
|
||||
*zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
f128M_sub( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
||||
{
|
||||
|
||||
softfloat_addF128M(
|
||||
(const uint32_t *) aPtr,
|
||||
(const uint32_t *) bPtr,
|
||||
(uint32_t *) zPtr,
|
||||
true
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
void f128M_to_extF80M( const float128_t *aPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
|
||||
*zPtr = f128_to_extF80( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void f128M_to_extF80M( const float128_t *aPtr, extFloat80_t *zPtr )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
struct extFloat80M *zSPtr;
|
||||
uint32_t uiA96;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
struct commonNaN commonNaN;
|
||||
uint32_t sig[4];
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
zSPtr = (struct extFloat80M *) zPtr;
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
sign = signF128UI96( uiA96 );
|
||||
exp = expF128UI96( uiA96 );
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( softfloat_isNaNF128M( aWPtr ) ) {
|
||||
softfloat_f128MToCommonNaN( aWPtr, &commonNaN );
|
||||
softfloat_commonNaNToExtF80M( &commonNaN, zSPtr );
|
||||
return;
|
||||
}
|
||||
zSPtr->signExp = packToExtF80UI64( sign, 0x7FFF );
|
||||
zSPtr->signif = UINT64_C( 0x8000000000000000 );
|
||||
return;
|
||||
}
|
||||
/*------------------------------------------------------------------------
|
||||
*------------------------------------------------------------------------*/
|
||||
exp = softfloat_shiftNormSigF128M( aWPtr, 15, sig );
|
||||
if ( exp == -128 ) {
|
||||
zSPtr->signExp = packToExtF80UI64( sign, 0 );
|
||||
zSPtr->signif = 0;
|
||||
return;
|
||||
}
|
||||
if ( sig[indexWord( 4, 0 )] ) sig[indexWord( 4, 1 )] |= 1;
|
||||
softfloat_roundPackMToExtF80M(
|
||||
sign, exp, &sig[indexMultiwordHi( 4, 3 )], 80, zSPtr );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
float32_t f128M_to_f32( const float128_t *aPtr )
|
||||
{
|
||||
|
||||
return f128_to_f32( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
float32_t f128M_to_f32( const float128_t *aPtr )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t uiA96;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig64;
|
||||
struct commonNaN commonNaN;
|
||||
uint32_t uiZ, sig32;
|
||||
union ui32_f32 uZ;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
sign = signF128UI96( uiA96 );
|
||||
exp = expF128UI96( uiA96 );
|
||||
sig64 =
|
||||
(uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )]
|
||||
| ((aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )]) != 0);
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sig64 ) {
|
||||
softfloat_f128MToCommonNaN( aWPtr, &commonNaN );
|
||||
uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
||||
} else {
|
||||
uiZ = packToF32UI( sign, 0xFF, 0 );
|
||||
}
|
||||
goto uiZ;
|
||||
}
|
||||
sig32 = softfloat_shortShiftRightJam64( sig64, 18 );
|
||||
if ( ! (exp | sig32) ) {
|
||||
uiZ = packToF32UI( sign, 0, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
exp -= 0x3F81;
|
||||
if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
||||
if ( exp < -0x1000 ) exp = -0x1000;
|
||||
}
|
||||
return softfloat_roundPackToF32( sign, exp, sig32 | 0x40000000 );
|
||||
uiZ:
|
||||
uZ.ui = uiZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "specialize.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
float64_t f128M_to_f64( const float128_t *aPtr )
|
||||
{
|
||||
|
||||
return f128_to_f64( *aPtr );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
float64_t f128M_to_f64( const float128_t *aPtr )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t uiA96;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig64;
|
||||
struct commonNaN commonNaN;
|
||||
uint64_t uiZ;
|
||||
uint32_t sig32;
|
||||
union ui64_f64 uZ;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
sign = signF128UI96( uiA96 );
|
||||
exp = expF128UI96( uiA96 );
|
||||
sig64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
||||
if ( exp == 0x7FFF ) {
|
||||
if ( sig64 || aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) {
|
||||
softfloat_f128MToCommonNaN( aWPtr, &commonNaN );
|
||||
uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
||||
} else {
|
||||
uiZ = packToF64UI( sign, 0x7FF, 0 );
|
||||
}
|
||||
goto uiZ;
|
||||
}
|
||||
sig32 = aWPtr[indexWord( 4, 1 )];
|
||||
sig64 = sig64<<14 | sig32>>18;
|
||||
if ( (sig32 & 0x0003FFFF) || aWPtr[indexWord( 4, 0 )] ) sig64 |= 1;
|
||||
if ( ! exp && ! sig64 ) {
|
||||
uiZ = packToF64UI( sign, 0, 0 );
|
||||
goto uiZ;
|
||||
}
|
||||
exp -= 0x3C01;
|
||||
if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
||||
if ( exp < -0x1000 ) exp = -0x1000;
|
||||
}
|
||||
return
|
||||
softfloat_roundPackToF64(
|
||||
sign, exp, sig64 | UINT64_C( 0x4000000000000000 ) );
|
||||
uiZ:
|
||||
uZ.ui = uiZ;
|
||||
return uZ.f;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast32_t
|
||||
f128M_to_i32( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
|
||||
return f128_to_i32( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast32_t
|
||||
f128M_to_i32( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t uiA96;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig64;
|
||||
bool notZeroSig0;
|
||||
int32_t shiftCount;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
sign = signF128UI96( uiA96 );
|
||||
exp = expF128UI96( uiA96 );
|
||||
sig64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
||||
notZeroSig0 = false;
|
||||
if ( aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) {
|
||||
sig64 |= 1;
|
||||
notZeroSig0 = true;
|
||||
}
|
||||
if ( (exp == 0x7FFF) && (notZeroSig0 || sig64) ) sign = 0;
|
||||
if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );
|
||||
shiftCount = 0x4028 - exp;
|
||||
if ( 0 < shiftCount ) {
|
||||
sig64 = softfloat_shiftRightJam64( sig64, shiftCount );
|
||||
}
|
||||
return softfloat_roundPackToI32( sign, sig64, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast32_t f128M_to_i32_r_minMag( const float128_t *aPtr, bool exact )
|
||||
{
|
||||
|
||||
return f128_to_i32_r_minMag( *aPtr, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast32_t f128M_to_i32_r_minMag( const float128_t *aPtr, bool exact )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t uiA96;
|
||||
bool sign;
|
||||
int32_t exp;
|
||||
uint64_t sig64;
|
||||
int32_t shiftCount;
|
||||
uint32_t absZ, uiZ;
|
||||
union { uint32_t ui; int32_t i; } uZ;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
sign = signF128UI96( uiA96 );
|
||||
exp = expF128UI96( uiA96 );
|
||||
sig64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
||||
if ( aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) sig64 |= 1;
|
||||
if ( exp < 0x3FFF ) {
|
||||
if ( exact && (exp | sig64) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if ( 0x401F <= exp ) goto invalid;
|
||||
shiftCount = 0x402F - exp;
|
||||
sig64 |= UINT64_C( 0x0001000000000000 );
|
||||
absZ = sig64>>shiftCount;
|
||||
uiZ = sign ? -absZ : absZ;
|
||||
if ( uiZ>>31 != sign ) goto invalid;
|
||||
if ( exact && ((uint64_t) absZ<<shiftCount != sig64) ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
uZ.ui = uiZ;
|
||||
return uZ.i;
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return sign ? -0x7FFFFFFF - 1 : 0x7FFFFFFF;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast64_t
|
||||
f128M_to_i64( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
|
||||
return f128_to_i64( *aPtr, roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast64_t
|
||||
f128M_to_i64( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t uiA96;
|
||||
int32_t exp;
|
||||
bool sign;
|
||||
uint32_t sig96;
|
||||
int32_t shiftCount;
|
||||
uint32_t sig[4];
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
exp = expF128UI96( uiA96 );
|
||||
sign = signF128UI96( uiA96 );
|
||||
sig96 = fracF128UI96( uiA96 );
|
||||
shiftCount = 0x404F - exp;
|
||||
if ( shiftCount < 17 ) {
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return
|
||||
! sign
|
||||
|| ((exp == 0x7FFF)
|
||||
&& (sig96
|
||||
|| ( aWPtr[indexWord( 4, 2 )]
|
||||
| aWPtr[indexWord( 4, 1 )]
|
||||
| aWPtr[indexWord( 4, 0 )]
|
||||
)))
|
||||
? INT64_C( 0x7FFFFFFFFFFFFFFF )
|
||||
: -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
||||
}
|
||||
if ( exp ) sig96 |= 0x00010000;
|
||||
sig[indexWord( 4, 3 )] = sig96;
|
||||
sig[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
||||
sig[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
||||
sig[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
||||
softfloat_shiftRightJam128M( sig, shiftCount, sig );
|
||||
return
|
||||
softfloat_roundPackMToI64(
|
||||
sign, sig + indexMultiwordLo( 4, 3 ), roundingMode, exact );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
|
||||
/*============================================================================
|
||||
|
||||
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California
|
||||
(Regents). All Rights Reserved. Redistribution and use in source and binary
|
||||
forms, with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following two paragraphs of disclaimer in the
|
||||
documentation and/or other materials provided with the distribution. Neither
|
||||
the name of the Regents nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
|
||||
OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
|
||||
HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
|
||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "platform.h"
|
||||
#include "internals.h"
|
||||
#include "softfloat.h"
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
int_fast64_t f128M_to_i64_r_minMag( const float128_t *aPtr, bool exact )
|
||||
{
|
||||
|
||||
return f128_to_i64_r_minMag( *aPtr, exact );
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int_fast64_t f128M_to_i64_r_minMag( const float128_t *aPtr, bool exact )
|
||||
{
|
||||
const uint32_t *aWPtr;
|
||||
uint32_t uiA96;
|
||||
bool sign;
|
||||
int32_t exp, shiftCount;
|
||||
uint32_t sig96, sig[4];
|
||||
uint64_t uiZ;
|
||||
union { uint64_t ui; int64_t i; } uZ;
|
||||
|
||||
aWPtr = (const uint32_t *) aPtr;
|
||||
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||
sign = signF128UI96( uiA96 );
|
||||
exp = expF128UI96( uiA96 );
|
||||
shiftCount = 0x403E - exp;
|
||||
if ( shiftCount < 0 ) goto invalid;
|
||||
if ( exact ) {
|
||||
sig96 = fracF128UI96( uiA96 );
|
||||
if ( exp ) sig96 |= 0x00010000;
|
||||
sig[indexWord( 4, 3 )] = sig96;
|
||||
sig[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
||||
sig[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
||||
sig[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
||||
softfloat_shiftRightJam128M( sig, shiftCount + 17, sig );
|
||||
uiZ = (uint64_t) sig[indexWord( 4, 2 )]<<32 | sig[indexWord( 4, 1 )];
|
||||
if ( uiZ>>63 && (! sign || (uiZ != UINT64_C( 0x8000000000000000 ))) ) {
|
||||
goto invalid;
|
||||
}
|
||||
if ( sig[indexWordLo( 4 )] ) {
|
||||
softfloat_exceptionFlags |= softfloat_flag_inexact;
|
||||
}
|
||||
} else {
|
||||
if ( 64 <= shiftCount ) return 0;
|
||||
uiZ =
|
||||
(uint64_t) fracF128UI96( uiA96 )<<47
|
||||
| (uint64_t) aWPtr[indexWord( 4, 2 )]<<15
|
||||
| aWPtr[indexWord( 4, 1 )]>>17;
|
||||
if ( shiftCount ) {
|
||||
uiZ |= UINT64_C( 0x8000000000000000 );
|
||||
uiZ >>= shiftCount;
|
||||
} else {
|
||||
if ( uiZ || ! sign ) goto invalid;
|
||||
uiZ |= UINT64_C( 0x8000000000000000 );
|
||||
}
|
||||
}
|
||||
if ( sign ) uiZ = -uiZ;
|
||||
uZ.ui = uiZ;
|
||||
return uZ.i;
|
||||
invalid:
|
||||
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||
return
|
||||
sign && ! softfloat_isNaNF128M( aWPtr )
|
||||
? -UINT64_C( 0x7FFFFFFFFFFFFFFF ) - 1
|
||||
: UINT64_C( 0x7FFFFFFFFFFFFFFF );
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue