*** empty log message ***
authorClaus Gittinger <cg@exept.de>
Mon, 10 Jun 2019 23:54:36 +0200
changeset 5021 073ff185359b
parent 5020 9d9c46a3c1b1
child 5022 54763fb429b9
*** empty log message ***
QuadFloat.st
--- 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'!