|
@@ -180,3 +180,102 @@ Software IEC/IEEE double-precision operations.
|
|
|
-------------------------------------------------------------------------------
|
|
|
*/
|
|
|
float64 float64_round_to_int( struct roundingData *, float64 );
|
|
|
+float64 float64_add( struct roundingData *, float64, float64 );
|
|
|
+float64 float64_sub( struct roundingData *, float64, float64 );
|
|
|
+float64 float64_mul( struct roundingData *, float64, float64 );
|
|
|
+float64 float64_div( struct roundingData *, float64, float64 );
|
|
|
+float64 float64_rem( struct roundingData *, float64, float64 );
|
|
|
+float64 float64_sqrt( struct roundingData *, float64 );
|
|
|
+char float64_eq( float64, float64 );
|
|
|
+char float64_le( float64, float64 );
|
|
|
+char float64_lt( float64, float64 );
|
|
|
+char float64_eq_signaling( float64, float64 );
|
|
|
+char float64_le_quiet( float64, float64 );
|
|
|
+char float64_lt_quiet( float64, float64 );
|
|
|
+char float64_is_signaling_nan( float64 );
|
|
|
+
|
|
|
+#ifdef FLOATX80
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Software IEC/IEEE extended double-precision conversion routines.
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+*/
|
|
|
+signed int floatx80_to_int32( struct roundingData *, floatx80 );
|
|
|
+signed int floatx80_to_int32_round_to_zero( floatx80 );
|
|
|
+float32 floatx80_to_float32( struct roundingData *, floatx80 );
|
|
|
+float64 floatx80_to_float64( struct roundingData *, floatx80 );
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Software IEC/IEEE extended double-precision operations.
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+*/
|
|
|
+floatx80 floatx80_round_to_int( struct roundingData *, floatx80 );
|
|
|
+floatx80 floatx80_add( struct roundingData *, floatx80, floatx80 );
|
|
|
+floatx80 floatx80_sub( struct roundingData *, floatx80, floatx80 );
|
|
|
+floatx80 floatx80_mul( struct roundingData *, floatx80, floatx80 );
|
|
|
+floatx80 floatx80_div( struct roundingData *, floatx80, floatx80 );
|
|
|
+floatx80 floatx80_rem( struct roundingData *, floatx80, floatx80 );
|
|
|
+floatx80 floatx80_sqrt( struct roundingData *, floatx80 );
|
|
|
+char floatx80_eq( floatx80, floatx80 );
|
|
|
+char floatx80_le( floatx80, floatx80 );
|
|
|
+char floatx80_lt( floatx80, floatx80 );
|
|
|
+char floatx80_eq_signaling( floatx80, floatx80 );
|
|
|
+char floatx80_le_quiet( floatx80, floatx80 );
|
|
|
+char floatx80_lt_quiet( floatx80, floatx80 );
|
|
|
+char floatx80_is_signaling_nan( floatx80 );
|
|
|
+
|
|
|
+extern flag floatx80_is_nan(floatx80);
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+static inline flag extractFloat32Sign(float32 a)
|
|
|
+{
|
|
|
+ return a >> 31;
|
|
|
+}
|
|
|
+
|
|
|
+static inline flag float32_eq_nocheck(float32 a, float32 b)
|
|
|
+{
|
|
|
+ return (a == b) || ((bits32) ((a | b) << 1) == 0);
|
|
|
+}
|
|
|
+
|
|
|
+static inline flag float32_lt_nocheck(float32 a, float32 b)
|
|
|
+{
|
|
|
+ flag aSign, bSign;
|
|
|
+
|
|
|
+ aSign = extractFloat32Sign(a);
|
|
|
+ bSign = extractFloat32Sign(b);
|
|
|
+ if (aSign != bSign)
|
|
|
+ return aSign && ((bits32) ((a | b) << 1) != 0);
|
|
|
+ return (a != b) && (aSign ^ (a < b));
|
|
|
+}
|
|
|
+
|
|
|
+static inline flag extractFloat64Sign(float64 a)
|
|
|
+{
|
|
|
+ return a >> 63;
|
|
|
+}
|
|
|
+
|
|
|
+static inline flag float64_eq_nocheck(float64 a, float64 b)
|
|
|
+{
|
|
|
+ return (a == b) || ((bits64) ((a | b) << 1) == 0);
|
|
|
+}
|
|
|
+
|
|
|
+static inline flag float64_lt_nocheck(float64 a, float64 b)
|
|
|
+{
|
|
|
+ flag aSign, bSign;
|
|
|
+
|
|
|
+ aSign = extractFloat64Sign(a);
|
|
|
+ bSign = extractFloat64Sign(b);
|
|
|
+ if (aSign != bSign)
|
|
|
+ return aSign && ((bits64) ((a | b) << 1) != 0);
|
|
|
+ return (a != b) && (aSign ^ (a < b));
|
|
|
+}
|
|
|
+
|
|
|
+extern flag float32_is_nan( float32 a );
|
|
|
+extern flag float64_is_nan( float64 a );
|
|
|
+
|
|
|
+extern int32 float64_to_uint32( struct roundingData *roundData, float64 a );
|
|
|
+extern int32 float64_to_uint32_round_to_zero( float64 a );
|
|
|
+
|
|
|
+#endif
|