--- a/QuadFloat.st Mon Jun 10 23:14:41 2019 +0200
+++ b/QuadFloat.st Mon Jun 10 23:54:36 2019 +0200
@@ -2154,6 +2154,26 @@
*zPtr = f128_rem( *aPtr, *bPtr );
}
+static inline float128_t
+f128_negate( float128_t a) {
+ struct uint128 sigA;
+ uint_fast64_t uiA64, uiA0;
+ union ui128_f128 uA;
+
+ uA.f = a;
+ uiA64 = uA.ui.v64;
+ uiA0 = uA.ui.v0;
+ if (isNaNF128UI( uiA64, uiA0 )) return a;
+ uiA64 ^= 0x80000000;
+ return uA.f;
+}
+
+static inline void
+f128M_negate( const float128_t *aPtr, float128_t *zPtr )
+{
+ *zPtr = f128_negate( *aPtr );
+}
+
#endif // SUPPORT_QUADFLOAT
%}
@@ -2585,6 +2605,22 @@
^ ZeroDivide raiseRequestWith:thisContext.
].
^ aNumber remainderFromLongFloat:self
+!
+
+negated
+ "return the receiver negated"
+
+%{ /* NOCONTEXT */
+#ifdef SUPPORT_QUADFLOAT
+ OBJ newFloat;
+ float128_t result, myVal;
+
+ myVal = __quadFloatVal(self);
+ f128M_negate( &myVal, &result );
+ __qMKQFLOAT(newFloat, result);
+ RETURN ( newFloat );
+#endif
+%}.
! !
!QuadFloat methodsFor:'coercing & converting'!