497 lines
16 KiB
C
497 lines
16 KiB
C
|
/*============================================================================
|
||
|
This C header file 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.
|
||
|
=============================================================================*/
|
||
|
|
||
|
/*============================================================================
|
||
|
* Adapted for Bochs (x86 achitecture simulator) by
|
||
|
* Stanislav Shwartsman [sshwarts at sourceforge net]
|
||
|
* ==========================================================================*/
|
||
|
|
||
|
#ifndef _SOFTFLOAT_COMPARE_H_
|
||
|
#define _SOFTFLOAT_COMPARE_H_
|
||
|
|
||
|
#include "softfloat.h"
|
||
|
|
||
|
// ======= float32 ======= //
|
||
|
|
||
|
typedef int (*float32_compare_method)(float32, float32, float_status_t &status);
|
||
|
|
||
|
// 0x00
|
||
|
BX_CPP_INLINE int float32_eq_ordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x01
|
||
|
BX_CPP_INLINE int float32_lt_ordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x02
|
||
|
BX_CPP_INLINE int float32_le_ordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x03
|
||
|
BX_CPP_INLINE int float32_unordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x04
|
||
|
BX_CPP_INLINE int float32_neq_unordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x05
|
||
|
BX_CPP_INLINE int float32_nlt_unordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation != float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x06
|
||
|
BX_CPP_INLINE int float32_nle_unordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation != float_relation_less) && (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x07
|
||
|
BX_CPP_INLINE int float32_ordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x08
|
||
|
BX_CPP_INLINE int float32_eq_unordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_equal) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x09
|
||
|
BX_CPP_INLINE int float32_nge_unordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x0a
|
||
|
BX_CPP_INLINE int float32_ngt_unordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation != float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x0b
|
||
|
BX_CPP_INLINE int float32_false_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
float32_compare_quiet(a, b, status);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// 0x0c
|
||
|
BX_CPP_INLINE int float32_neq_ordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_equal) && (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x0d
|
||
|
BX_CPP_INLINE int float32_ge_ordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_greater) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x0e
|
||
|
BX_CPP_INLINE int float32_gt_ordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x0f
|
||
|
BX_CPP_INLINE int float32_true_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
float32_compare_quiet(a, b, status);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// 0x10
|
||
|
BX_CPP_INLINE int float32_eq_ordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x11
|
||
|
BX_CPP_INLINE int float32_lt_ordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x12
|
||
|
BX_CPP_INLINE int float32_le_ordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x13
|
||
|
BX_CPP_INLINE int float32_unordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x14
|
||
|
BX_CPP_INLINE int float32_neq_unordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x15
|
||
|
BX_CPP_INLINE int float32_nlt_unordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x16
|
||
|
BX_CPP_INLINE int float32_nle_unordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_less) && (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x17
|
||
|
BX_CPP_INLINE int float32_ordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x18
|
||
|
BX_CPP_INLINE int float32_eq_unordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation == float_relation_equal) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x19
|
||
|
BX_CPP_INLINE int float32_nge_unordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x1a
|
||
|
BX_CPP_INLINE int float32_ngt_unordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x1b
|
||
|
BX_CPP_INLINE int float32_false_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
float32_compare(a, b, status);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// 0x1c
|
||
|
BX_CPP_INLINE int float32_neq_ordered_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare(a, b, status);
|
||
|
return (relation != float_relation_equal) && (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x1d
|
||
|
BX_CPP_INLINE int float32_ge_ordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_greater) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x1e
|
||
|
BX_CPP_INLINE int float32_gt_ordered_quiet(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float32_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x1f
|
||
|
BX_CPP_INLINE int float32_true_signalling(float32 a, float32 b, float_status_t &status)
|
||
|
{
|
||
|
float32_compare(a, b, status);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// ======= float64 ======= //
|
||
|
|
||
|
typedef int (*float64_compare_method)(float64, float64, float_status_t &status);
|
||
|
|
||
|
// 0x00
|
||
|
BX_CPP_INLINE int float64_eq_ordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x01
|
||
|
BX_CPP_INLINE int float64_lt_ordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x02
|
||
|
BX_CPP_INLINE int float64_le_ordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x03
|
||
|
BX_CPP_INLINE int float64_unordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x04
|
||
|
BX_CPP_INLINE int float64_neq_unordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x05
|
||
|
BX_CPP_INLINE int float64_nlt_unordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation != float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x06
|
||
|
BX_CPP_INLINE int float64_nle_unordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation != float_relation_less) && (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x07
|
||
|
BX_CPP_INLINE int float64_ordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x08
|
||
|
BX_CPP_INLINE int float64_eq_unordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_equal) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x09
|
||
|
BX_CPP_INLINE int float64_nge_unordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x0a
|
||
|
BX_CPP_INLINE int float64_ngt_unordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation != float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x0b
|
||
|
BX_CPP_INLINE int float64_false_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
float64_compare_quiet(a, b, status);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// 0x0c
|
||
|
BX_CPP_INLINE int float64_neq_ordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_equal) && (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x0d
|
||
|
BX_CPP_INLINE int float64_ge_ordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_greater) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x0e
|
||
|
BX_CPP_INLINE int float64_gt_ordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x0f
|
||
|
BX_CPP_INLINE int float64_true_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
float64_compare_quiet(a, b, status);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// 0x10
|
||
|
BX_CPP_INLINE int float64_eq_ordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x11
|
||
|
BX_CPP_INLINE int float64_lt_ordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x12
|
||
|
BX_CPP_INLINE int float64_le_ordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x13
|
||
|
BX_CPP_INLINE int float64_unordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x14
|
||
|
BX_CPP_INLINE int float64_neq_unordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x15
|
||
|
BX_CPP_INLINE int float64_nlt_unordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_less);
|
||
|
}
|
||
|
|
||
|
// 0x16
|
||
|
BX_CPP_INLINE int float64_nle_unordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_less) && (relation != float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x17
|
||
|
BX_CPP_INLINE int float64_ordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x18
|
||
|
BX_CPP_INLINE int float64_eq_unordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation == float_relation_equal) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x19
|
||
|
BX_CPP_INLINE int float64_nge_unordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_less) || (relation == float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x1a
|
||
|
BX_CPP_INLINE int float64_ngt_unordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation != float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x1b
|
||
|
BX_CPP_INLINE int float64_false_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
float64_compare(a, b, status);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// 0x1c
|
||
|
BX_CPP_INLINE int float64_neq_ordered_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare(a, b, status);
|
||
|
return (relation != float_relation_equal) && (relation != float_relation_unordered);
|
||
|
}
|
||
|
|
||
|
// 0x1d
|
||
|
BX_CPP_INLINE int float64_ge_ordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_greater) || (relation == float_relation_equal);
|
||
|
}
|
||
|
|
||
|
// 0x1e
|
||
|
BX_CPP_INLINE int float64_gt_ordered_quiet(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
int relation = float64_compare_quiet(a, b, status);
|
||
|
return (relation == float_relation_greater);
|
||
|
}
|
||
|
|
||
|
// 0x1f
|
||
|
BX_CPP_INLINE int float64_true_signalling(float64 a, float64 b, float_status_t &status)
|
||
|
{
|
||
|
float64_compare(a, b, status);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
#endif
|